05장 연결리스트 3 – 원형 연결리스트
- 원형 연결 리스트(Circular Linked List) 구현 #1 : S005_CircularLinkedList.c
123456789101112#include <stdio.h>#include <stdlib.h>typedef struct _node{int data;struct _node *next;} Node;Node *tail = NULL;void main(int argc, char* argv[]){} - 원형 연결 리스트(Circular Linked List) 구현 #2
123456789101112131415161718192021222324void Free(){if(tail == NULL){return;}else if(tail->next == tail){ //노드가 1개뿐이라면free(tail);tail = NULL;}else{Node *cur = tail->next;Node *curNext = cur->next;do{free(cur);cur = curNext;curNext = curNext->next;}while(cur != tail);free(tail);tail = NULL;}}void main(int argc, char* argv[]){Free();} - 원형 연결 리스트(Circular Linked List) 구현 #3
12345678910111213141516171819202122void Insert(int data){Node *cur;Node *newNode = (Node *)malloc(sizeof(Node));newNode->data = data;newNode->next = NULL;if(tail == NULL){tail = newNode;newNode->next = newNode;}else{cur = tail;newNode->next = cur->next;tail->next = newNode;}}void main(int argc, char* argv[]){Insert(15);Free();} - 원형 연결 리스트(Circular Linked List) 구현 #4
12345678910111213141516void PrintList(){Node *cur = tail;if(tail != NULL){do{printf("%d ", cur->data);cur = cur->next;}while(cur != tail);}printf("\n\n");}void main(int argc, char* argv[]){Insert(15); PrintList();Insert(12); PrintList();Free();} - 원형 연결 리스트(Circular Linked List) 구현 #5
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354void RemoveData(int data){int n = 0;if(tail == NULL){printf("리스트가 비어있어 삭제할 수 없습니다.\n");return;}else if(tail->next == tail){ //노드가 1개뿐이라면free(tail);tail = NULL;printf("%d번째 위치에서 %d를삭제했습니다.\n", n, data);}else{Node *cur = tail;Node *curNext = tail->next;do{n++;if(curNext->data == data){cur->next = curNext->next;free(curNext);printf("%d번째 위치에서 %d를삭제했습니다.\n", n, data);return;}cur = cur->next;curNext = curNext->next;}while(curNext != tail);if(curNext->data == data){ //삭제할 노드가 tail이 가리키는 노드라면cur->next = curNext->next;free(curNext);tail = cur;printf("%d번째 위치에서 %d를삭제했습니다.\n", 0, data);}else{printf("리스트에 %d가 존재하지 않습니다.\n", data);}}}void main(int argc, char* argv[]){Insert(15); PrintList();Insert(12); PrintList();Insert(36); PrintList();Insert(22); PrintList();Insert(32); PrintList();RemoveData(15); PrintList();RemoveData(36); PrintList();RemoveData(12); PrintList();RemoveData(20); PrintList();RemoveData(32); PrintList();RemoveData(22); PrintList();Free();} - 원형 연결 리스트(Circular Linked List) 완성 버전
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114#include <stdio.h>#include <stdlib.h>typedef struct _node{int data;struct _node *next;} Node;Node *tail = NULL;void Insert(int data){Node *cur;Node *newNode = (Node *)malloc(sizeof(Node));newNode->data = data;newNode->next = NULL;if(tail == NULL){tail = newNode;newNode->next = newNode;}else{cur = tail;newNode->next = cur->next;tail->next = newNode;}}void RemoveData(int data){int n = 0;if(tail == NULL){printf("리스트가 비어있어 삭제할 수 없습니다.\n");return;}else if(tail->next == tail){ //노드가 1개뿐이라면free(tail);tail = NULL;printf("%d번째 위치에서 %d를삭제했습니다.\n", n, data);}else{Node *cur = tail;Node *curNext = tail->next;do{n++;if(curNext->data == data){cur->next = curNext->next;free(curNext);printf("%d번째 위치에서 %d를삭제했습니다.\n", n, data);return;}cur = cur->next;curNext = curNext->next;}while(curNext != tail);if(curNext->data == data){ //삭제할 노드가 tail이 가리키는 노드라면cur->next = curNext->next;free(curNext);tail = cur;printf("%d번째 위치에서 %d를삭제했습니다.\n", 0, data);}else{printf("리스트에 %d가 존재하지 않습니다.\n", data);}}}void PrintList(){Node *cur = tail;if(tail != NULL){do{printf("%d ", cur->data);cur = cur->next;}while(cur != tail);}printf("\n\n");}void Free(){if(tail == NULL){return;}else if(tail->next == tail){ //노드가 1개뿐이라면free(tail);tail = NULL;}else{Node *cur = tail->next;Node *curNext = cur->next;do{free(cur);cur = curNext;curNext = curNext->next;}while(cur != tail);free(tail);tail = NULL;}}void main(int argc, char* argv[]){Insert(15); PrintList();Insert(12); PrintList();Insert(36); PrintList();Insert(22); PrintList();Insert(32); PrintList();RemoveData(15); PrintList();RemoveData(36); PrintList();RemoveData(12); PrintList();RemoveData(20); PrintList();RemoveData(32); PrintList();RemoveData(22); PrintList();Free();}