C语言:建立完整的单向动态链表(包括初始化、创造、插入、删除、查找、销毁、输出)

C语言:建立完整的单向动态链表(包括初始化、创建、插入、删除、查找、销毁、输出)
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef struct node
  4. {
  5.      int data;//数据部分
  6.      struct node *next;//指针部分
  7. }Node;
  8. typedef Node List;
  9. //初始化链表
  10. List* initList();
  11. //销毁链表
  12. void destoryList(List *list);
  13. //插入数据
  14. void insertData(List *list,int Data);
  15. //删除数据
  16. void removeData(List *list,int Data);
  17. //查找数据
  18. Node* findData(List *list,int Data);
  19. //打印链表内容
  20. void printList(List *list);
  21. int main()
  22. {
  23.         //初始化链表
  24.         List *list = initList(); 
  25.         //插入数据
  26.         for(int i=0; i<10; i++)
  27.         {
  28.              insertData(list,i);
  29.         }
  30.         printList(list);
  31.         //查找数据
  32.         printf("5的地址:%p\n",findData(list,5));
  33.         printf("10的地址:%p\n",findData(list,10));
  34.         //删除数据
  35.         removeData(list,0);
  36.         printList(list);
  37.         //销毁链表
  38.         destoryList(list);
  39. return 0;
  40. }
  41. //初始链表
  42. List* initList()
  43. {
  44.         List *list = (List*)malloc(sizeof(Node));
  45.         list->data = 0;
  46.         list->next = NULL;
  47.         return list;
  48. }
  49. //销毁链表
  50. void destoryList(List *list)
  51. {
  52.         Node *pHead = list;//用来记录初始化的链表头结点
  53.         while(list != NULL)
  54.         {
  55.                   //先移到下一个结点
  56.                   list = list->next;
  57.                   //释放头结点
  58.                   free(pHead);
  59.                   //记录新的头结点
  60.                  pHead = list;
  61.          }
  62. }
  63. //插入数据(一般都在表尾插入数据)
  64. void insertData(List *list,int Data)
  65. {
  66.          //先分配一个新的结点
  67.         Node *pNode = (Node*)malloc(sizeof(Node));
  68.         pNode->data = Data;
  69.         pNode->next = NULL;
  70.         //将新结点链接到到尾部
  71.        while(list->next != NULL)
  72.        {
  73.                   list = list->next;//先找到链表的尾结点
  74.         }
  75.        list->next = pNode;//将新结点链接到尾结点
  76. }
  77. //删除数据(头结点不可删除,不然后面的结点就无法再进行遍历了)
  78. void removeData(List *list,int Data)
  79. {
  80.         //1.查找结点,并记录上一个结点
  81.         //Node *pPre = NULL;
  82.         Node *pPre = list;
  83.         list = list->next;//跳过头结点
  84.         while(list!= NULL)
  85.         {
  86.                  if(list->data == Data)
  87.                 {
  88.                               break;
  89.                 }
  90.                 pPre = list;
  91.                 list = list->next;
  92.        }
  93.        if(list!=NULL)
  94.        {
  95.                 //2.找到后,将上一个结点和当前结点的下一个结点链接
  96.                 pPre->next = list->next;
  97.                //3.删除当前结点
  98.                 free(list);
  99.       }
  100. }
  101. //查找数据
  102. Node* findData(List *list,int Data)
  103. {
  104.      while(list!= NULL)
  105.      {
  106.                  if(list->data == Data)
  107.                 {
  108.                       break;
  109.                 }
  110.                list = list->next;
  111.       }
  112. return list;
  113. }
  114. //打印链表内容
  115. void printList(List *list)
  116. {
  117.       list = list->next;//跳过头结点
  118.       while(list!= NULL)
  119.       {
  120.                printf("%5d",list->data);
  121.               list = list->next;
  122.       }
  123.       printf("\n");
  124. }