1 / 11

C 프로그래밍 ( STS2008 ) C Programming

C 프로그래밍 ( STS2008 ) C Programming. 15. Lists. Linked list structure. linked list 는 다음 정보 ( 노드 ) 를 가리키는 포인터를 가지고 있는 data 구성방식의 한 형태이다 . 포인터로 마치 체인과 같이 연결되어 있는 리스트라고 해서 linked list 라 한다 .

patty
Download Presentation

C 프로그래밍 ( STS2008 ) C Programming

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. C 프로그래밍 (STS2008)C Programming 15. Lists

  2. Linked list structure • linked list 는 다음 정보(노드)를 가리키는 포인터를 가지고 있는 data 구성방식의 한 형태이다. 포인터로 마치 체인과 같이 연결되어 있는 리스트라고 해서 linked list라 한다. • linked list의 노드는 data 부분과 link 부분의 두 parts로 구성된다. 또 노드의추가와 삭제가 자유로워 메모리를 효율적으로 활용할 수 있다. 고로 데이터의 추가 삭제가 잦고 크기가 정해지지 않은 경우 유용하다. Node <Linked list의 연결구조> DATA LINK DATA LINK

  3. Linked list structure • 리스트의 첫 번째 노드를 가리키는 포인터를 헤드 포인터라고 한다. Linked list의 노드는 다음 노드를 가리킨다. • 마지막 노드의 포인터는 NULL 값을 가진다. <Linked list의 시작과 끝> HEAD DATA DATA DATA LINK LINK LINK NULL

  4. Linked list structure • Linked list를 C언어로 표현하면 다음과 같다. NODE • 만약 data가 integer 하나인 linked list를 만든다면 노드와헤드 포인터는 다음과 같이 표현된다. typedefstruct _NODE{ DATATYPE DATA; struct _NODE *LINK; }NODE; ? DATA LINK typedefstruct _NODE{ int Data; struct _NODE *LINK; }NODE; NODE *head;

  5. Linked list structure • 위 노드를 가지고 정수 3, 4 순서대로 저장하는 연결 리스트를 동적으로 생성해보자. typedefstruct _NODE{ int Data; struct _NODE *LINK; }NODE; NODE *head; 3 4 LINK LINK head = malloc(sizeof(NODE)); head->data = 3; head->link = malloc(sizeof(NODE)); head->link->data = 4; head->link->link = NULL; HEAD NULL

  6. Traversing linked lists • Linked list를 탐색하는 방법 • 배열의 경우 index가 존재해서 이를 이용하여 데이터를 탐색한다. • Linked list의 경우 헤드에서 부터 순차적으로 link를 따라가 탐색한다. • 위 예제에서 data가 22인 node를 찾고 싶다면 아래와 같이 동작한다. HEAD … 3 LINK 11 LINK 22 LINK NULL ptr NODE *ptr; ptr= head; while(ptr != NULL) { if(ptr->data == 22) break; ptr = ptr->LINK; }

  7. Insert a Node • 빈 list에 node 삽입하기 • 비어있는 list에서 head는 NULL을 가리키고 있다. • 새로운 노드를 생성한 후, head가 이 노드를 가리키게 만든다. <생성 전> <새로운 노드 생성> <head가 새로운 노드를 가리키게 변경> HEAD NULL 7 7 LINK LINK pNew NULL NODE *pNew; pNew = malloc(sizeof(NODE)); pNew->LINK = NULL; pNew->DATA = 7; head = pNew; HEAD NULL pNew

  8. Insert a Node • list의 처음에 node 삽입하기 • 이미존재하는 list는 유지한채 처음, 즉 head가 가리키는 노드를 새로 생성하는 노드로 교체하는 방법이다. • 새로운 노드는 이전의 첫 노드를 가리키도록 한다. <원래 list> <데이터가 1인 새로운 노드 생성> <head를 새로운 노드로 이동> NODE *pNew; pNew = malloc(sizeof(NODE)); pNew->LINK = head; pNew->DATA = 1; head = pNew; HEAD 3 LINK … NULL HEAD 3 LINK … NULL pNew 1 LINK HEAD 1 LINK 3 LINK … NULL

  9. Insert a Node • list의 중간에 node 삽입하기 • 특정 위치에 노드를 삽입하기 위해서는 현재 위치를 가리키는 노드(즉 바로 전 노드)를 알고 있어야 한다. 새로운 노드를 생성한 후 생성된 노드의 링크를 전 노드의 링크로 하고, 전 노드의 링크를 새로운 노드로 바꾼다. <원래 list> <이전 노드(3)을 기억하고 새로운 노드를 생성> <이전노드의link를 새로운 노드로 변경> NODE *pNew, *pPrev; pPrev = head; while(pPrev != NULL && pPrev->DATA != 3) pPrev = pPrev->LINK; pNew = malloc(sizeof(NODE)); pNew->LINK = pPrev->LINK; pNew->DATA = 7; pPrev->LINK = pNew; HEAD 3 LINK 11 LINK NULL HEAD 3 LINK 11 LINK NULL pPrev pNew 7 LINK HEAD 3 LINK 7 LINK 11 LINK NULL pPrev pNew

  10. Delete a Node • list의 처음 node 삭제하기 • 첫노드가 리스트로부터 삭제되면 헤더가 가리키는 노드가 변경되어야 한다. 헤더가 가리키는 노드는 첫 노드가 가리킨 노드, 즉 리스트에서 두 번째 노드가 된다. (만약 존재하지 않는 다면 자연히 NULL이 된다.) <원래list> <head가 가리키는 노드가 변경, 삭제될 노드는 따로 기억> <노드 삭제> HEAD 3 LINK 11 LINK … NULL ptr 3 LINK 11 LINK … NULL HEAD NODE *ptr; ptr = head; head = head->LINK; free(ptr); HEAD 11 LINK … NULL

  11. Delete a Node • 일반적인 list에서 node 삭제하기 • 삭제될 노드를 가리키는 노드, 즉 삭제될 노드의 이전 노드를 기억한다. • 이전 노드의LINK를 삭제될 노드의LINK로 대체한다. <원래list> <이전노드(3)의 LINK를 변경> <노드삭제> HEAD … 3 LINK 11 LINK … NULL NODE *pPrev, *pCur; pCur = pPrev = head; while(pPrev != NULL && pCur->LINK != NULL && pCur->DATA != 11) { pPrev = pCur; pCur = pCur->LINK; } pPrev->LINK = pCur->LINK; free(pCur); HEAD … 3 LINK pPrev 11 LINK … NULL pCur HEAD … 3 LINK … NULL pPrev

More Related