完成链表的增删查改以及链表长度的计算

  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);     





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值