码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 算法&数据结构 - 线性表之静态链表、循环链表、双向链表


            除了上文所介绍的最常见的单链表,本文简单介绍一下线性的其他链式存储结构表,本篇较多代码。

    目录

    静态链表

    插入、删除操作

    优缺点

    循环链表

    双向链表

    线性表总结


    静态链表

            如果没有指针,无法使用指针指向下一个元素地址,链表也就无法按我们之前所说的那样实现了。那怎么办能既存储数据域(data)的信息又存储指针域(cur)的信息?

            我们用数组来描述链表,这样的链表就叫做静态链表。

    1. #define MAXSIZE 1000 /* 存储空间初始分配量 */
    2. /* 线性表的静态链表存储结构 */
    3. typedef struct
    4. {
    5. ElemType data;
    6. int cur; /* 游标(Cursor) ,为0时表示无指向 */
    7. } Component,StaticLinkList[MAXSIZE];

    插入、删除操作

    1. /* 插入 */
    2. Status ListInsert(StaticLinkList L, int i, ElemType e)
    3. {
    4. int j, k, l;
    5. k = MAXSIZE - 1; /* 注意k首先是最后一个元素的下标 */
    6. if (i < 1 || i > ListLength(L) + 1)
    7. return ERROR;
    8. j = Malloc_SSL(L); /* 获得空闲分量的下标 */
    9. if (j)
    10. {
    11. L[j].data = e; /* 将数据赋值给此分量的data */
    12. for(l = 1; l <= i - 1; l++) /* 找到第i个元素之前的位置 */
    13. k = L[k].cur;
    14. L[j].cur = L[k].cur; /* 把第i个元素之前的cur赋值给新元素的cur */
    15. L[k].cur = j; /* 把新元素的下标赋值给第i个元素之前元素的ur */
    16. return OK;
    17. }
    18. return ERROR;
    19. }
    20. /* 删除 */
    21. Status ListDelete(StaticLinkList L, int i)
    22. {
    23. int j, k;
    24. if (i < 1 || i > ListLength(L))
    25. return ERROR;
    26. k = MAXSIZE - 1;
    27. for (j = 1; j <= i - 1; j++)
    28. k = L[k].cur;
    29. j = L[k].cur;
    30. L[k].cur = L[j].cur;
    31. Free_SSL(L, j);
    32. return OK;
    33. }

    优缺点

    优点

    • 插入、删除时修改游标不需要移动元素,改进了顺序结构中原本复杂的插入、删除操作

    缺点 

    • 连续存储空间表长难以确定;
    • 失去了随机存取的特性。

    循环链表

    最后一个结点的指针域指到头结点,链表闭合。

    将两个循环链表连接起来:

    1. p=rearA->next; /* 保存A表的头结点 */
    2. rearA->next=rearB->next->next; /* 将本是指向B表的第一个结点(不是头结点)*/
    3. /* 赋值给reaA->next*/
    4. q=rearB->next;
    5. rearB->next=p; /* 将原A表的头结点赋值给rearB->next */
    6. free(q); /* 释放q */

    双向链表

            我们的指针按顺序指下来,在单链表中是不可逆的,也就是通过上一个结点可以找到下一个,但下一个节点找不到上一个。在每个节点中,再设置一个指向前一节点的指针,就成了双向链表。

     如果是循环的双项链表呢?

    1. /*线性表的双向链表存储结构*/
    2. typedef struct DulNode
    3. {
    4. ElemType data;
    5. struct DuLNode *prior; /*直接前驱指针*/
    6. struct DuLNode *next; /*直接后继指针*/
    7. } DulNode, *DuLinkList;
    8. p->next->prior = p = p->prior->next
    9. s - >prior = p; /*把p赋值给s的前驱*/
    10. s -> next = p -> next; /*把p->next赋值给s的后继*/
    11. p -> next -> prior = s; /*把s赋值给p->next的前驱*/
    12. p -> next = s; /*把s赋值给p的后继*/
    13. p->prior->next=p->next; /*把p->next赋值给p->prior的后继*/
    14. p->next->prior=p->prior; /*把p->prior赋值给p->next的前驱*/
    15. free(p); /*释放结点*/

    线性表总结

            线性表是最基本、最简单、也是最常用的一种数据结构。线性表是数据结构中的一种,一个线性表是n个具有相同特性的数据元素的有限序列。

     

     

    欢迎点赞、收藏、评论区交流,转载标明出处。

    -----------------------------

    上文连接:

    算法&数据结构 - 线性表及其链式存储结构_昊昊该干饭了的博客-CSDN博客本篇主要介绍线性表另一种存储形式,链式存储结构及其操作方法,本篇中量代码。https://blog.csdn.net/qq_52213943/article/details/125824927

    下文连接:

    敬请期待:栈与队列详解

  • 相关阅读:
    【最全日期获取合集】js获取昨天,今天,明天,上周,本周,下周,上月,本月,下月,去年,本年,明年,上季度,本季度,下季度,向前推日期等【全覆盖,拿来即用】
    将master分支的代码合并到你自己的分支
    vue 修改props
    【C进阶】指针笔试题解析
    安卓的一些官方测试案例
    前端 获取API的响应时间 的方法总结
    JDK11优化了哪些功能以及新增了哪些特性功能|JDK各个版本的特性分析
    Redis Cluster高可用集群原理
    Knife4j使用教程(二) -- 配置Swagger相关信息
    处理机的调度与死锁
  • 原文地址:https://blog.csdn.net/qq_52213943/article/details/125879485
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号