110 likes | 236 Views
C 프로그래밍 ( STS2008 ) C Programming. 15. Lists. Linked list structure. linked list 는 다음 정보 ( 노드 ) 를 가리키는 포인터를 가지고 있는 data 구성방식의 한 형태이다 . 포인터로 마치 체인과 같이 연결되어 있는 리스트라고 해서 linked list 라 한다 .
E N D
C 프로그래밍 (STS2008)C Programming 15. Lists
Linked list structure • linked list 는 다음 정보(노드)를 가리키는 포인터를 가지고 있는 data 구성방식의 한 형태이다. 포인터로 마치 체인과 같이 연결되어 있는 리스트라고 해서 linked list라 한다. • linked list의 노드는 data 부분과 link 부분의 두 parts로 구성된다. 또 노드의추가와 삭제가 자유로워 메모리를 효율적으로 활용할 수 있다. 고로 데이터의 추가 삭제가 잦고 크기가 정해지지 않은 경우 유용하다. Node <Linked list의 연결구조> DATA LINK DATA LINK
Linked list structure • 리스트의 첫 번째 노드를 가리키는 포인터를 헤드 포인터라고 한다. Linked list의 노드는 다음 노드를 가리킨다. • 마지막 노드의 포인터는 NULL 값을 가진다. <Linked list의 시작과 끝> HEAD DATA DATA DATA LINK LINK LINK NULL
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;
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
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; }
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
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
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
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
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