1 #include "LinkList.h"
2 #include<stdlib.h>
3 void DestoryNode(LinkNode*node)//释放结点
4 {
5 free(node);
6 }
7 LinkNode* CreateNode(LinkNodeType value)//创建结点
8 {
9 LinkNode*new_node=(LinkNode*)malloc(sizeof(LinkNode));
10 new_node->data=value;
11 new_node->next=NULL;
12 return new_node;
13
14 }
15 void LinkListInit(LinkNode**head)//初始化链表
16 {
17 *head=NULL;
18 }
19
20 void LinkListPushBack(LinkNode*(*head),LinkNodeType value)//链表的尾插
21 {
22 if(head==NULL)
23 {
24 return;
25 }
26 if(*head==NULL)
27 {
28 *head=CreateNode(value);
29 return;
30 }
31 LinkNode*cur=*head;
32 while(cur->next!=NULL)
33 {
34 cur=cur->next;
35 }
36 cur->next=CreateNode(value);
37 }
38 void LinkListPopBack(LinkNode**head)//链表的尾删
39 {
40 if(head==NULL)
41 {
42 return;
43 }
44 if(*head==NULL)
45 {
46 return;
47 }
48 if((*head)->next==NULL)
49 {
50 DestoryNode(*head);
51 *head=NULL;
52 return;
53 }
54 LinkNode*cur=*head;
55 LinkNode*pre=NULL;
56 while(cur->next!=NULL)
57 {
58 pre=cur;
59 cur=cur->next;
60 }
61 pre->next=NULL;
62 DestoryNode(cur);
63 }
64 void LinkListPushFront(LinkNode**head,LinkNodeType value)//链表的头插
65 {
66 if(head==NULL)
67 {
68 return;
69 }
70 LinkNode*new_node=CreateNode(value);
71 new_node->next=*head;
72 *head=new_node;
73 }
74 void LinkListPopFront(LinkNode**head)//链表的头删
75 {
76 if(head==NULL)
77 {
78 return;
79 }
80 if(*head==NULL)
81 {
82 return;
83 }
84 LinkNode*to_earse=*head;
85 *head=(*head)->next;
86 DestoryNode(to_earse);
87 }
88 void LinkListInsert(LinkNode*pos,LinkNodeType value)//链表指定位置的插入
89 {
90 if(pos==NULL)
91 {
92 return;
93 }
94 LinkNode*new_node=CreateNode(value);
95 new_node->next=pos->next;
96 pos->next=new_node;
97 }
98 void LinkListInsertBefore(LinkNode**head,LinkNode*pos,LinkNodeType value)//链表指定位置之前的插入
99 {
100 if(head==NULL||pos==NULL)
101 {
102 return;
103 }
104 if(*head==pos)
105 {
106 LinkListPushFront(head,value);
107 }
108 LinkNode*cur=*head;
109 for(;cur!=NULL;cur=cur->next)
110 {
111 if(cur->next==pos)
112 {
113 break;
114 }
115 }
116 if(cur==NULL)
117 {
118 return;
119 }
120 LinkListInsert(cur,value);
121 }
122 void LinkListErase(LinkNode**head,LinkNode*pos)//删除指定位置的结点
123 {
124 if(head==NULL||pos==NULL)
125 {
126 return;
127 }
128 if(*head==NULL)
129 {
130 return;
131 }
132 LinkNode*cur=*head;
133 for(;cur!=NULL;cur=cur->next)
134 {
135 if(cur->next==pos)
136 {
137 break;
138 }
139 }
140 if(cur==NULL)
141 {
142 return;
143 }
144 cur->next=pos->next;
145 DestoryNode(pos);
146 }
147 LinkNode* LinkListFind(LinkNode*head,LinkNodeType to_find)//查找指定元素的结点位置
148 {
149 if(head==NULL)
150 {
151 return;
152 }
153 LinkNode*cur=head;
154 for(;cur!=NULL;cur=cur->next)
155 {
156 if(cur->data==to_find)
157 {
158 return cur;
159 }
160 }
161 return NULL;
162 }
163 void LinkListRemove(LinkNode**head,LinkNodeType to_remove)//删除指定元素的结点
164 {
165 if(*head==NULL)
166 {
167 return;
168 }
169 LinkNode*pos=LinkListFind(*head,to_remove);
170 LinkListErase(head,pos);
171 }
172 void LinkListAllRemove(LinkNode**head,LinkNodeType to_remove)//删除指定元素的全部结点
173 {
174 if(head==NULL)
175 {
176 return;
177 }
178 if(*head==NULL)
179 {
180 return;
181 }
182 while(1)
183 {
184 LinkNode*pos=LinkListFind(*head,to_remove);
185 if(pos==NULL)
186 {
187 return;
188 }
189 LinkListErase(head,pos);
190 }
191 }
192 int LinkListEmpty(LinkNode*head)//判断链表是否为空
193 {
194 return head==NULL?1:0;
195 }
196 size_t LinkListSize(LinkNode*head)//计算链表的大小
197 {
198 if(head==NULL)
199 {
200 return;
201 }
202 LinkNode*cur=head;
203 size_t size=0;
204 for(;cur!=NULL;cur=cur->next)
205 {
206 size++;
207 }
208 if(cur==NULL)
209 {
210 return;
211 }
212 return size;
213 }
214 void LinkListDestroy(LinkNode**head)//删除链表的全部结点
215 {
216 if(head==NULL)
217 {
218 return;
219 }
220 if(*head==NULL)
221 {
222 return;
223 }
224 LinkNode*pos=*head;
225 while(pos!=NULL)
226 {
227 LinkNode*to_delete=pos;
228 pos=pos->next;
229 DestoryNode(to_delete);
230 }
231 *head=NULL;}
以下为所引用的头文件
1 #pragma once
2 typedef char LinkNodeType;
3 typedef struct LinkNode
4 {
5 LinkNodeType data;
6 struct LinkNode* next;
7 }LinkNode;
8 void LinkListInit(LinkNode**head);
9 LinkNode* CreateNode(LinkNodeType value);
10 void LinkListPushBack(LinkNode**head,LinkNodeType value);
11 void LinkListPopBack(LinkNode**head);
12 void LinkListPushFront(LinkNode**head,LinkNodeType value);
13 void LinkListPopFront(LinkNode**head);
14 void LinkListInsertBefore(LinkNode**head,LinkNode*pos,LinkNodeType value);
15 void LinkListInsert(LinkNode*pos,LinkNodeType value);
16 void LinkListErase(LinkNode**head,LinkNode*pos);
17 LinkNode* LinkListFind(LinkNode*head,LinkNodeType to_find);
18 void LinkListRemove(LinkNode**head,LinkNodeType to_remove);
19 void LinkListAllRemove(LinkNode**head,LinkNodeType to_remove);
20 int LinkListEmpty(LinkNode*head);
21 size_t LinkListSize(LinkNode*head);
22 void LinkListDestroy(LinkNode**head);