数据结构—双向链表

金歌  论坛元老 | 2024-9-23 19:47:37 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1058|帖子 1058|积分 3174

结构


   带头链表里的头结点,现实为“哨兵位”,哨兵位结点不存储任何有用元素,只是站在这里“放哨     的”   

实现双向链表

List.h

  1. #pragma once
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<assert.h>
  5. #include<stdbool.h>
  6. //定义双向链表结点的结构
  7. typedef int LTDataType;
  8. typedef struct ListNode
  9. {
  10.         int data;
  11.         struct ListNode* next;
  12.         struct ListNode* prev;
  13. }LTNode;
  14. //初始化
  15. //void LTInit(LTNode** pphead);
  16. LTNode* LTInit();
  17. void LTPrint(LTNode* phead);
  18. //插入
  19. //1.传一级还是二级,要看pphead指向的结点会不会发生改变
  20. //2.如果发生改变,那么pphead的改变要影响实参,传二级
  21. //3.如果不发生改变,pphead不会影响实参,传一级
  22. void LTPushBack(LTNode* phead, LTDataType x);
  23. void LTPushFront(LTNode* phead, LTDataType x);
  24. //删除
  25. void LTPopBack(LTNode* phead);
  26. void LTPopFront(LTNode* phead);
  27. bool LTEmpty(LTNode* phead);
  28. //查找
  29. LTNode* LTFind(LTNode* phead, LTDataType x);
  30. //在pos位置之后插入结点
  31. void LTInsert(LTNode* pos, LTDataType x);
  32. //删除指定位置的结点
  33. void LTErase(LTNode* pos);
  34. //销毁
  35. void LTDesTroy(LTNode** pphead);
  36. //为了保持接口的一致性,优化接口都为一级指针
  37. void LTDesTroy2(LTNode* phead);
复制代码
 List.c

  1. #include"List.h"
  2. LTNode* LTBuyNode(LTDataType x)
  3. {
  4.         LTNode* newnode = (LTNode*)malloc(sizeof(LTNode));
  5.         if (newnode == NULL)
  6.         {
  7.                 perror("malloc fail");
  8.                         exit(1);
  9.         }
  10.         newnode->data = x;
  11.         newnode->next = newnode->prev = newnode;
  12. }
  13. //初始化
  14. //void LTInit(LTNode** pphead)
  15. //{
  16. //        //创建一个头结点(哨兵位)
  17. //        *pphead = LTBuyNode(-1);
  18. //
  19. //}
  20. LTNode* LTInit()
  21. {
  22.         LTNode* phead = LTBuyNode(-1);
  23.         return phead;
  24. }
  25. void LTPushBack(LTNode* phead, LTDataType x)
  26. {
  27.         assert(phead);
  28.         LTNode* newnode = LTBuyNode(x);
  29.         newnode->next = phead;
  30.         newnode->prev = phead->prev;
  31.         phead->prev->next = newnode;
  32.         phead->prev = newnode;
  33. }
  34. void LTPushFront(LTNode* phead, LTDataType x)
  35. {
  36.         assert(phead);
  37.         LTNode* newnode = LTBuyNode(x);
  38.         newnode->next = phead->next;
  39.         newnode->prev = phead;
  40.        
  41.         phead->next->prev = newnode;
  42.         phead->next = newnode;
  43. }
  44. void LTPrint(LTNode* phead)
  45. {
  46.         LTNode* pcur = phead->next;
  47.         while (pcur!=phead)
  48.         {
  49.                 printf("%d->", pcur->data);
  50.                 pcur = pcur->next;
  51.         }
  52.         printf("\n");
  53. }
  54. bool LTEmpty(LTNode* phead)
  55. {
  56.         assert(phead);
  57.         return phead->next == phead;
  58. }
  59. void LTPopBack(LTNode* phead)
  60. {
  61.         assert(phead);
  62.         assert(!LTEmpty(phead));
  63.         LTNode* del = phead->prev;
  64.         LTNode* prev = del->prev;
  65.         prev->next = phead;
  66.         phead->prev = prev;
  67.         free(del);
  68.         del = NULL;
  69. }
  70. void LTPopFront(LTNode* phead)
  71. {
  72.         assert(phead);
  73.         assert(!LTEmpty(phead));
  74.         LTNode* del = phead->next;
  75.         del->next->prev = phead;
  76.         phead->next = del->next;
  77.         free(del);
  78.         del = NULL;
  79. }
  80. LTNode* LTFind(LTNode* phead, LTDataType x)
  81. {
  82.         assert(phead);
  83.         LTNode* pcur = phead->next;
  84.         while(pcur != phead)
  85.         {
  86.                 if (pcur->data == x)
  87.                 {
  88.                         return pcur;
  89.                 }
  90.                 pcur = pcur->next;
  91.         }
  92.         return NULL;
  93. }
  94. void LTInsert(LTNode* pos, LTDataType x)
  95. {
  96.         assert(pos);
  97.         LTNode* newnode = LTBuyNode(x);
  98.         newnode->next = pos->next;
  99.         newnode->prev = pos;
  100.         pos->next->prev = newnode;
  101.         pos->next = newnode;
  102. }
  103. void LTErase(LTNode* pos)
  104. {
  105.         assert(pos);
  106.         pos->prev->next = pos->next;
  107.         pos->next->prev = pos->prev;
  108.         free(pos);
  109.         pos = NULL;
  110. }
  111. void LTDesTroy(LTNode** pphead)
  112. {
  113.         assert(pphead && *pphead);
  114.         LTNode* pcur = (*pphead)->next;
  115.         while (pcur!=*pphead)
  116.         {
  117.                 LTNode* Next = pcur->next;
  118.                 free(pcur);
  119.                 pcur = Next;
  120.         }
  121.        
  122.          //销毁哨兵位结点
  123.         free(*pphead);
  124.         *pphead = NULL;
  125.         pcur = NULL;
  126. }
  127. void LTDesTroy2(LTNode* phead)
  128. {
  129.         assert(phead);
  130.         LTNode* pcur = phead->next;
  131.         while (pcur != phead)
  132.         {
  133.                 LTNode* Next = pcur->next;
  134.                 free(pcur);
  135.                 pcur = Next;
  136.         }
  137.         free(phead);
  138.         phead = pcur = NULL;
  139. }
