ADT 1 a add Taillist 1 a a
- Slides: 47
리스트 ADT 사용예 #1 a add. Tail(list 1, a) a b add. Tail(list 1, b) a d b c a d c add(list 1, 1, d) delete(list 1, 2) C로 쉽게 풀어쓴 자료구조 © 생능출판사 2005 a b c add(list 1, 2, c) a e c replace(list 1, 1, e)
Array. List. Type의 삭제 연산 삭제 위치를 검사한다. 2. 삭제위치부터 맨끝까지의 자료를 한칸씩 앞으로 옮긴다. 1. position length-1 0 1 2 3 4 A B C D E // position: 삭제하고자 하는 위치 // 반환값: 삭제되는 자료 element delete(Array. List. Type *L, int position) { int i; element item; if( position < 0 || position >= L->length ) error("위치 오류"); item = L->list[position]; for(i=position; i<(L->length-1); i++) L->list[i] = L->list[i+1]; L->length--; return item; } C로 쉽게 풀어쓴 자료구조 © 생능출판사 2005 C A B D E E 5
단순 연결 리스트 하나의 링크 필드를 이용하여 연결 l 마지막 노드의 링크값은 NULL l 헤드포인터 l 10 NULL 30 20 NULL 40 NULL 50 NULL 삽입연산 before 10 after 30 20 new C로 쉽게 풀어쓴 자료구조 before after 10 30 20 new © 생능출판사 2005 insert_node(L, before, new) if L = NULL then L←new else new. link←before. link←new
단순연결리스트(삭제연산) before 10 removed 20 after remove_node(L, before, removed) 30 if L ≠ NULL then before. link←removed. link destroy(removed) before 10 C로 쉽게 풀어쓴 자료구조 removed 20 after 30 © 생능출판사 2005
단순 연결 리스트의 구현 데이터 필드: 구조체로 정의 l 링크 필드: 포인터 사용 l typedef int element; typedef struct List. Node { element data; struct List. Node *link; } List. Node; l 노드의 생성: 동적 메모리 생성 라이브러리 malloc 함수이용 List. Node *p 1; p 1 = (List. Node *)malloc(sizeof(List. Node)); p 1 C로 쉽게 풀어쓴 자료구조 © 생능출판사 2005
삽입연산의 코드 // phead: 리스트의 헤드 포인터의 포인터 // p : 선행 노드 // new_node : 삽입될 노드 void insert_node(List. Node **phead, List. Node *p, List. Node *new_node) { if( *phead == NULL ){ // 공백리스트인 경우 new_node->link = NULL; *phead = new_node; } else if( p == NULL ){ // p가 NULL이면 첫번째 노드로 삽입 new_node->link = *phead; *phead = new_node; } else { // p 다음에 삽입 new_node->link = p->link; p->link = new_node; } } C로 쉽게 풀어쓴 자료구조 © 생능출판사 2005
삭제 연산 코드 // phead : 헤드 포인터에 대한 포인터 // p: 삭제될 노드의 선행 노드 // removed: 삭제될 노드 void remove_node(List. Node **phead, List. Node *p, List. Node *removed) { if( p == NULL ) *phead = (*phead)->link; else p->link = removed->link; free(removed); } C로 쉽게 풀어쓴 자료구조 © 생능출판사 2005
방문 연산 코드 방문 연산: 리스트 상의 노드를 순차적으로 방문 반복과 순환기법을 모두 사용가능 반복버젼 l l l void display(List. Node *head) { List. Node *p=head; while( p != NULL ){ printf("%d->", p->data); p = p->link; } printf("n"); } l 순환버젼 void display_recur(List. Node *head) { List. Node *p=head; if( p != NULL ){ printf("%d->", p->data); display_recur(p->link); } } C로 쉽게 풀어쓴 자료구조 © 생능출판사 2005
합병 연산 코드 l 합병 연산: 2개의 리스트를 합하는 연산 head 1 NULL head 2 NULL List. Node *concat(List. Node *head 1, List. Node *head 2) { List. Node *p; if( head 1 == NULL ) return head 2; else if( head 2 == NULL ) return head 1; else { p = head 1; while( p->link != NULL ) p = p->link; p->link = head 2; return head 1; } } C로 쉽게 풀어쓴 자료구조 © 생능출판사 2005
리스트의 처음에 삽입 (2) A B D NULL C NULL … (1) head E node // phead: 리스트의 헤드 포인터의 포인터 // p : 선행 노드 // node : 삽입될 노드 void insert_first(List. Node **phead, List. Node *node) { if( *phead == NULL ){ *phead = node; node->link = node; } else { node->link = (*phead)->link; (*phead)->link = node; } } C로 쉽게 풀어쓴 자료구조 © 생능출판사 2005
리스트의 끝에 삽입 (2) A CNULL B … DNULL (1) (3) E head node // phead: 리스트의 헤드 포인터의 포인터 // p : 선행 노드 // node : 삽입될 노드 void insert_last(List. Node **phead, List. Node *node) { if( *phead == NULL ){ *phead = node; node->link = node; } else { node->link = (*phead)->link; (*phead)->link = node; *phead = node; } } C로 쉽게 풀어쓴 자료구조 © 생능출판사 2005
삽입연산 before (4) (1) (2) (3) new_node // 노드 new_node를 노드 before의 오른쪽에 삽입한다. void dinsert_node(Dlist. Node *before, Dlist. Node *new_node) { new_node->llink = before; new_node->rlink = before->rlink; before->rlink->llink = new_node; before->rlink = new_node; } C로 쉽게 풀어쓴 자료구조 © 생능출판사 2005
삭제연산 before (4) (1) (2) (3) new_node // 노드 removed를 삭제한다. void dremove_node(Dlist. Node *phead_node, Dlist. Node *removed) { if( removed == phead_node ) return; removed->llink->rlink = removed->rlink; removed->rlink->llink = removed->llink; free(removed); } C로 쉽게 풀어쓴 자료구조 © 생능출판사 2005
다항식의 덧셈 A 3 12 2 8 1 0 NULL p B 8 12 -3 10 10 6 NULL q C 11 12 r A 3 12 2 8 1 0 NULL B 8 12 p -3 10 10 6 NULL C 11 12 q -3 10 r C로 쉽게 풀어쓴 자료구조 © 생능출판사 2005
is_empty, get_length 연산의 구현 int is_empty(List. Type *list) { if( list->head == NULL ) return 1; else return 0; } // 리스트의 항목의 개수를 반환한다. int get_length(List. Type *list) { return list->length; } C로 쉽게 풀어쓴 자료구조 © 생능출판사 2005
add 연산의 구현 l l 새로운 데이터를 임의의 위치에 삽입 항목의 위치를 노드 포인터로 변환해주는 함수 get_node_at 필요 // 리스트안에서 pos 위치의 노드를 반환한다. List. Node *get_node_at(List. Type *list, int pos) { int i; List. Node *tmp_node = list->head; if( pos < 0 ) return NULL; for (i=0; i<pos; i++) tmp_node = tmp_node->link; return tmp_node; } // 주어진 위치에 데이터를 삽입한다. void add(List. Type *list, int position, element data) { List. Node *p; if ((position >= 0) && (position <= list->length)){ List. Node*node= (List. Node *)malloc(sizeof(List. Node)); if( node == NULL ) error("메모리 할당에러"); node->data = data; p = get_node_at(list, position-1); insert_node(&(list->head), p, node); list->length++; } } © 생능출판사 2005 C로 쉽게 풀어쓴 자료구조
- Taillist
- Taillist
- Click to add titleclick to add subtitle
- Click to add titleclick to add subtitle
- Click to add titleclick to add subtitle
- Slidetodoc
- Graph adt
- Adt stands for c++
- Addition of polynomials using linked list
- Queue adt
- Adt missouri
- Queue adt
- "adt" lawsuit or barber or hack or sued
- Level 2 questions
- Adt heap
- Adt formula
- Adt partial set
- Abstract data type graph
- Dynamic equivalence problem
- Adt bag
- Data abstraction and problem solving with java
- Itrxxx
- Adt specification
- List adt
- (p^ q)^( p^q) is a
- Array adt
- Stack adt
- Adt graph
- Adt operator meaning
- Adt map
- Sdsu pathways
- Tree adt
- Adt of queue
- Helpinsta
- Adt in java
- Gadts haskell
- Cimss adt
- Abstract data type
- Binary tree adt
- Graph adt
- Lbs
- Adt stack
- Inorder traversal
- Contract abstraction meaning
- Adt meaning
- Dictionary adt
- Array adt
- Adt pecahan