1 #include <stdio.h>
2 #include <stdlib.h>
3
4 // 节点结构
5
6 struct LinkedList
7 {
8 // 节点
9 struct Node
10 {
11 int item = 0;
12 Node *prev;
13 Node *next;
14
15 // 得到一个新节点
16 static Node *get(Node *prev, int item, Node *next)
17 {
18 Node *newNode = (Node *)malloc(sizeof(Node));
19 newNode->item = item;
20 newNode->prev = prev;
21 newNode->next = next;
22 return newNode;
23 }
24 };
25
26 // 首节点
27 Node *first;
28 // 尾节点
29 Node *last;
30 // 节点个数
31 int size;
32 // LL分配内存空间
33 static LinkedList *initial()
34 {
35 LinkedList *l = (LinkedList *)malloc(sizeof(LinkedList));
36 l->first = NULL;
37 l->last = NULL;
38 l->size = 0;
39 return l;
40 }
41
42 // 返回指定元素索引处的(非空)节点
43 Node *node(int index)
44 {
45 if (index < (size >> 1))
46 {
47 Node *x = first;
48 for (int i = 0; i < index; i++)
49 x = x->next;
50 return x;
51 }
52 else
53 {
54 Node *x = last;
55 for (int i = size - 1; i > index; i--)
56 x = x->prev;
57 return x;
58 }
59 }
60
61 // 添加到链表第一个
62 void linkFirst(int e)
63 {
64 Node *f = first;
65 Node *newNode = Node::get(NULL, e, f);
66 first = newNode;
67 if (f == NULL)
68 last = newNode;
69 else
70 f->prev = newNode;
71 size++;
72 }
73
74 // 添加到链表最后一个
75 void linkLast(int e)
76 {
77 Node *l = last;
78 Node *newNode = Node::get(l, e, NULL);
79 last = newNode;
80 if (l == NULL)
81 first = newNode;
82 else
83 l->next = newNode;
84 size++;
85 }
86
87 // 取消非空节点x的链接
88 int unlink(Node *x)
89 {
90 int element = x->item;
91
92 // 指定节点的前节点
93 Node *prev = x->prev;
94 // 指定节点的后节点
95 Node *next = x->next;
96
97 // 指定节点的前节点为 空
98 if (prev == NULL)
99 // 指定节点的后节点 指向 首节点
100 first = next;
101 else
102 { //指定节点的前节点为 非空
103 // 指定节点的后节点 指向 指定节点的前节点的后节点
104 prev->next = next;
105 x->prev = NULL;
106 }
107
108 if (next == NULL)
109 last = prev;
110 else
111 {
112 next->prev = prev;
113 x->next = NULL;
114 }
115
116 free(x);
117 size--;
118 return element;
119 }
120
121 // 添加到链表第一个
122 void addFirst(int e)
123 {
124 linkFirst(e);
125 }
126
127 // 添加到链表最后一个
128 void addLast(int e)
129 {
130 linkLast(e);
131 }
132
133 // 添加节点
134 bool add(int e)
135 {
136 linkLast(e);
137 return true;
138 }
139
140 // 参数是否为现有元素的索引
141 bool isElementIndex(int index)
142 {
143 return index >= 0 && index < size;
144 }
145 void checkElementIndex(int index)
146 {
147 if (!isElementIndex(index))
148 throw;
149 }
150
151 // 删除列表中指定位置的元素
152 int remove(int index)
153 {
154 checkElementIndex(index);
155 return unlink(node(index));
156 }
157
158 void print()
159 {
160 Node *node = first;
161 while (node != NULL)
162 {
163 printf("item = %d\n", node->item);
164 node = node->next;
165 }
166
167 printf("列表中元素的个数 = %d\n", size);
168 }
169 };
170
171 int main()
172 {
173 LinkedList *l = LinkedList::initial();
174 l->add(233);
175 l->add(234);
176 l->add(235);
177 l->add(236);
178 l->print();
179
180 l->remove(2);
181 }