单向链表所有操作:
head.h:
1 #ifndef __HEAD_H__
2 #define __HEAD_H__
3 #include<stdio.h>
4 #include<string.h>
5 #include<stdlib.h>
6 enum num
7 {
8 FALSE=-1,
9 SUCCESS
10 };
11 typedef int datatype;
12 //定义节点结构体
13 typedef struct Node
14 {
15 //数据域
16 datatype data;
17 //指针域
18 struct Node *next;
19 }*Linklist;
20 Linklist create();
21 Linklist insert_head(Linklist head,datatype element);
22 void output(Linklist head);
23 Linklist insert_rear(Linklist head,datatype element);
24 Linklist delete_head(Linklist head);
25 Linklist delete_rear(Linklist head);
26 int length(Linklist head);
27 Linklist insert_pos(Linklist head,datatype element,int pos);
28 Linklist delete_pos(Linklist head,int pos);
29 void search_pos(Linklist head,int pos);
30 void change_pos(Linklist head,int pos,datatype element);
31 Linklist rev(Linklist head);
32 void search_down(Linklist head,int m);
33 int search_key(Linklist head,datatype key);
34 Linklist change_key(Linklist head,datatype key,datatype element);
35 Linklist delete_key(Linklist head,datatype key);
36 void Bubble(Linklist head);
37 void simple_sort(Linklist head);
38 Linklist free_space(Linklist head);
39 #endif
main.c:
1 #include "head.h"
2 int main(int argc, const char *argv[])
3 {
4 Linklist head=NULL;//定义单链表的头指针
5 int n;
6 datatype element;//插入值
7 printf("please enter n:");
8 scanf("%d",&n);
9 /* for(int i=0;i<n;i++)
10 {
11 printf("please enter %d element:",i+1);
12 scanf("%d",&element);
13 head=insert_head(head,element);//头插
14 }
15 //遍历
16 output(head);*/
17 for(int i=0;i<n;i++)
18 {
19 printf("please enter %d element:",i+1);
20 scanf("%d",&element);
21 head=insert_rear(head,element);//尾插
22 }
23 output(head);
24 /* //头删
25 head=delete_head(head);
26 output(head);
27 //尾删
28 head=delete_rear(head);
29 output(head);
30 //按位置插入*/
31 int pos;/*
32 printf("please eneter insert_pos:");
33 scanf("%d",&pos);
34 printf("please enter insert_pos element:");
35 scanf("%d",&element);
36 head=insert_pos(head,element,pos);
37 output(head);
38 //任意位置删除
39 printf("please eneter delete_pos:");
40 scanf("%d",&pos);
41 head=delete_pos(head,pos);
42 output(head);
43 //任意位置查找
44 printf("please eneter search_pos:");
45 scanf("%d",&pos);
46 search_pos(head,pos);
47 //任意位置修改
48 printf("please eneter change_pos:");
49 scanf("%d",&pos);
50 printf("please eneter change_element:");
51 scanf("%d",&element);
52 change_pos(head,pos,element);
53 output(head);*/
54 //逆置
55 /* head=rev(head);
56 output(head);
57 //查找倒第n个
58 int m;
59 printf("please enter search_down m:");
60 scanf("%d",&m);
61 search_down(head,m);i*/
62 //按任意元素查找
63 datatype key;
64 /* printf("please enter search_key:");
65 scanf("%d",&key);
66 pos=search_key(head,key);
67 if(pos==-1)
68 printf("erro:%d\n",pos);
69 else
70 printf("search by key pos:%d\n",pos);*/
71 //按任意元素修改
72 /* printf("please enter change key:");
73 scanf("%d",&key);
74 printf("please enter change_key element:");
75 scanf("%d",&element);
76 head=change_key(head,key,element);
77 output(head);
78 //按任意元素删除
79 printf("please enter delete_key:");
80 scanf("%d",&key);
81 head=delete_key(head,key);
82 output(head);*/
83 //排序
84 //1.冒泡
85 /* Bubble(head);
86 output(head);*/
87 //2.简单
88 simple_sort(head);
89 output(head);
90 //释放
91 head=free_space(head);
92 output(head);
93 return 0;
94 }
95
test.c:
1 #include "head.h"
2 Linklist create()//创建新节点
3 {
4 Linklist s=(Linklist)malloc(sizeof(struct Node));
5 if(NULL==s)
6 return NULL;
7 //成功初始化
8 s->data=0;
9 s->next=NULL;
10 return s;
11 }
12 //头插
13 Linklist insert_head(Linklist head,datatype element)
14 {
15 //创建新节点s
16 Linklist s=create();
17 s->data=element;
18 //判断链表是否为空
19 if(NULL==head)
20 {
21 head=s;
22 }
23 else
24 {
25 s->next=head;
26 head=s;
27 }
28 return head;
29 }
30 //遍历
31 void output(Linklist head)
32 {
33 if(NULL==head)
34 {
35 puts("empty");
36 return;
37 }
38 Linklist p=head;
39 while(p!=NULL)
40 {
41 printf("%-4d",p->data);
42 p=p->next;
43 }
44 puts("");
45 }
46 //尾插
47 Linklist insert_rear(Linklist head,datatype element)
48 {
49 Linklist s=create();
50 s->data=element;
51 //判断链表是否为空
52 if(NULL==head)
53 head=s;
54 else
55 {
56 Linklist p=head;
57 while(p->next!=NULL)
58 {
59 p=p->next;
60 }
61 p->next=s;
62 }
63 return head;
64 }
65 //头删
66 Linklist delete_head(Linklist head)
67 {
68 if(NULL==head)
69 return head;
70 else
71 {
72 Linklist del=head;
73 head=head->next;
74 free(del);
75 del=NULL;
76 }
77 return head;
78 }
79 //尾删
80 Linklist delete_rear(Linklist head)
81 {
82 if(NULL==head)
83 {
84 puts("empty");
85 return head;
86 }
87 else if(NULL==head->next)
88 {
89 free(head);
90 head=NULL;
91 return head;
92 }
93 else
94 {
95 Linklist del=head;
96 while(del->next->next!=NULL)
97 {
98 del=del->next;
99 }
100 free(del->next);
101 del->next=NULL;
102 return head;
103 }
104 }
105 //计算链表长度
106 int length(Linklist head)
107 {
108 Linklist p=head;
109 int len=0;
110 while(p)
111 {
112 len++;
113 p=p->next;
114 }
115 return len;
116 }
117 //按位置插入
118 Linklist insert_pos(Linklist head,datatype element,int pos)
119 {
120 if(pos<1 || pos>length(head)+1)
121 {
122 puts("erro");
123 return head;
124 }
125 Linklist s=create();
126 s->data=element;
127 if(pos==1)
128 {
129 head=insert_head(head,element);
130 return head;
131 }
132 Linklist p=head;
133 for(int i=1;i<pos-1;i++)
134 p=p->next;
135 s->next=p->next;
136 p->next=s;
137 return head;
138 }
139 //按任意位置删除
140 Linklist delete_pos(Linklist head,int pos)
141 {
142 if(pos<1||pos>length(head)|| NULL==head)
143 return head;
144 if(pos==1)
145 {
146 head=delete_head(head);
147 return head;
148 }
149 Linklist p=head;
150 for(int i=1;i<pos-1;i++)
151 p=p->next;
152 Linklist del=p->next;
153 p->next=del->next;
154 free(del);del=NULL;
155 return head;
156 }
157 //任意位置查找
158 void search_pos(Linklist head,int pos)
159 {
160 if(pos<1||pos>length(head)||NULL==head)
161 puts("erro");
162 Linklist p=head;
163 for(int i=1;i<pos;i++)
164 p=p->next;
165 printf("search by pos: %d\n",p->data);
166 }
167 //任意位置修改
168 void change_pos(Linklist head,int pos,datatype element)
169 {
170 if(pos<1||pos>length(head)||NULL==head)
171 puts("erro");
172 Linklist p=head;
173 for(int i=1;i<pos;i++)
174 p=p->next;
175 p->data=element;
176 }
177 //逆置
178 Linklist rev(Linklist head)
179 {
180 if(NULL==head)
181 return NULL;
182 Linklist p=head->next;
183 head->next=NULL;
184 while(p!=NULL)
185 {
186 Linklist t=p;
187 p=p->next;
188 t->next=head;
189 head=t;
190 }
191 return head;
192 }
193 //查找倒第n个
194 void search_down(Linklist head,int m)
195 {
196 if(NULL==head||m<0||m>length(head))
197 return;
198 Linklist p=head,q=head;
199 for(int i=0;i<m;i++)
200 {
201 p=p->next;
202 }
203 while(p!=NULL)
204 {
205 p=p->next;
206 q=q->next;
207 }
208 printf("search by down:%d\n",q->data);
209 }
210 //按任意元素查找
211 int search_key(Linklist head,datatype key)
212 {
213 if(NULL==head)
214 return FALSE;
215 Linklist p=head;
216 int index=0;
217 while(p!=NULL)
218 {
219 index++;
220 if(p->data==key)
221 return index;
222 p=p->next;
223 }
224 return FALSE;
225 }
226 //按任意元素修改
227 Linklist change_key(Linklist head,datatype key,datatype element)
228 {
229 int pos=search_key(head,key);
230 if(pos==FALSE)
231 {
232 puts("erro");
233 return head;
234 }
235 change_pos(head,pos,element);
236 return head;//可以不返,动的值而不是头
237 }
238 //按任意元素删除
239 Linklist delete_key(Linklist head,datatype key)
240 {
241 int pos=search_key(head,key);
242 if(pos==FALSE)
243 {
244 puts("erro");
245 return head;
246 }
247 head=delete_pos(head,pos);
248 return head;
249 }
250 //排序
251 //1.冒泡
252 void Bubble(Linklist head)
253 {
254 if(head==NULL)
255 return;
256 int len=length(head);
257 for(int i=1;i<len;i++)
258 {
259 Linklist p=head;
260 for(int j=0;j<len-i;j++)
261 {
262 if(p->data>p->next->data)
263 {
264 datatype t=p->data;
265 p->data=p->next->data;
266 p->next->data=t;
267 }
268 p=p->next;
269 }
270 }
271 }
272 //2.简单
273 void simple_sort(Linklist head)
274 {
275 if(head==NULL)
276 return;
277 Linklist i=head;
278 while(i->next!=NULL)
279 {
280 Linklist min=i;
281 Linklist j=i->next;
282 while(j!=NULL)
283 {
284 if(min->data>j->data)
285 min=j;
286 j=j->next;
287 }
288 if(min!=i)
289 {
290 datatype t=min->data;
291 min->data=i->data;
292 i->data=t;
293 }
294 i=i->next;
295 }
296 }
297 void simple_sort(Linklist head)
298 {
299 if(head==NULL)
300 return;
301 for(Linklist i=head;i->next!=NULL;i=i->next)
302 {
303 Linklist min=i;
304 for(Linklist j=i->next;j!=NULL;j=j->next)
305 {
306 if(min->data>j->data)
307 {
308 min=j;
309 }
310 }
311 if(min!=i)
312 {
313 datatype t=min->data;
314 min->data=i->data;
315 i->data=t;
316 }
317 }
318
319 }
320 //释放
321 Linklist free_space(Linklist head)
322 {
323 if(NULL==head)
324 return head;
325 while(head!=NULL)
326 {
327 head=delete_head(head);
328 }
329 head=NULL;//默认就为NULL
330 return head;
331 }
1.按任意元素查找
2.按任意元素修改
3.按任意元素删除
4.排序
冒泡排序:
简单排序:
5.释放
流程图: