链表相关操作:创建链表、遍历链表、求链表长度、链表中删除一个节点、链表中插入一个节点、反转单链表

  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 }

 

posted @ 2018-01-19 10:29  8号prince  阅读(191)  评论(0编辑  收藏  举报