Presentation is loading. Please wait.

Presentation is loading. Please wait.

자료구조 천주희 군산대학교 통계컴퓨터과학과 정보과학기술 연구실 2012.04.06.

Similar presentations


Presentation on theme: "자료구조 천주희 군산대학교 통계컴퓨터과학과 정보과학기술 연구실 2012.04.06."— Presentation transcript:

1 자료구조 천주희 군산대학교 통계컴퓨터과학과 정보과학기술 연구실

2 목차  리스트 추상 데이터 타입  배열로 구현된 리스트  연결 리스트  연결리스트 소개  단순 연결 리스트  원형 연결 리스트  이중 연결 리스트 2 IST (Information Sciences & Technology) Laboratory

3 리스트 추상 데이터 타입 (1/ 3)  리스트  자료를 정리하는 방법으로 항목들은 순서나 위치를 가짐 3 IST (Information Sciences & Technology) Laboratory L = (item0, item1, item2, …,item (n-1) → 한 주의 요일 : ( 일요일, 월요일,…, 금요일, 토요일 ) → 한글 자음의 모임 : ( ㄱ, ㄴ, ㄷ,…, ㅎ )

4 리스트 추상 데이터 타입 (2/ 3)  리스트 ADT 4 IST (Information Sciences & Technology) Laboratory 객체 : n 개의 element 형으로 구성된 순서 있는 컬렉션 연산 :add_last(list,item) → 맨 끝에 요소 추가 add_first(list,item) → 맨 앞에 요소 추가 add(list,pos,item) →pos 위치에 요소 추가 delete(list,pos) →pos 의 위치 요소를 item 로 제거 replace(list,pos,item) →pos 의 위치 요소를 item 로 대 체 is_in_list(list,item) →item 이 리스트 안에 있는지 여부 get_entry(list,pos) →pos 위치 요소 반환 get_length(list) → 리스트 길이 구함 is_empty(list) → 리스트가 비었는지 검사 is_full(list) → 리스트가 꽉 찼는지 검사 display(list) → 리스트의 모든 요소 표시

5 리스트 추상 데이터 타입 (3/ 3)  리스트 ADT 5 IST (Information Sciences & Technology) Laboratory Add_last(list1,a) a Add_last(list1,b) abab add(list1,1,d) adbcadbc delete(list1,2) adcadc add(list1,2,c) abcabc replace(list1,1,e) aecaec

6 배열로 구현된 리스트 (1/4)  배열  구현 간단  배열의 크기 고정 ( 저장 공간 낭비 및 부족 )  삽입. 삭제 시 오버헤드 발생 6 IST (Information Sciences & Technology) Laboratory ABCDE ABCDE N ABDE C

7 배열로 구현된 리스트 (2/3)  배열  삽입 함수 7 IST (Information Sciences & Technology) Laboratory // position: 삽입하고자 하는 위치 // item: 삽입하고자 하는 자료 void add(ArrayListType *L, int position, element ite m) { if( !is_full(L) && (position >= 0) && (position length) ){ int i; for(i=(L->length-1); i>=position;i--) L->list[i+1] = L->list[i]; L->list[position] = item; L->length++; } ABCDE ABC D E ABC DE ABNCDE Position length-1 ABCDE N typedef int element; typedef struct { element list[MAZ_LOST_SIZE]; int length; } ArrayListType;

8 배열로 구현된 리스트 (3/3)  배열  삭제 함수 8 IST (Information Sciences & Technology) Laboratory // position: 삭제하고자 하는 위치 // 반환값 : 삭제되는 자료 element delete(ArrayListType *L, int position) { int i; element item; if( position = L->leng th ) error(" 위치 오류 "); item = L->list[position]; for(i=position; i length-1);i++) L->list[i] = L->list[i+1]; L->length--; return item; } ABCDE ABDE ABD E position length-1 ABDE C

9 연결 리스트 (1/3)  연결 리스트  물리적으로 흩어져 있는 자료들을 서로 연결하여 하나로 묶는 방법  구현 복잡  삽입, 삭제 효율적  크기 제한 x 9 IST (Information Sciences & Technology) Laboratory A B C D E A B C D E N A B C D E

10 연결 리스트 (2/3)  연결 리스트 구조  노드 = 데이터 필드 + 링크 필드  헤드 포인터 : 연결 리스트 첫 번째 노드를 가리키는 변수  노드의 동적 생성 10 IST (Information Sciences & Technology) Laboratory datalink NULL 헤드 포인터 NULL 헤드 포인터 동적 생성 운영체제 요구

11 연결 리스트 (3/3)  연결 리스트 종류 11 IST (Information Sciences & Technology) Laboratory 이중 연결 리스트 헤드 포인터 단순 연결 리스트 헤드 포인터 원형 연결 리스트 헤드 포인터 NULL

12 단순 연결 리스트 (1/10)  단순 연결 리스트  삽입 알고리즘 12 IST (Information Sciences & Technology) Laboratory 헤드포인 터 NULL 30 NULL 50 NULL beforeafter new beforeafter new insert_node(L, before, new) if L = NULL then L←new else new.link←before.link before.link←new

13 단순 연결 리스트 (2/10)  단순 연결 리스트 구현  노드 동적 생성 : 동적 메모리 할당 13 IST (Information Sciences & Technology) Laboratory typedef int element; typedef struct ListNode { element data; struct ListNode *link; } ListNode; datalink ListNode *p1; p1 = (ListNode *)malloc(sizeof(ListNode)); p1 datalink

14 단순 연결 리스트 (3/10)  단순 연결 리스트  단순 연결 리스트가 만들어지는 과정 14 IST (Information Sciences & Technology) Laboratory p1 datalink p1 10NULL ListNode *p2; p2 = (ListNode *)malloc(sizeof(ListNode)); p2->data = 20; p2->link = NULL; p1->link = p2; p1->data = 10; p1->link = NULL; ListNode *p1; p1 = (ListNode *)malloc(sizeof(ListNode)); p NULL free(p1) free(p2)

15 단순 연결 리스트 (4/10)  단순 연결 리스트  삽입 연산 Head 가 NULL 인 경우 삽입하려는 노드가 첫 번째 노드가 됨 (head 값만 변경하면 됨 ) P 가 NULL 인 경우 새로운 노드를 리스트 맨 앞에 삽입 Head 와 p 가 NULL 이 아닌 경우 new_node 의 link 에 p->link 값을 복사한 뒤, p->link 가 new_node 를 가리키도록 함 15 IST (Information Sciences & Technology) Laboratory head new_node NULL head new_node NULL new_node NULL p (1) (2) head Phead : 헤드 포인터 head 에 대한 포인터 p : 삽입될 위치의 선행노드를 가리 키는 포인터 new_node : 새로운 노드를 가리키는 포인터

16 단순 연결 리스트 (5/10)  단순 연걸 리스트  삽입 연산 16 IST (Information Sciences & Technology) Laboratory void insert_node(ListNode **phead, ListNode *p, ListNode *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; } Phead : 리스트의 헤드 포인터 의 포인터 p : 선행 노드 new_node : 삽입될 노드

17 단순 연결 리스트 (6/10)  단순 연걸 리스트  삭제 연산 P 가 NULL 인 경우 연결 리스트의 첫 번째 노드 삭제 헤드 포인터를 변경하고 remove 노드가 차지하고 있는 공간을 시스템에 반환 P 가 NULL 이 아닌 경우 p 의 링크가 remove 다음 노드를 가리키도록 변경 17 IST (Information Sciences & Technology) Laboratory list NULL removed list NULL p removed

18 단순 연결 리스트 (7/10)  단순 연결 리스트  삭제 연산 18 IST (Information Sciences & Technology) Laboratory void remove_node(ListNode **phead, ListNode *p, ListNode *removed) { if( p == NULL ) *phead = (*phead)->link; else p->link = removed->link; free(removed); } Phead : 헤드 포인터에 대한 포인터 p : 삭제될 노드의 선행 노드 removed : 삭제될 노드

19 단순 연결 리스트 (7/10)  단순 연결 리스트  방문 연산 리스트 상의 노드를 순차적으로 방문 반복과 순환기법을 모두 사용가능 19 IST (Information Sciences & Technology) Laboratory void display(ListNode *head) { ListNode *p=head; while( p != NULL ){ printf("%d->", p->data); p = p->link; } printf("\n"); } void display_recur(ListNode *head) { ListNode *p=head; if( p != NULL ){ printf("%d->", p->data ); display_recur(p->link) ; }

20 단순 연결 리스트 (8/10)  단순 연결 리스트  탐색 연산 특정한 데이터 값을 갖는 노드를 찾는 연산 20 IST (Information Sciences & Technology) Laboratory ListNode *search(ListNode *head, int x) { ListNode *p; p = head; while( p != NULL ){ if( p->data == x ) return p; // 탐색 성공 p = p->link; } return p; // 탐색 실패일 경우 NULL 반환 } head NULL p

21 단순 연결 리스트 (9/10)  단순 연결 리스트  합병 연산 두개의 리스트 L1 과 L2 를 하나로 만드는 연산 head1 이나 head2 가 NULL 인 경우를 반드시 처리해주어야함 21 IST (Information Sciences & Technology) Laboratory head1 NULL head2 NULL ListNode *concat(ListNode *head1, ListNode *head2) { ListNode *p; if( head1 == NULL ) return head2; else if( head2 == NULL ) return head1; else { p = head1; while( p->link != NULL ) p = p->link; p->link = head2; return head1; }

22 단순 연결 리스트 (10/10)  단순 연결 리스트  역순 연산 리스트를 역순으로 만드는 연산 22 IST (Information Sciences & Technology) Laboratory head NULL r q p ListNode *reverse(ListNode *head) { // 순회 포인터로 p, q, r 을 사용 ListNode *p, *q, *r; p = head; // p 는 역순으로 만들 리스트 q = NULL; // q 는 역순으로 만들 노드 while (p != NULL){ r = q; // r 은 역순으로 된 리스트. r 은 q, q 는 p 를 차례로 따라감 q = p; p = p->link; q->link =r; // q 의 링크 방향을 바꿈 } return q; // q 는 역순으로 된 리스트의 헤드 포인터 }

23 원형 연결 리스트 (1/2)  원형 연결 리스트  마지막 노드의 링크가 첫 번째 노드를 가리키는 리스트  노드의 삽입과 삭제가 단순 연결 리스트보다 용이  삽입 함수 23 IST (Information Sciences & Technology) Laboratory head NULL … head A B NULL C D … E node (1) (2) void insert_first(ListNode **phead,ListNode *node) { if( *phead == NULL ){ *phead = node; node->link = node; } else { node->link = (*phead)->link; (*phead)->link = node; } Phead : 리스트의 헤드 포인터의 포인터 p : 선행 노드 node : 삽입될 노드

24 원형 연결 리스트 (2/2)  원형 연결 리스트  삽입 함수 24 IST (Information Sciences & Technology) Laboratory head A B NULL C D … E node (2) (1) (3) void insert_last(ListNode **phead, ListNode *node) { if( *phead == NULL ){ *phead = node; node->link = node; } else { node->link = (*phead)->link; (*phead)->link = node; *phead = node; }

25 이중 연결 리스트 (1/3)  이중 연결 리스트  하나의 노드가 선행 노드와 후속 노드에 대한 두 개의 링크를 가지는 리스트  공간을 많이 차지하고 고드가 복잡해짐 25 IST (Information Sciences & Technology) Laboratory 헤드노드 실제 이중 연결 리스트 헤드노드 + 이중 연결 리스트 + 원형 연결 리스트

26 이중 연결 리스트 (2/3)  헤드 노드  데이터를 가지지 않고 단지 삽입, 삭제 코드를 간단하게 할 목적으로 만들어진 노드  헤드 포인터와의 구별  공백상태에서 헤드 노드만 존재  이중 연결 리스트 노드 구조 26 IST (Information Sciences & Technology) Laboratory 헤드노드 llinkdatarlink typedef int element; typedef struct DlistNode { element data; struct DlistNode *llink; struct DlistNode *rlink; } DlistNode;

27 이중 연결 리스트 (3/3)  이중 연결 리스트  삽입 연산  삭제 연산 27 IST (Information Sciences & Technology) Laboratory (1)(2)(3)(4) before new_node // 노드 new_node 를 노드 before 의 오른쪽에 삽입한 다. void dinsert_node(DlistNode *before, DlistNode *new _node) { new_node->llink = before; new_node->rlink = before->rlink; before->rlink->llink = new_node; before->rlink = new_node; } (1)(2)(3)(4) before new_node // 노드 removed 를 삭제한다. void dremove_node(DlistNode *phead_node, DlistNod e *removed) { if( removed == phead_node ) return; removed->llink->rlink = removed->rlink; removed->rlink->llink = removed->llink; free(removed); }

28 군산대학교 정보통계학과 정보과학기술 연구실 천주희 군산대학교 정보통계학과 정보과학기술 연구실


Download ppt "자료구조 천주희 군산대학교 통계컴퓨터과학과 정보과학기술 연구실 2012.04.06."

Similar presentations


Ads by Google