1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 | typedef enum {false,true} bool; typedef int Data; typedef struct _Node { Data item; struct _Node *next; } Node; typedef struct { Node *tail; // The tail pointer can be used as the head pointer instead!!! int len; } CircularList; void InsertInitItem(CircularList *plist, Data item) { Node *newnode = (Node *)malloc(sizeof(Node)); newnode->item = item; newnode->next = newnode; plist->tail = newnode; plist->len++; } void InsertFirst(CircularList *plist, Data item) { if (plist->len == 0) InsertInitItem(plist, item); else { Node *newnode = (Node *)malloc(sizeof(Node)); newnode->item = item; newnode->next = plist->tail->next; plist->tail->next = newnode; plist->len++; } } void InsertLast(CircularList *plist, Data item) { if (plist->len == 0) InsertInitItem(plist, item); else { Node *newnode = (Node *)malloc(sizeof(Node)); newnode->item = item; newnode->next = plist->tail->next; plist->tail->next = newnode; plist->tail = newnode; plist->len++; } } void InsertMiddle(CircularList *plist, int pos, Data item) { if (plist->len == 0) InsertInitItem(plist, item); else { Node *cur = plist->tail; // move (pos-1)th position // 0 - 1 - 2 - 3 - ... - n (tail) for (int i = 0; i < pos; i++) { cur = cur->next; } Node *newnode = (Node *)malloc(sizeof(Node)); newnode->item = item; newnode->next = cur->next; cur->next = newnode; plist->len++; } } void RemoveInitItem(CircularList *plist) { if (IsEmpty(plist)) exit(1); if (plist->len == 1) { free(plist->tail); plist->len--; plist->tail = NULL; } } void RemoveFirst(CircularList *plist) { if (plist->len == 1) RemoveInitItem(plist); else { Node *temp = plist->tail->next; plist->tail->next = temp->next; free(temp); plist->len--; } } void RemoveLast(CircularList *plist) { if (plist->len == 1) RemoveInitItem(plist); else { Node *cur, *temp; cur = plist->tail; for (int i = 0; i < plist->len; i++) { cur = cur->next; } temp = cur->next; cur->next = temp->next; free(temp); plist->tail = cur; plist->len--; } } void RemoveMiddle(CircularList *plist, int pos) { if (plist->len == 1) RemoveInitItem(plist); else { Node *cur, *temp; cur = plist->tail; for (int i = 0; i < pos; i++) { cur = cur->next; } temp = cur->next; cur->next = temp->next; free(temp); plist->len--; } } | cs |
'[자료구조론] - Data Structure > [Concept]' 카테고리의 다른 글
Dynamic Stack (Using Linked List) (0) | 2020.10.19 |
---|---|
DoubleLinkedList (0) | 2020.10.19 |
LinkedList Application (0) | 2020.10.13 |
List (0) | 2020.10.13 |
Queue 구현 (0) | 2020.10.06 |