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("链表所有结点释放成功.\n");
36 else
37 printf("在释放链表所有结点时发生未知错误,未能成功释放链表所有结点。\n");
38 */
39
40
41
42 printf("\n\n");
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个位置后的序列为:\n");
58 printLink(head);
59
60 delLink(head);
61 if(head==NULL)
62 printf("链表所有结点释放成功.\n");
63 else
64 printf("在释放链表所有结点时发生未知错误,未能成功释放链表所有结点。\n");
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("\n");
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("\n");
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("\n");
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 }