链表(单向链表)

单向链表所有操作:

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.释放

流程图:

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值