单向链表完整代码

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<time.h>
  4 #include<math.h>
  5 typedef struct node
  6 {
  7     int data;
  8     struct node * next;
  9 }linkNode;
 10 typedef linkNode *pLinkNode;
 11 
 12 void creatLinkByHeadInsert(pLinkNode &head,int n);//生成n个随机数,用头插法构造链表
 13 void creatLinkByTailInsert(pLinkNode &head,int n);//生成n个随机数,用尾插法构造链表
 14 void printLink(pLinkNode head);//输出链表的结点值 
 15 void delLink(pLinkNode &head);//释放整条链的所有结点
 16 void delLinkNode(pLinkNode &head,int k);//删除并释放链表的第k个结点 
 17 void delLinkNodeByVal(pLinkNode &head,int k);//删除链表中所有值为k的结点 
 18 void insertNode(pLinkNode &head,int data,int k);//用data构造一个结点并插入链表,使其成为链表的第k个结点(若链表节点数小于k-1则插入到链表末尾) 
 19 
 20 int main()
 21 {
 22     pLinkNode head;
 23     int valToDel,valToInsert;
 24     
 25     /*
 26     head=NULL;
 27     creatLinkByHeadInsert(head,10);
 28     printLink(head);
 29     delLinkNode(head,1);
 30     printLink(head);
 31     delLinkNode(head,2);
 32     printLink(head);
 33     delLink(head);
 34     if(head==NULL)
 35         printf("链表所有结点释放成功.
");
 36     else
 37         printf("在释放链表所有结点时发生未知错误,未能成功释放链表所有结点。
");
 38     */
 39     
 40     
 41     
 42     printf("

");
 43     head=NULL;
 44     creatLinkByTailInsert(head,10);
 45     printLink(head);
 46     
 47     printf("输入一个想要删除的数:");
 48     scanf("%d",&valToDel);
 49     delLinkNodeByVal(head,valToDel);
 50     printLink(head);
 51     
 52     printf("输入一个想要插入的数:");
 53     scanf("%d",&valToInsert);
 54     insertNode(head,valToInsert,1);
 55     insertNode(head,valToInsert,3);
 56     insertNode(head,valToInsert,12);
 57     printf("插入第1和第3,12个位置后的序列为:
");
 58     printLink(head);
 59     
 60     delLink(head);
 61     if(head==NULL)
 62         printf("链表所有结点释放成功.
");
 63     else
 64         printf("在释放链表所有结点时发生未知错误,未能成功释放链表所有结点。
");
 65 
 66     return 0;
 67 }
 68 
 69 //生成n个随机数,用头插法构造链表
 70 void creatLinkByHeadInsert(pLinkNode &head,int n)
 71 {
 72     int i;
 73     pLinkNode p;
 74     head=NULL;
 75     
 76     srand((unsigned)time(0));
 77     for(i=0;i<n;i++)
 78     {
 79         p=(pLinkNode)malloc(sizeof(linkNode));
 80         p->data=rand()%100+10;
 81         p->next=NULL;
 82         printf("%d ",p->data);
 83         
 84         if(head==NULL)
 85         {
 86             head=p;
 87         }
 88         else
 89         {
 90             p->next=head;
 91             head=p;
 92         }
 93     }
 94     printf("
");
 95 }
 96 
 97 //输出链表的结点值 
 98 void printLink(pLinkNode head)
 99 {
100     pLinkNode p;
101     p=head;
102     while(p!=NULL)
103     {
104         printf("%d ",p->data);
105         p=p->next;
106     }
107     printf("
");
108 }
109 
110 //生成n个随机数,用尾插法构造链表
111 void creatLinkByTailInsert(pLinkNode &head,int n)
112 {
113     pLinkNode end,p;
114     int i;
115     
116     head=NULL;
117     end=NULL;
118     
119     srand((unsigned)time(0));
120     for(i=0;i<n;i++)
121     {
122         p=(pLinkNode)malloc(sizeof(linkNode));
123         p->data=rand()%100+10;
124         p->next=NULL;
125         printf("%d ",p->data);
126         
127         if(head==NULL)
128         {
129             head=p;
130             end=p;
131         }
132         else
133         {
134             end->next=p;
135             end=p;
136         }
137     }
138     printf("
");
139 }
140 
141 //释放整条链的所有结点
142 void delLink(pLinkNode &head)
143 {
144     pLinkNode p,q;
145     p=head;
146     
147     while(p!=NULL)
148     {
149         q=p->next;
150         free(p);
151         p=q;
152     }
153     head=NULL;
154 }
155 
156 //删除并释放链表的第k个结点 
157 void delLinkNode(pLinkNode &head,int k)
158 {
159     pLinkNode p,q;
160     int i;
161     
162     if(k==1)
163     {
164         p=head;
165         head=head->next;
166         free(p);
167     }
168     else
169     {
170         q=head;
171         p=head->next;
172         i=2;
173         while(p!=NULL&&i<k)
174         {
175             q=p;
176             p=p->next;
177             i++;
178         }
179         if(p==NULL)
180             return;
181         else
182         {
183             q->next=p->next;
184             free(p);
185         }
186     }
187 }
188 
189 //删除链表中所有值为k的结点 
190 void delLinkNodeByVal(pLinkNode &head,int k)
191 {
192     pLinkNode p,q;
193     while(head->data==k)
194     {
195         p=head;
196         head=head->next;
197         free(p);
198     }
199     
200     p=head->next;
201     q=head;
202     while(p!=NULL)
203     {
204         if(p->data==k)
205         {
206             q->next=p->next;
207             free(p);
208             p=q->next;
209         }
210         else
211         {
212             q=p;
213             p=p->next;
214         }
215     }
216 }
217 
218 //用data构造一个结点并插入链表,使其成为链表的第k个结点(若链表节点数小于k-1则插入到链表末尾) 
219 void insertNode(pLinkNode &head,int data,int k)
220 {
221     pLinkNode p,q;
222     int i;
223     
224     p=(pLinkNode)malloc(sizeof(linkNode));
225     p->data=data;
226     p->next=NULL;
227     
228     if(k==1)
229     {
230         p->next=head;
231         head=p;
232     }
233     else
234     {
235         q=head;
236         for(i=2;i<k&&q!=NULL;i++)
237         {
238             q=q->next;
239         }
240         if(q==NULL)
241         {
242             q->next=p;
243         }
244         else
245         {
246             p->next=q->next;
247             q->next=p;
248         }
249     }
250 }
原文地址:https://www.cnblogs.com/huashanqingzhu/p/6665365.html