复制代码
test.c

  1. #include"List.h"
  2. void ListTest01()
  3. {
  4.         //创建双向链表
  5.         /*LTNode* plist = NULL;
  6.         LTInit(&plist);*/
  7.     LTNode*plist=LTInit();
  8.         LTPushBack(plist, 1);
  9.         LTPushBack(plist, 2);
  10.         LTPushBack(plist, 3);
  11.         LTPushBack(plist, 4);
  12.         LTPrint(plist);
  13.         /*LTPushFront(plist, 1);
  14.         LTPrint(plist);
  15.         LTPushFront(plist, 2);
  16.         LTPrint(plist);
  17.         LTPushFront(plist, 3);
  18.         LTPrint(plist);
  19.         LTPushFront(plist, 4);
  20.         LTPrint(plist);*/
  21.         /*LTPopBack(plist);
  22.         LTPrint(plist);
  23.         LTPopBack(plist);
  24.         LTPrint(plist);
  25.         LTPopBack(plist);
  26.         LTPrint(plist);
  27.         LTPopBack(plist);
  28.         LTPrint(plist);*/
  29.         /*LTPopFront(plist);
  30.         LTPrint(plist);
  31.         LTPopFront(plist);
  32.         LTPrint(plist);
  33.         LTPopFront(plist);
  34.         LTPrint(plist);
  35.         LTPopFront(plist);
  36.         LTPrint(plist);*/
  37.         //LTNode* pos = LTFind(plist, 2);
  38.         /*if (pos == NULL)
  39.         {
  40.                 printf("没有找到!\n");
  41.         }
  42.         else
  43.         {
  44.                 printf("找到了!\n");
  45.         }*/
  46.         /*LTInsert(pos, 13);
  47.         LTPrint(plist);*/
  48.         /*LTErase(pos);
  49.         LTPrint(plist);*/
  50.         //LTDesTroy(&plist);
  51.         LTDesTroy2(plist);
  52. }
  53. int main()
  54. {
  55.         ListTest01();
  56.         return 0;
  57. }
复制代码
序次表和链表的分析



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

金歌

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表