单链表的基本操作

来源:互联网 发布:四川广电网络官网 编辑:程序博客网 时间:2024/05/22 12:04

转载地址:http://blog.csdn.net/xyx19890816/article/details/5952502

[cpp] view plaincopy
  1. ////////////////////////////////////////////  
  2. //单链表的初始化,建立,插入,查找,删除。//  
  3.    

  4. ////////////////////////////////////////////   
  5. #include <stdio.h>  
  6. #include <stdlib.h>  
  7. typedef int ElemType;  
  8. ////////////////////////////////////////////   
  9. //定义结点类型   
  10. typedef struct Node  
  11. {  
  12.     ElemType data;              //单链表中的数据域   
  13.     struct Node *next;          //单链表的指针域   
  14. }Node,*LinkedList;  
  15. ////////////////////////////////////////////   
  16. //单链表的初始化  
  17. LinkedList LinkedListInit()  
  18. {  
  19.     Node *L;  
  20.     L = (Node *)malloc(sizeof(Node));   //申请结点空间   
  21.     if(L == NULL)                       //判断是否有足够的内存空间   
  22.         printf("申请内存空间失败/n");  
  23.     L->next = NULL;                  //将next设置为NULL,初始长度为0的单链表   
  24. }  
  25. ////////////////////////////////////////////   
  26. //单链表的建立1,头插法建立单链表  
  27. LinkedList LinkedListCreatH()  
  28. {  
  29.     Node *L;  
  30.     L = (Node *)malloc(sizeof(Node));   //申请头结点空间  
  31.     L->next = NULL;                      //初始化一个空链表  
  32.       
  33.     ElemType x;                         //x为链表数据域中的数据  
  34.     while(scanf("%d",&x) != EOF)  
  35.     {  
  36.         Node *p;  
  37.         p = (Node *)malloc(sizeof(Node));   //申请新的结点   
  38.         p->data = x;                 //结点数据域赋值   
  39.         p->next = L->next;           //将结点插入到表头L-->|2|-->|1|-->NULL   
  40.         L->next = p;   
  41.     }  
  42.     return L;   
  43. }   
  44. ////////////////////////////////////////////   
  45. //单链表的建立2,尾插法建立单链表  
  46. LinkedList LinkedListCreatT()  
  47. {  
  48.     Node *L;  
  49.     L = (Node *)malloc(sizeof(Node));   //申请头结点空间  
  50.     L->next = NULL;                  //初始化一个空链表  
  51.     Node *r;  
  52.     r = L;                          //r始终指向终端结点,开始时指向头结点   
  53.     ElemType x;                         //x为链表数据域中的数据  
  54.     while(scanf("%d",&x) != EOF)  
  55.     {  
  56.         Node *p;  
  57.         p = (Node *)malloc(sizeof(Node));   //申请新的结点   
  58.         p->data = x;                     //结点数据域赋值   
  59.         r->next = p;                 //将结点插入到表头L-->|1|-->|2|-->NULL   
  60.         r = p;   
  61.     }  
  62.     r->next = NULL;   
  63.       
  64.     return L;     
  65. }  
  66. ////////////////////////////////////////////   
  67. //单链表的插入,在链表的第i个位置插入x的元素  
  68. LinkedList LinkedListInsert(LinkedList L,int i,ElemType x)  
  69. {  
  70.     Node *pre;                      //pre为前驱结点   
  71.     pre = L;  
  72.     int tempi = 0;  
  73.     for (tempi = 1; tempi < i; tempi++)  
  74.         pre = pre->next;                 //查找第i个位置的前驱结点   
  75.     Node *p;                                //插入的结点为p  
  76.     p = (Node *)malloc(sizeof(Node));  
  77.     p->data = x;   
  78.     p->next = pre->next;  
  79.     pre->next = p;  
  80.       
  81.     return L;                             
  82. }   
  83. ////////////////////////////////////////////   
  84. //单链表的删除,在链表中删除值为x的元素  
  85. LinkedList LinkedListDelete(LinkedList L,ElemType x)  
  86. {  
  87.     Node *p,*pre;                   //pre为前驱结点,p为查找的结点。   
  88.     p = L->next;  
  89.     while(p->data != x)              //查找值为x的元素   
  90.     {     
  91.         pre = p;   
  92.         p = p->next;  
  93.     }  
  94.     pre->next = p->next;          //删除操作,将其前驱next指向其后继。   
  95.     free(p);  
  96.     return L;  
  97. }   
  98. /////////////////////////////////////////////  
  99. int main()  
  100. {  
  101.     LinkedList list,start;  
  102. /*  printf("请输入单链表的数据:");  
  103.     list = LinkedListCreatH(); 
  104.     for(start = list->next; start != NULL; start = start->next) 
  105.         printf("%d ",start->data); 
  106.     printf("/n"); 
  107. */  printf("请输入单链表的数据:");   
  108.     list = LinkedListCreatT();  
  109.     for(start = list->next; start != NULL; start = start->next)  
  110.         printf("%d ",start->data);  
  111.     printf("/n");  
  112.     int i;  
  113.     ElemType x;  
  114.     printf("请输入插入数据的位置:");  
  115.     scanf("%d",&i);  
  116.     printf("请输入插入数据的值:");  
  117.     scanf("%d",&x);  
  118.     LinkedListInsert(list,i,x);  
  119.     for(start = list->next; start != NULL; start = start->next)  
  120.         printf("%d ",start->data);  
  121.     printf("/n");  
  122.     printf("请输入要删除的元素的值:");  
  123.     scanf("%d",&x);  
  124.     LinkedListDelete(list,x);   
  125.     for(start = list->next; start != NULL; start = start->next)  
  126.         printf("%d ",start->data);  
  127.     printf("/n");  
  128.       
  129.     return 0;  
  130. }   

0 0