含头结点的单链表C++实现(包含创建,查找,插入,追加,删除,反转,排序,合并,打印,清空,销毁等基本操作)

温馨提示:下面代码默认链表数据为字符型,本代码仅供参考,希望能对找到本随笔的人有所帮助!

  1 #include<iostream>
  2 using namespace std;
  3 typedef struct Lnode
  4 {
  5  char data;
  6  struct Lnode *next;
  7 }LN;
  8 LN *CreateLinkList()
  9 {
 10  LN *head,*p,*pre;
 11  char ch;
 12  int i=1;
 13  head=(LN *)malloc(sizeof(LN));
 14  head->next=NULL;
 15  pre=head;
 16  while(1)
 17  {
 18   cout<<"输入第"<<i<<"个节点数据:";
 19   while((ch=cin.get())!='\n')
 20   {
 21   cin.get();
 22   p=(LN *)malloc(sizeof(LN));
 23   pre->next=p;
 24   p->next=NULL;
 25   p->data=ch;
 26   pre=p;
 27   i++;
 28   break;
 29   }
 30   if(ch=='\n')
 31      break;
 32  }
 33   pre->next=NULL;
 34  return head;
 35 }
 36 int LinkListLength(LN *head)
 37 {
 38  int count=1;
 39  LN *p;
 40  p=head->next;
 41  if(p==NULL)
 42  {
 43   return 0;
 44  }
 45  else
 46  {
 47  while(p->next)
 48  {
 49   p=p->next;
 50   count++;
 51  }
 52  return count;
 53  }
 54 }
 55 void SearchData(int i,LN *head)
 56 {
 57  LN *p;
 58  int j=0;
 59  p=head->next;
 60  cout<<"输入要查找的节点:";
 61  cin>>i;
 62  while(p&&j<i-1)
 63  {
 64   p=p->next;
 65   j++;
 66  }
 67   if(!p)
 68  {
 69   cout<<"该节点不存在!"<<endl;
 70  }
 71  else
 72  {
 73  cout<<"该节点数据为:"<<p->data<<endl;
 74  }
 75 }
 76  
 77 LN *SearchSpecificData(char ch,LN * head)
 78 {
 79  LN *p;
 80  int count=1;
 81  p=head->next;
 82  while(p)
 83  {
 84   if(p->data==ch)
 85   {
 86    cout<<"该数据是链表中第"<<count<<"个数据!"<<endl;
 87    return p;
 88    break;
 89   }
 90   else
 91   {
 92    p=p->next;
 93    count++;
 94   }
 95  }
 96  if(p==NULL)
 97  {
 98   cout<<"链表中不存在该数据!"<<endl;
 99   return NULL;
100  }
101 }
102 LN *InsertData(int i,LN *head)
103 {
104  LN *p,*insert;
105  int j=1;
106  char ch;
107  cout<<"输入要插入的数据:";
108  cin>>ch;
109  cout<<"输入元素插入的位置:";
110  cin>>i;
111  if(i>LinkListLength(head)+1)
112  {
113   cout<<"插入错误!"<<endl;
114   return NULL;
115  }
116  else if(i==1)
117  {
118   insert=(LN *)malloc(sizeof(LN));
119   insert->next=head->next;
120   head->next=insert;
121   insert->data=ch;
122   return head;
123  }
124  else
125  {
126  p=head->next;
127  while(p&&j<i-1)
128  {
129   p=p->next;
130   j++;
131  }
132  insert=(LN *)malloc(sizeof(LN));
133  insert->data=ch;
134  insert->next=p->next;
135  p->next=insert;
136  return head;
137  }
138 }
139 LN *DeleteData(int i,LN *head)
140 {
141  LN *p,*q;
142  int j=0;
143  cout<<"输入要删除的节点位置:";
144  cin>>i;
145  if(i>LinkListLength(head))
146  {
147   cout<<"该节点不存在,删除失败!"<<endl;
148   return NULL;
149  }
150  
151  else
152  {
153  q=head;
154  while(q&&j<i)
155  {
156   p=q;
157   q=q->next;
158   j++;
159  }
160  
161  p->next=q->next;
162  free(q);
163  return head;
164  }
165 }
166 LN * AddDataToTail(char ch,LN *head)
167 {
168  LN *p,*add;
169  p=head;
170  while(p->next)
171  {
172   p=p->next;
173  }
174  add=(LN *)malloc(sizeof(LN));
175  add->data=ch;
176  p->next=add;
177  add->next=NULL;
178  return head;
179 }
180 LN * PrintLinkList(LN *head)
181 {
182  LN *p;
183  p=head->next;
184  if(p==NULL)
185  {
186   cout<<"空链表无法打印!"<<endl;
187   return NULL;
188  }
189  else
190  {
191  while(p->next)
192  {
193   cout<<p->data<<"-->";
194   p=p->next;
195  }
196  cout<<p->data<<endl;
197  return head;
198  }
199 }
200 LN * FindMin(LN * head)
201 {
202  LN *p,*minptr;
203  char min;
204  p=head->next;
205  minptr=p;
206  min=minptr->data;
207  while(p!=NULL)
208  {
209   if(p->data<min)
210   {
211    minptr=p;
212    min=p->data;
213   }
214   p=p->next;
215  }
216  return minptr;
217 }
218 LN * DeleteSpecificData(char ch,LN * head)
219 {
220  LN *p,*q;
221  int j=0;
222  q=head->next;
223  p=head;
224  while(q&&q->data!=ch)
225  {
226   p=q;
227   q=q->next;
228  }
229  if(q==NULL)
230  {
231   cout<<"数据不存在,删除失败!"<<endl;
232   return NULL;
233  }
234  else
235  {
236  p->next=q->next;
237  free(q);
238  return head;
239  }
240 }
241 LN * ReverseLinkList(LN * head)
242 {
243  LN *p,*q,*pr;
244  p=head->next;
245  q=NULL;
246  head->next=NULL;
247  while(p)
248  {
249   pr=p->next;
250   p->next=q;
251   q=p;
252   p=pr;
253  }
254  head->next=q;
255  return head;
256 }
257 /*
258 LN *OrderLinkList(LN *head)//链表排序法1
259 {
260  LN *ptn,*p,*minptr,*head1;
261  ptn=(LN *)malloc(sizeof(LN));
262  ptn->next=NULL;
263  head1=ptn;
264  p=head1;
265  while(LinkListLength(head)!=0)
266  {
267   minptr=FindMin(head);
268   ptn=(LN *)malloc(sizeof(LN));
269   ptn->data=minptr->data;
270   ptn->next=NULL;
271   if(LinkListLength(head)==1)
272   {
273    p->next=ptn;
274    DeleteSpecificData(minptr->data,head);
275        p=p->next;
276    free(head);
277    break;
278   }
279   p->next=ptn;
280   DeleteSpecificData(minptr->data,head);
281   p=p->next;
282  }
283  return head1;
284 }
285 */
286 LN * OrderLinkList(LN *head)//链表排序法2(冒泡法排序)
287 {
288  LN *p,*pr;
289  char temp;
290  p=head->next;
291  while(p->next)
292  {
293   pr=p->next;
294   while(pr)
295   {
296    if(pr->data<p->data)
297    {
298     temp=p->data;
299     p->data=pr->data;
300     pr->data=temp;
301    }
302    pr=pr->next;
303   }
304   p=p->next;
305  }
306  return head;
307 }
308 LN *Clear(LN * head)//清除重复数据
309 {
310  LN *q,*p,*ptn;
311  q=head->next;
312  if(q->next==NULL)//链表只有1个数据则直接返回头结点
313  {
314   return head;
315  }
316  else//链表含有2个或以上数据则进行以下操作
317  {
318  p=q->next;
319  
320  while(p)
321  {
322   if(q->data!=p->data)
323   {
324    q=q->next;
325    q->data=p->data;
326   }
327   p=p->next;
328  }
329  ptn=q->next;
330  while(ptn)
331  {
332   p=ptn;
333   ptn=ptn->next;
334   free(p);
335  }
336  q->next=NULL;
337  return head;
338  }
339 }
340 LN *EmptyLinkList(LN * head)//(清空)释放除头节点外的所有节点,释放后仍可以进行链表的各种操作
341 {
342  LN *p,*q;
343  p=head->next;
344  head->next=NULL;
345  while(p)
346  {
347   q=p;
348   p=p->next;
349   free(q);
350  }
351  return head;
352 }
353 void DestroyLinkList(LN *head)//(销毁)链表不再存在,释放了所有节点
354 {
355  EmptyLinkList(head);
356  free(head);
357 }
358  
359 LN *GetTogether(LN *head,LN *head1)//将一个链表中数据全部追加到另一个链表尾部
360 {
361  LN *p1;
362  p1=head1->next;
363  while(p1)
364  {
365   AddDataToTail(p1->data,head);
366   p1=p1->next;
367  }
368  DestroyLinkList(head1);
369  return head;
370 }
371  
372 int main()
373 {
374  int n=0;
375  int choice;
376  char ch;
377  LN *head,*head1,*result;
378  head=CreateLinkList();
379  if(head->next!=NULL)
380  {
381   cout<<"单链表head创建成功!"<<endl;
382  }
383  else
384  {
385   cout<<"创建了空链表head!"<<endl;
386  }
387  while(1)
388  {
389      system("pause");
390   system("cls");
391  cout<<"1.查找指定节点数据"<<endl;
392  cout<<"2.查找指定数据"<<endl;
393  cout<<"3.查找最小数据"<<endl;
394  cout<<"4.插入数据"<<endl;
395  cout<<"5.追加数据"<<endl;
396  cout<<"6.删除指定节点数据"<<endl;
397  cout<<"7.删除指定数据"<<endl;
398  cout<<"8.链表反转"<<endl;
399  cout<<"9.链表排序(非递减)"<<endl;
400  cout<<"10.合并两个链表(非递减)"<<endl;
401  cout<<"11.链表长度"<<endl;
402  cout<<"12.打印链表"<<endl;
403  cout<<"13.清空链表"<<endl;
404  cout<<"14.清除重复数据"<<endl;
405  cout<<"0.退出程序"<<endl;
406  cout<<"请选择操作:";
407  cin>>choice;
408  switch(choice)
409  {
410  case 1: SearchData(n,head);break;
411  case 2:cout<<"输入待查找数据:";cin>>ch;SearchSpecificData(ch,head);break;
412  case 3:result=FindMin(head);cout<<"最小数据:"<<result->data<<endl;break;
413  case 4: result=InsertData(n,head);
414   if(result)
415   {
416          cout<<"数据插入成功!"<<endl;
417   }break;
418  case 5: cout<<"输入要追加的数据:"<<endl;cin>>ch;AddDataToTail(ch,head);cout<<"数据追加成功!"<<endl;break;
419  case 6: result=DeleteData(n,head);
420   if(result)
421   {
422    cout<<"数据删除成功!"<<endl;
423   }break;
424   case 7:cout<<"输入要删除的数据:"<<endl;cin>>ch;result=DeleteSpecificData(ch,head);
425   if(result)
426   {
427    cout<<"该数据删除成功!"<<endl;
428   }break;
429  case 8:cout<<"反转后链表为:";result=ReverseLinkList(head);PrintLinkList(result);break;
430  case 9:cout<<"链表按非递减排列:";result=OrderLinkList(head);PrintLinkList(result);break;
431  case 10:cin.get();head1=CreateLinkList();
432   if(head1->next!=NULL)
433  {
434   cout<<"单链表head1创建成功!"<<endl;
435  }
436  else
437  {
438   cout<<"创建了空链表head1!"<<endl;
439  }
440  head=GetTogether(head,head1);
441  head=OrderLinkList(head);if(head->next){cout<<"合并后链表为:";}
442  PrintLinkList(head);break;
443  case 11: cout<<"链表长度为:"<<LinkListLength(head)<<endl;break;
444  case 12:if(head->next){cout<<"链表为:";}PrintLinkList(head);break;
445  case 13:head=EmptyLinkList(head);cout<<"链表已清空!"<<endl;break;
446  case 14:head=Clear(head);cout<<"重复数据已清除!"<<endl;break;
447  case 0:DestroyLinkList(head);exit(0);
448  default:cout<<"输入错误!"<<endl;break;
449  }
450  }
451  return 0;
452 }

 

欢迎加qq群:882177851

 

 

 

  

 

posted @ 2018-05-13 08:42  好望角的那只鸵鸟  阅读(1311)  评论(0编辑  收藏  举报