单链表基本操作

来源:互联网 发布:淘宝怎样添加多个客服 编辑:程序博客网 时间:2024/05/20 03:37

[cpp] view plaincopy
  1. //vs2005  
  2.   
  3. #include "stdafx.h"  
  4. #include <iostream>  
  5. typedef struct node  
  6. {  
  7.     int data;  
  8.     struct node *next;  
  9. }LNode,*LinkList;  
  10.   
  11.   
  12. /*创建链表:创建一个有头结点的链表,头结点不存放数据,数据从第二个结点(表头结点)开始存放。 
  13.     有没有头结点链表的插入、删除、打印等操作会不同,有头结点通常操作起来更方便,例如可以方便的支持 
  14.     只有一个节点的链表删除结点。 
  15.  
  16.     同时注意,对链表的操作中,插入和删除令p1=head,逆置令p1=head->next 
  17.     前者有利于遍历 
  18.  
  19. */  
  20. LinkList creat()  
  21. {  
  22.     LinkList head,p,s;   
  23.     int x,flag=1;  
  24.     head=(LinkList)malloc(sizeof(LNode));//头指针  
  25.     p=head;  
  26.     printf("输入若干整数并以空格隔开,以回车结束:\n");  
  27.     char ch=' ';  
  28.     while(ch!='\n')  
  29.     {  
  30.         scanf("%d",&x);  
  31.         ch=getchar();//getchar要放在scanf后面  
  32.         if(flag)  
  33.         {  
  34.             s=(LinkList)malloc(sizeof(LNode));  
  35.             s->data=x;  
  36.             //printf("%d",s->data);  
  37.             //printf("\n");  
  38.             p->next=s;//输入的第一个数作为第二个结点(表头结点)  
  39.             p=s;  
  40.         }  
  41.         else flag=0;  
  42.     }  
  43.       
  44.     p->next=NULL;  
  45.     printf("创建成功:\n");  
  46.     return head;  
  47. }  
  48.   
  49.   
  50. /* 
  51.     删除节点:两种情况 
  52.     (1)删除第i个结点,直接删除即可 
  53.     (2)删除值为num的结点,要遍历整个链表,找出所有值为num的结点,全部删除 
  54.  
  55. 下面的代码考虑较复杂的第二种情况(也可以使用递归实现) 
  56.      
  57. */  
  58.   
  59. LinkList del(LinkList head,int num)  
  60. {  
  61.     LinkList p1,p2;  
  62.     p1=head;  
  63.     while(p1->next!=NULL)  
  64.     {  
  65.         if(num!=p1->next->data)  
  66.         {  
  67.             p1=p1->next;  
  68.         }  
  69.         else  
  70.         {  
  71.             p2=p1->next;  
  72.             p1->next=p1->next->next;  
  73.             free(p2);  
  74.         }  
  75.     }  
  76.   
  77.     ////////////////////////////////  
  78.       
  79.     return head;  
  80.   
  81. }  
  82.   
  83.   
  84. //逆置单链表  
  85. LinkList reverse(LinkList head)  
  86. {  
  87.     LinkList p1,p2,p3;  
  88.     //p1=head;  
  89.     p1=head->next;  
  90.     if(p1==NULL)return head;  
  91.     if(p1->next!=NULL)  
  92.     {  
  93.         p2=p1->next;  
  94.         p1->next=NULL;  
  95.         while(p2->next!=NULL)  
  96.         {             
  97.             p3=p2->next;  
  98.             p2->next=p1;  
  99.             p1=p2;  
  100.             p2=p3;  
  101.         }  
  102.         p2->next=p1;  
  103.         head->next=p2;  
  104.     }  
  105.   
  106.     printf("逆置成功:\n");  
  107.     return head;  
  108. }  
  109.   
  110.   
  111.   
  112.   
  113. /*插入操作,常见的操作有: 
  114. (1)插入到指定位置 
  115. (2)插入到有序链表中,插入后仍然保持有序 
  116. */  
  117. LinkList insert(LinkList head)  
  118. {  
  119.      LinkList p0,p1,p2;  
  120.      int num;  
  121.      p1=head;  
  122.      p0=(LinkList)malloc(sizeof(LNode));  
  123.      printf("请输入一个要插入的整数并回车:\n");  
  124.      char ch=' ';  
  125.      while(ch!='\n')  
  126.      {  
  127.         scanf("%d",&num);  
  128.         ch=getchar();  
  129.      }  
  130.        
  131.      p0->data=num;  
  132.      if(head->next==NULL)  
  133.      {  
  134.         head->next=p0;  
  135.         p0->next=NULL;  
  136.         return head;  
  137.      }  
  138.   
  139.      while(p1->next!=NULL&&p0->data>p1->next->data)  
  140.          p1=p1->next;  
  141.   
  142.   
  143.      if(p1->next==NULL)  
  144.      {  
  145.          p1->next=p0;  
  146.          p0->next=NULL;  
  147.      }  
  148.      else if(p0->data<=p1->next->data)  
  149.      {        
  150.          p0->next=p1->next;  
  151.          p1->next=p0;      
  152.      }  
  153.      printf("插入成功:\n");  
  154.      return head;  
  155.   
  156. }  
  157.   
  158.   
  159. //打印链表  
  160. void print(LinkList head)  
  161. {  
  162.   
  163.     LinkList p;  
  164.     if(head->next!=NULL)  
  165.     {  
  166.         p=head->next;  
  167.           
  168.             while(p->next!=NULL)  
  169.             {  
  170.                 printf("%d->",p->data);  
  171.                 p=p->next;  
  172.             }  
  173.             printf("%d",p->data);  
  174.   
  175.     }  
  176.       
  177.     printf("\n");  
  178.       
  179.       
  180.   
  181. }  
  182. int _tmain(int argc, _TCHAR* argv[])  
  183. {  
  184.   
  185.   
  186.     LinkList p;  
  187.     p=creat();  
  188.     print(p);  
  189.     int num;  
  190.     printf("你要删除哪个元素,请输入:\n");  
  191.     scanf("%d",&num);  
  192.     p=del(p,num);  
  193.     print(p);  
  194.     p=insert(p);  
  195.     print(p);  
  196.     p=reverse(p);  
  197.     print(p);  
  198.     return 0;  
  199. }  

原文地址:点击打开链接

原创粉丝点击