본문 바로가기

[자료구조론] - Data Structure/[Concept]

CircularList

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,truebool;
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