头文件
1 #ifndef _LINKLIST_H_
2 #define _LINKLIST_H_
3
4 #define SUCCESS 100
5 #define FAILURE 101
6
7 typedef int DataType;
8
9 struct node
10 {
11 DataType data; //数据域
12 struct node *next; //指针域
13 };
14 typedef struct node Node;
15 typedef Node *Link;
16
17 int InitLink(Link *l);
18 int EmptyLink(Link l);
19 int InsertLink(Link l, int p, DataType e);
20 int LinkLength(Link l);
21 int TraverseLink(Link l, void(*p)(DataType));
22 int GetElem(Link l, int p, DataType *e);
23 int LocateElem(Link l, DataType e, int(*p)(DataType, DataType));
24 int PriorElem(Link l, DataType e, int(*p)(DataType, DataType));
25 int NextElem(Link l, DataType e, int(*p)(DataType, DataType));
26 int ReverseLink(Link l);
27 int DeleteLink(Link l, int p, DataType *e);
28 int ClearLink(Link l);
29 int DestroyLink(Link *l);
30 #endif
调用函数
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include "LinkList.h"
4
5 /*
6 链表初始化
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include "LinkList.h"
4
5 /*
6 链表初始化
7 */
8 int InitLink(Link *l)
9 {
10 (*l) = (Link)malloc(sizeof(Node) * 1); //给头结点分配空间
11 if (NULL == (*l))
12 {
13 return FAILURE;
14 }
15
16 (*l)->next = NULL; //头结点下一个元素为空
17
18 return SUCCESS;
19 }
20
21 /*
22 判断链表是否为空
23 */
24 int EmptyLink(Link l)
25 {
26 return (l->next == NULL) ? SUCCESS : FAILURE;
27 }
28
29 /*
30 向链表插入节点
31 */
32 int InsertLink(Link l, int p, DataType e)
33 {
34 Link q = l, n;
35 int j = 1;
36
37 if (NULL == l)
38 {
39 return FAILURE;
40 }
41
42 while (q && j < p) //移动指针到要插入位置的前一个位置
43 {
44 q = q->next;
45 j++;
46 }
47
48 if (q == NULL || j > p) //判断插入的位置是否合法
49 {
50 return FAILURE;
51 }
52
53 n = (Link)malloc(sizeof(Node) * 1);
54 if (NULL == n)
55 {
56 return FAILURE;
57 }
58
59 n->data = e;
60 n->next = q->next;
61 q->next = n;
62
63 return SUCCESS;
64 }
65
66 /*
67 链表的长度
68 */
69 int LinkLength(Link l)
70 {
75 {
76 q = q->next;
77 len++;
78 }
79
80 return len - 1;
81 }
82
83 /*
84 遍历链表
85 参数:p是函数指针,指向Visit函数
86 */
87 int TraverseLink(Link l, void(*p)(DataType))
88 {
89 Link q = l->next;
90
91 while(q)
92 {
93 p(q->data);
94 q = q->next;
95 }
96
97 return SUCCESS;
98 }
99
100 /*
101 获取元素
102 */
103 int GetElem(Link l, int p, DataType *e)
104 {
105 Link q = l;
106 int len = 0;
107
108 while (q)
109 {
110 q = q->next;
111 len++;
112 if (p == len)
113 {
114 *e = q->data;
115 return SUCCESS;
116 }
117 }
118
119 return FAILURE;
120 }
121
122 /*
123 查找元素位置,返回元素的位置
124 参数:p是函数指针,指向Equal函数
125 */
126 int LocateElem(Link l, DataType e, int(*p)(DataType, DataType))
127 {
128 Link q = l->next;
129 int len = 1;
130
131 while (q)
132 {
133 if (p(e, q->data))
134 {
135 return len;
136 }
137 q = q->next;
138 len++;
139 }
140
141 return FAILURE;
142 }
143
144 /*
145 获取元素的前驱,保存在参数e中
146 */
147 int PriorElem(Link l, DataType e, int(*p)(DataType, DataType))
148 {
149 Link q = l->next;
150
151 if (p(e, q->data)) //第一个元素不存在前驱
152 {
153 return FAILURE;
154 }
155
156 while (q->next)
157 {
158 if (p(q->next->data, e))
159 {
160 return q->data;
161 }
162 q = q->next;
163 }
164
165 return FAILURE;
166 }
167
168 /*
169 获取元素后继,保存在参数e中
170 */
171 int NextElem(Link l, DataType e, int(*p)(DataType, DataType))
172 {
173 Link q = l->next;
174
175 while (q->next) //最后一个元素不存在后继
176 {
177 if (p(q->data, e))
178 {
179 return q->next->data;
180 }
181 q = q->next;
182 }
183
184 return FAILURE;
185 }
186
187 /*
188 链表反转
189 */
190 int ReverseLink(Link l)
191 {
192 Link q;
193
194 if (NULL == l)
195 {
196 return FAILURE;
197 }
198
199 Link p = l->next;
200 l->next = NULL;
201
202 while (p)
203 {
204 q = p;
205 p = p->next;
206 q->next = l->next;
207 l->next = q;
208 }
209
210 return SUCCESS;
211 }
212
213 /*
214 删除链表结点,被删除元素保存在参数e中
215 */
216 int DeleteLink(Link l, int p, DataType *e)
217 {
218 Link q = l, n;
219 int j = 1;
220
221 if (NULL == l)
222 {
223 return FAILURE;
224 }
225
226 while (q && j < p) //移动指针到要插入位置的前一个位置
227 {
228 q = q->next;
229 j++;
230 }
231
232 if (q == NULL || j > p) //判断插入的位置是否合法
233 {
234 return FAILURE;
235 }
236
237 n = q->next;
238 q->next = n->next;
239 *e = n->data;
240 free(n);
241
242 return SUCCESS;
243 }
244
245 /*
246 清空链表,删除所有结点,保留头结点
247 */
248 int ClearLink(Link l)
249 {
250 Link p = l->next;
251
252 while (p)
253 {
254 l->next = p->next;
255 free(p);
256 p = l->next;
257 }
258
259 return SUCCESS;
260 }
261
262 /*
263 销毁链表,即释放头结点
264 */
265 int DestroyLink(Link *l)
266 {
267 free(*l);
268 (*l) = NULL;
269
270 return SUCCESS;
271 }
主函数
1 #include <stdio.h>
2 #include "LinkList.h"
3
4 void visit(DataType e)
5 {
6 printf("%d ", e);
7 }
8
9 int Equal(DataType a, DataType b)
10 {
11 return (a == b) ? 1 : 0;
12 }
13
14 int main()
15 {
16 int ret, i, p;
17 Link link;
18 DataType e;
19
20 ret = InitLink(&link);
21 if (SUCCESS == ret)
22 {
23 printf("Init Success!\n");
24 }
25 else
26 {
27 printf("Init Failure!\n");
28 }
29
30 ret = EmptyLink(link);
31 if (SUCCESS == ret)
32 {
33 printf("Link is Empty!\n");
34 }
35 else
36 {
37 printf("Link is't Empty!\n");
38 }
39
40 for (i = 0; i < 5; i++)
41 {
42 ret = InsertLink(link, i + 1, i + 1);
43 if (FAILURE == ret)
44 {
45 printf("Insert %d Failure!\n", i + 1);
46 }
47 else
48 {
49 printf("Insert %d Success!\n", i + 1);
50 }
51 }
52
53 ret = EmptyLink(link);
54 if (SUCCESS == ret)
55 {
56 printf("Link is Empty!\n");
57 }
58 else
59 {
60 printf("Link is't Empty!\n");
61 }
62
63 printf("Length is %d!\n", LinkLength(link));
64
65 ret = TraverseLink(link, visit);
66 if (FAILURE == ret)
67 {
68 printf("Traverse Failure!\n");
69 }
70 else
71 {
72 printf("\nTraverse Success!\n");
73 }
74
75 p = 5;
76 ret = GetElem(link, p, &e);
77 if (FAILURE == ret)
78 {
79 printf("Get %dth Elem Failure!\n", p);
80 }
81 else
82 {
83 printf("%dth Elem is %d\n", p, e);
84 }
85
86 e = 10;
87 ret = LocateElem(link, e, Equal);
88 if (FAILURE == ret)
89 {
90 printf("Element %d is't exist!\n", e);
91 }
92 else
93 {
94 printf("%d is %dth Element!\n", e, ret);
95 }
96
97 e = 10;
98 ret = PriorElem(link, e, Equal);
99 if (FAILURE == ret)
100 {
101 printf("%d has no prior!\n",e);
102 }
103 else
104 {
105 printf("%d Prior is %d\n", e, ret);
106 }
107
108 e = 15;
109 ret = NextElem(link, e, Equal);
110 if (FAILURE == ret)
111 {
112 printf("%d has no next!\n",e);
113 }
114 else
115 {
116 printf("%d Next is %d\n", e, ret);
117 }
118
119 ret = ReverseLink(link);
120 if (SUCCESS == ret)
121 {
122 printf("Reverse Success!\n");
123 }
124
125 ret = TraverseLink(link, visit);
126 if (FAILURE == ret)
127 {
128 printf("Traverse Failure!\n");
129 }
130 else
131 {
132 printf("\nTraverse Success!\n");
133 }
134
135 p = 3;
136 ret = DeleteLink(link, p, &e);
137 if (SUCCESS == ret)
138 {
139 printf("Delete %dth Success!\n", p);
140 }
141 else
142 {
143 printf("Delete %dth Failure!\n", p);
144 }
145
146 ret = TraverseLink(link, visit);
147 if (FAILURE == ret)
148 {
149 printf("Traverse Failure!\n");
150 }
151 else
152 {
153 printf("\nTraverse Success!\n");
154 }
155
156 ret = ClearLink(link);
157 if (SUCCESS == ret)
158 {
159 printf("Clear Success!\n");
160 }
161 else
162 {
163 printf("Clear Failure!\n");
164 }
165
166 ret = TraverseLink(link, visit);
167 if (FAILURE == ret)
168 {
169 printf("Traverse Failure!\n");
170 }
171 else
172 {
173 printf("\nTraverse Success!\n");
174 }
175
176 ret = DestroyLink(&link);
177 if (FAILURE == ret)
178 {
179 printf("Destroy Failure!\n");
180 }
181 else
182 {
183 printf("Destroy Success!\n");
184 }
185
186 ret = InsertLink(link, 1, 3);
187 if (FAILURE == ret)
188 {
189 printf("Insert %d Failure!\n", i + 1);
190 }
191 else
192 {
193 printf("Insert %d Success!\n", i + 1);
194 }
195
196 return 0;
197 }