单链表基本操作

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