1 #include<iostream>
2 #include<stdlib.h>
3
4 typedef struct node
5 {
6 int data;
7 struct node *next;
8 }Node,*pNode;
9
10 pNode Creat_list();//创建一个单链表
11 void Traverse_list(pNode head);//遍历链表
12 int Len_list(pNode head);//求链表长度
13 bool Delete_list(pNode head,int n,int &a);//删除链表的第n个节点,并将所删除节点的值传入a中
14 bool Insert_list(pNode head,int n,int a);//在链表的第n个节点前插入一个新的节点,且新节点的值为n
15 bool Reverse_list(pNode head);//反转单链表
16
17
18 using namespace std;
19
20 int main()
21 {
22 int delval;
23 int length=0;
24 pNode listhead=Creat_list();
25 cout<<"链表元素为:";
26 Traverse_list(listhead);
27
28 cout<<endl;
29 length=Len_list(listhead);
30 cout<<"链表长度为:"<<length<<endl;
31 cout<<endl;
32
33
34 Delete_list(listhead,2,delval);
35 cout<<"删除后链表元素为:";
36 Traverse_list(listhead);
37 cout<<"被删除的元素的值是:"<<delval;
38 cout<<endl;
39
40
41 Insert_list(listhead,1,2);
42 cout<<"插入后链表元素为:";
43 Traverse_list(listhead);
44 cout<<endl;
45
46
47 cout<<endl;
48 Reverse_list(listhead);
49 cout<<"反转后链表元素为:";
50 Traverse_list(listhead);
51 cout<<endl;
52
53 cout<<endl;
54 return 0;
55 }
56
57
58
59 //创建一个包含n个节点的单链表(不包括头结点)
60 pNode Creat_list()
61 {
62 int n;//所创建链表元素的个数
63 pNode head=(pNode)malloc(sizeof(Node));//创建链表的头结点
64 head->next=NULL;
65 cout<<"Please input the number of list element:";
66 cin>>n;
67 cout<<endl;
68
69 if(n<=0)
70 {
71 return NULL;
72 }
73
74 else
75 {
76 pNode midnode=(pNode)malloc(sizeof(Node));
77 midnode=head;
78
79 for(int i=1;i<n+1;i++)
80 {
81 int a;
82 cout<<"Please input the number"<<i<<"'s data:";
83 cin>>a;
84
85 pNode newnode=(pNode)malloc(sizeof(Node));
86 if(newnode==NULL)
87 {
88 cout<<"创建新节点失败"<<endl;
89 return NULL;
90 }
91
92 else
93 {
94 midnode->next=newnode;//现在的midnode指向的是newnode的上一个节点
95 newnode->data=a;
96 newnode->next=NULL;
97 midnode=newnode;//现在的midnode指向最新的节点
98 }
99 }
100
101 return head;
102 }
103 }
104
105
106
107 //遍历链表
108 void Traverse_list(pNode head)
109 {
110 if(head->next == NULL)
111 {
112 cout<<"链表为空"<<endl;
113 return;
114 }
115
116 else
117 {
118 pNode midnode=(pNode)malloc(sizeof(Node));
119 midnode=head;
120
121 while(midnode->next != NULL)
122 {
123 midnode=midnode->next;
124 cout<<midnode->data<<" ";
125 }
126 cout<<endl;
127
128 return;
129 }
130 }
131
132
133 //求链表长度
134 int Len_list(pNode head)
135 {
136 int len=0;
137
138 if(head->next==NULL)
139 {
140 return 0;
141 }
142
143 else
144 {
145 pNode midnode=(pNode)malloc(sizeof(Node));
146
147 if(midnode==NULL)
148 {
149 cout<<"分配中间节点内存失败!";
150 return 0;
151 }
152
153 midnode=head;
154 while(midnode->next != NULL)
155 {
156 midnode=midnode->next;
157 len++;
158 }
159 return len;
160 }
161 }
162
163
164
165 //删除链表中的第n个节点(头结点视为链表的第0个节点),并返回所删除元素的值到a中
166 bool Delete_list(pNode head,int n,int &a)
167 {
168 int length=Len_list(head);//链表的长度
169
170 if(n<=0 || n>length)
171 {
172 cout<<"被删除元素的序数非法!"<<endl;
173 return false;
174 }
175
176 else if(n==1)
177 {
178 pNode midnode=(pNode)malloc(sizeof(Node));
179 midnode=head->next;
180 a=midnode->data;
181 head->next=midnode->next;
182 free(midnode);
183
184 return true;
185 }
186
187
188 else
189 {
190 int i=0;
191
192 pNode midnode1=(pNode)malloc(sizeof(Node));
193 midnode1=head;
194
195 while(i<n-1)
196 {
197 midnode1=midnode1->next;
198 i++;
199 }//出while循环时,midnode指向的是第n-1个节点
200
201 pNode midnode2=(pNode)malloc(sizeof(Node));
202 midnode2=midnode1->next;//midnode2是被删除的节点
203 a=midnode2->data;
204 midnode1->next=midnode2->next;
205 free(midnode2);
206
207 return true;
208 }
209 }
210
211
212 //在链表中第n个节点前插入一个值为a的新节点
213 bool Insert_list(pNode head,int n,int a)
214 {
215 int len=Len_list(head);
216
217 if(n<=0 || n>len)
218 {
219 cout<<"插入元素的位置非法!";
220 return false;
221 }
222
223 else if(n==1)
224 {
225 pNode midnode=(pNode)malloc(sizeof(Node));
226 if(midnode==NULL)
227 {
228 cout<<"分配中间节点内存失败!";
229 return false;
230 }
231
232 midnode->data=a;
233 midnode->next=head->next;
234 head->next=midnode;
235
236 return true;
237 }
238
239 else
240 {
241 int i=0;
242
243 pNode midnode1=(pNode)malloc(sizeof(Node));
244 if(midnode1==NULL)
245 {
246 cout<<"分配中间节点内存失败!";
247 return false;
248 }
249
250 midnode1=head;
251 while(i<n-1)
252 {
253 midnode1=midnode1->next;
254 i++;
255 }//出while循环时midnode1指向的是第n-1个节点
256
257
258 pNode midnode2=(pNode)malloc(sizeof(Node));
259 if(midnode2==NULL)
260 {
261 cout<<"分配新节点内存失败!";
262 return false;
263 }
264
265 midnode2->data=a;
266 midnode2->next=midnode1->next;
267 midnode1->next=midnode2;
268
269 return true;
270 }
271 }
272
273
274 //反转单链表
275 bool Reverse_list(pNode head)
276 {
277 int len=Len_list(head);
278
279 if(len==0 || len==1)
280 {
281 cout<<"链表元素过少,不能反转!";
282 return false;
283 }
284
285 else
286 {
287 pNode midnode1=(pNode)malloc(sizeof(Node));
288 pNode midnode2=(pNode)malloc(sizeof(Node));
289 if(midnode1==NULL || midnode2==NULL)
290 {
291 cout<<"分配中间节点内存失败!";
292 return false;
293 }
294
295 midnode1=head->next;
296 midnode2=midnode1->next;
297 midnode1->next=NULL;
298
299 while(midnode2->next != NULL)
300 {
301 pNode X=midnode2->next;
302 midnode2->next=midnode1;
303 midnode1=midnode2;
304 midnode2=X;
305 }
306 midnode2->next=midnode1;
307 head->next=midnode2;
308
309 return true;
310 }
311 }