找回密码
 立即注册
首页 业界区 安全 线性结构之链表

线性结构之链表

啸妹回 2025-9-22 22:46:03
离散存储[链表]:
  定义:
    n个结点的离散分配
    彼此通过指针相连
    每个结点只有一个前续结点
    每个结点只有一个后续结点
    首结点没有前续结点
    尾结点没有后续结点
  专业术语:
    首结点:第一个有效结点,存放第一个有效数据
    尾结点:最后一个有效结点,存放最后一个有效数据
    头结点:在首结点之前的一个结点,既不存放有效数据,也不存放有效结点的个数,加头结点的主要目的是为了方便对链表的操作,头结点的数据类型和其他结点的数据类型是一样的
    头指针:指向头结点的指针变量,存放了头结点的地址
    尾指针:指向尾结点的指针变量,存放了尾结点的地址
  确定一个链表至少需要哪些参数:
    只需要一个参数:头指针
    因为我们通过头指针就可以推出链表的其他所有信息
  链表的分类:
    单链表:每一个结点只有一个指针域
    双链表:每一个结点有两个指针域
    循环链表:能通过任何一个结点找到其他所有的结点
    非循环链表
 
  算法:
    狭义的算法是与数据存储方式密切相关的
    广义的算法与数据存储方式无关
    泛型:你用某种技术达到的效果就是:不同的存储方式,执行的操作是一样的
  1. /*
  2. @file      main.c
  3. @brief     线性结构之链表
  4. @author    EricsT (EricsT@163.com)
  5. @version   v1.0.0
  6. @date      2025-09-21
  7. @history   2025-09-21 EricsT - 新建文件
  8.            2025-09-22 EricsT - 新增 CreateList\TraverseList
  9.            2025-09-22 EricsT - 新增 isEmptyList\GetLenthList\InsertList\DeleteList\SortList
  10. */
  11. #include <stdio.h>
  12. #include <malloc.h>
  13. #include <stdlib.h>
  14. typedef struct Node
  15. {
  16.         int data;//数据域
  17.         Node* ptrNext;//指针域
  18. }* PtrNode, NODE;//NODE 相当于 Node NODE//ptrNode 相当于 Node* ptrNode
  19. PtrNode CreateList();//创建链表
  20. void TraverseList(const PtrNode ptrNode);//遍历链表
  21. bool isEmptyList(const PtrNode ptrNode);//是否为空
  22. int GetLenthList(const PtrNode ptrNode);//获取链表长度
  23. bool InsertList(PtrNode ptrNode, int insertPos, int insertData);//插入结点
  24. bool DeleteList(PtrNode ptrNode, int deletePos);//删除结点
  25. void SortList(PtrNode ptrNode);//排序
  26. int main(void)
  27. {
  28.         PtrNode ptrNode = NULL;
  29.         ptrNode = CreateList();
  30.         TraverseList(ptrNode);
  31.         if (isEmptyList(ptrNode))
  32.                 printf("链表为空\n");
  33.         else
  34.                 printf("链表非空\n");
  35.         printf("链表长度为:%d\n", GetLenthList(ptrNode));
  36.         int insertPose;
  37.         printf("请输入插入位置");
  38.         scanf("%d", &insertPose);
  39.         int insertValue;
  40.         printf("请输入插入数值");
  41.         scanf("%d", &insertValue);
  42.         InsertList(ptrNode, insertPose, insertValue);
  43.         TraverseList(ptrNode);
  44.         int deletePose;
  45.         printf("请输入删除位置");
  46.         scanf("%d", &deletePose);
  47.         DeleteList(ptrNode, deletePose);
  48.         TraverseList(ptrNode);
  49.         SortList(ptrNode);
  50.         TraverseList(ptrNode);
  51.         return 0;
  52. }
  53. PtrNode CreateList()
  54. {
  55.         int len;
  56.         printf("请输入结点个数len = ");
  57.         scanf("%d", &len);
  58.         int addr = 0;
  59.         PtrNode ptrNodeFirst = (PtrNode)malloc(sizeof(NODE));//头结点
  60.        
  61.         if (NULL == ptrNodeFirst)
  62.         {
  63.                 printf("分配失败\n");
  64.                 exit(-1);
  65.         }
  66.         PtrNode ptrNodeLast = ptrNodeFirst;//尾结点
  67.         ptrNodeLast->ptrNext = NULL;
  68.         for (int i = 0; i < len; ++i)
  69.         {
  70.                 PtrNode ptrNode = (PtrNode)malloc(sizeof(PtrNode));//新的尾结点
  71.                 if (NULL == ptrNodeFirst)
  72.                 {
  73.                         printf("分配失败\n");
  74.                         exit(-1);
  75.                 }
  76.                 ptrNodeLast->ptrNext = ptrNode;//新的尾结点挂在旧的尾结点后面
  77.                 printf("请输入%d个结点的数值", i + 1);
  78.                 scanf("%d", &ptrNode->data);
  79.                 ptrNode->ptrNext = NULL;
  80.                 ptrNodeLast = ptrNode;//更新尾结点
  81.         }
  82.         return ptrNodeFirst;
  83. }
  84. void TraverseList(const PtrNode ptrNode/*头结点*/)
  85. {
  86.         PtrNode ptrNode_ = ptrNode->ptrNext;//首节点
  87.        
  88.         while (NULL != ptrNode_)//结点为空,则是尾结点
  89.         {
  90.                 printf("%d ", ptrNode_->data);
  91.                 ptrNode_ = ptrNode_->ptrNext;//下一结点
  92.         }
  93.         printf("\n");
  94. }
  95. bool isEmptyList(const PtrNode ptrNode)
  96. {
  97.         PtrNode ptrNode_ = ptrNode->ptrNext;//首节点
  98.         if (NULL == ptrNode->ptrNext)
  99.                 return true;
  100.         return false;
  101. }
  102. int GetLenthList(const PtrNode ptrNode)
  103. {
  104.         int iLen = 0;
  105.         PtrNode ptrNode_ = ptrNode->ptrNext;//首节点
  106.         while (NULL != ptrNode_)//结点为空,则是尾结点
  107.         {
  108.                 ptrNode_ = ptrNode_->ptrNext;//下一结点
  109.                 iLen++;
  110.         }
  111.         return iLen;
  112. }
  113. bool InsertList(PtrNode ptrNode, int insertPos, int insertData)
  114. {
  115.         if (insertPos < 1)
  116.                 return false;
  117.         if (insertPos > (GetLenthList(ptrNode) + 1))
  118.                 return false;
  119.         PtrNode ptrNodeInsert = (PtrNode)malloc(sizeof(Node));
  120.         ptrNodeInsert->data = insertData;
  121.         PtrNode ptrNodeCur = ptrNode;
  122.         for (int i = 1; i < insertPos; ++i)
  123.                 ptrNodeCur = ptrNodeCur->ptrNext;
  124.         ptrNodeInsert->ptrNext = ptrNodeCur->ptrNext;
  125.         ptrNodeCur->ptrNext = ptrNodeInsert;
  126.         return true;
  127. }
  128. bool DeleteList(PtrNode ptrNode, int deletePos)
  129. {
  130.         if (deletePos < 1)
  131.                 return false;
  132.         if (deletePos > GetLenthList(ptrNode))
  133.                 return false;
  134.         PtrNode ptrNodeCur = ptrNode;
  135.         for (int i = 1; i < deletePos; ++i)
  136.                 ptrNodeCur = ptrNodeCur->ptrNext;
  137.         ptrNodeCur->ptrNext = ptrNodeCur->ptrNext->ptrNext;
  138.         return true;
  139. }
  140. void SortList(PtrNode ptrNode)
  141. {
  142.         int iLen = GetLenthList(ptrNode);
  143.         PtrNode ptrNodeCur = ptrNode;//头结点
  144.         for (int i = 0; i < iLen; ++i)
  145.         {
  146.                 ptrNodeCur = ptrNodeCur->ptrNext;
  147.                 PtrNode ptrNodeNext = ptrNodeCur->ptrNext;
  148.                 while (NULL != ptrNodeNext)
  149.                 {
  150.                         if (ptrNodeCur->data > ptrNodeNext->data)
  151.                         {
  152.                                 int temp = ptrNodeCur->data;
  153.                                 ptrNodeCur->data = ptrNodeNext->data;
  154.                                 ptrNodeNext->data = temp;
  155.                         }
  156.                         ptrNodeNext = ptrNodeNext->ptrNext;
  157.                 }
  158.         }
  159. }
复制代码
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

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