静态链表

目的:为没有指针的程序语言所设计的实现单链表的方法

静态链表(游标实现法)

数组的元素被分为两个数据域data和cur

静态链表的定义与初始化

/*静态链表定义*/
#define MAXSIZE 1000
typedef struct
{ElemType data;/*这里ElemType是数据域要存储的某种数据类型*/int cur;
}Component,StaticLinkList[MAXSIZE];/*快捷定义结构数组的方法*/
/*语句StaticLinkList A就等价于Component A[MAXSIZE]*/

数组的第一个元素cur存放**备用链表第一个结点的下标,数组最后一个元素cur存放数组第一个有数值元素的下标**(在全表为空时为0,类似于头指针的作用)。链表最后一个元素其下一位置数据为空cur用0表示。

/*静态链表初始化*/
Status InitList(StaticLinkList space)/*space是结构数组,space[0].cur为头指针*/
{int i;for(i=0;i<MAXSIZE-1;i++)space[i].cur=i+1;//将链表按照数组顺序指定space[MAXSIZE-1].cur=0;//更改最后一个链表指针return OK;
}

根据上述的下标规则,假设完成数据填入后的静态链表,其cur与下标的关系如图所示。

静态链表插入操作

  • 情况1:在尾端插入新元素
/*在尾端插入新元素*/
int Malloc_SLL(StaticLinkList space)
{int i=space[0].cur;/*获取备用链表第一个元素下标*/if(space[0].cur)space[0].cur=space[i].cur;/*调整第一个元素游标*//*由于备用链表的第一个元素要被使用了,因此要将它的下一个元素作为备用链表的第一个元素*/return i;
}
  • **情况2:**在列表中间插入新元素:先插入到最后,在调整cur

例如在乙和丁之间插入丙,只需要先在下标7位置处存入丙,然后修改乙的游标指向丙,再修改丙的游标指向丁即可完成。

/*在静态链表L的第i个元素之前插入新的数据元素e*/
Syayis ListInsert(StaticLinkList L,int i,ElemType e)
{int j,k,l;k=MAX_SIZE-1;//k是最后一个元素的下标if(i<1||i>ListLength(L)+1)return ERROR;j=Malloc_SSL(L);//获取分配出的空闲元素的下标if(j){L[j].data=e;//先把元素存入分配空间for(l=1;l<i-1;l++)k=L[k].cur;/*通过指针不断迭代的方式,找到第i个元素之前的下标*/L[j].cur=L[k].curL[k].cur=j;return OK}return ERROR;
}

静态链表删除操作

简单描述为

1.脱链释放 将前后元素链接,完成释放。

如上图,无论是要删除已经使用的元素A,B还是C之中的一个,都先找到其上游元素。(遍历)如A的上游元素是末个元素。B的上游元素是A。

以删除B为例。找到上游元素,即A元素后,将其指向B的下一个元素C。如图。

2. 加入备用头 被释放元素成为备用链表首位元素。

​ 主要分为两步

  • 被释放元素指向原备用链表首元素
  • 数组首个元素指向该被释放元素

至此,B就被释放到了备用链表区域

/*删除在L中第i个数据元素e*/
Status ListDelete(StaticLinkList L,int i)
{int j,k;if(i<1||i>ListLength(L))//遍历法计算链表已使用元素个数return ERROR;k=MAX_SIZE-1;/*指向数组末个元素*/for(j=1;j<=i-1;j++)/*循环结束后,得到第i-1个元素的下标k*/k=L[k].cur;j=L[k].cur;/*j为第i个元素的下标*/L[k].cur=L[j].cur;//1.脱链释放Free_SSL(L,j);//2.加入备用头return OK;
}
void Free_SSL(StaticLinkList space,int k)
{space[k].cur=space[0].cur;/*2.1被释放元素指向原备用链表首元素*/space[0].cur=k;/*2.2数组首个元素指向该被释放元素*/
}

循环链表

将单链表终端的结点指针部分由空指针改为指向头结点,形成==循环链表(circular linked list)==

循环链表所解决的问题是,单链表由于其单向性,无法回溯。循环链表可以从任何一个结点触发,访问到链表的全部结点。

由于该结构访问最后一个结点效率太低,将头指针改为尾指针

双向链表

在单链表的每个结点中,再设置一个指向其前驱结点的指针域,形成==双向链表(double linked list)==。

结点中有两个指针域,一个指向直接后继,一个指向直接前驱

链表例题

链表逆转

题目来源:https://pintia.cn/problem-sets/15/problems/724

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {ElementType Data;PtrToNode   Next;
};
typedef PtrToNode List;List Read();
void Print( List L );
List Reverse( List L );int main()
{List L1, L2;L1 = Read();std::cout<<"\033[0;32mread OK \033[0m"<<std::endl;L2 = Reverse(L1);std::cout<<"\033[0;32mreverse OK \033[0m"<<std::endl;Print(L1);Print(L2);return 0;
}/* 你的代码将被嵌在这里 */
List Read()
{int n,i;List L,p;p=L=(List)malloc(sizeof(Node));scanf("%d ",&n);//获取链表长度for(i=0;i<n;i++){p->Next=(List)malloc(sizeof(Node));p=p->Next;std::cin>>p->Data;//数据流格式读取的好处,可以同时匹配换行符或者空格分割的输入}p->Next=NULL;return L;
}
void Print( List L )
{while(L->Next!=NULL){L=L->Next;std::cout<<L->Data<<" ";}std::cout<<std::endl;
}
List Reverse(List L)
{   List p,q,r;p=L->Next;q=p->Next;r=q->Next;p->Next=NULL;while(r!=NULL){   q->Next=p;p=q;q=r;r=q->Next;}q->Next=p;r=(List)malloc(sizeof(Node));r->Next=q;return r;
}
/*结果显示如下*/
1 3 4 5 2
read OK
reverse OK
1
2 5 4 3 1

【DS基础】静态链表相关推荐

  1. C语言基础-单向链表静态结构与动态结构删除(跳过)结点

    非真正意义上的删除节点,而是将该链表其中一个结点断开,连接到下一个结点 静态链表示例题目: 为五个学生的信息建立一个静态链表,每个学生信息结构如下: 学号 姓名 成绩 要求输入一个学号值,删除链表中该 ...

  2. 【C语言X数据结构】用静态链表实现的多项式计算器,加减乘除求导求值,输入输出样样在行!(完整代码+注释)

    目录 实验要求 完整代码 逻辑设计 哈喽各位好,我是李博轩,一个刚转到计算机的大二学生.这个标题是随手打上去的,感觉还蛮顺口,就这样了. 这个学期在学[数据结构与算法],而这是我面对的第一个实验题.因 ...

  3. 高级线性表——静态链表(最全静态链表解读)

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  4. 线性表:4.结合顺序表和链表——静态链表及C语言实现

    另外一种链式表示--静态链表,之前两篇说的都是动态表. 逻辑结构上相邻的数据元素,存储在指定的一块内存空间中,数据元素只允许在这块内存空间中随机存放,这样的存储结构生成的链表称为静态链表. 静态链表和 ...

  5. java静态链表_静态链表及其创建(C语言实现)

    <顺序表和链表优缺点>一节,我们了解了两种存储结构各自的特点,那么,是否存在一种存储结构,可以融合顺序表和链表各自的优点,从而既能快速访问元素,又能快速增加或删除数据元素. 静态链表,也是 ...

  6. 线性表详解(静态链表、单链表、双向链表、循环链表)

    目录 申明 1. 线性表的定义 2. 线性表的抽象数据类型 3. 线性表的顺序存储结构 3. 1 顺序存储定义 3. 2 顺序存储方式 3. 3 数据长度与线性表长度区别 3. 4 地址计算方法 4. ...

  7. C语言建立简单的静态链表

    学习次内容前需掌握结构体和指针的使用方法,此链表为最基础的静态链表. #include <stdio.h> struct Student{int num;float score;struc ...

  8. 数据结构04:静态链表

    摘要:事实上,静态链表可以让我们更好地理解空间分配机制.由我们对一片空间来进行分配管理,如我们在链表中就用到了int *used来检查这篇空间是否被占用,模拟操作系统是如何判断一片空间是否被占用. 再 ...

  9. 数据结构与算法(2-2)线性表之链式存储(单链表、静态链表、循环链表、双向循环链表)

    目录 一.单链表 1.存储方式 2.插入 3.删除 总代码: 二.静态链表 1.存储方式 2.插入 3.删除 4.遍历 总代码: 三.循环链表 总代码: 四.双向循环链表 1.存储方式: 2.插入和删 ...

  10. 静态链表实现(A-B)+(B-A)【代码】

    -----------------------------------------------第一次发代码,写在前面------------------------------------------ ...

最新文章

  1. opencv拟合高维曲线
  2. ystem.Windows.Forms.SplitContainer : ContainerControl, ISupportInitialize
  3. 【免费分享】KotaLog Diary2022年计划电子手账本
  4. 导入Jquery.min.js时 JQuery 上打红X了
  5. Spring的两种动态代理:Jdk和Cglib 的区别和实现
  6. EE Servlet 3:简单表单处理
  7. linux生成文件清单,Linux 获取文件名称生成列表 txt - create_filelist
  8. 绘制矩形php,php绘制一个矩形的方法
  9. Fiddler-半自动构造少量数据
  10. VisualStudio 2013开发Office插件
  11. 正则表达式在NLP的基本应用
  12. 服务器打微软补丁后无法启动,关于打了最新微软补丁后,针式打印机突然不好打印的处理方法。...
  13. 高等数学复盘 | 第七册上册第一章——第六章思维导图梳理(复习专用)
  14. 机器学习基础算法(5)
  15. oracle中文转全拼音,汉字转拼音的Oracle函数
  16. 山东大学创新项目实训个人工作日志(十四)
  17. 达梦数据库出现故障无法启动解决方法-通过归档日志修复数据库
  18. 电商领域知识图谱:常识抽取,表示与应用
  19. 从Antd 源码到自我实现之 Form表单
  20. 解决vue项目路由出现message: “Navigating to current location (XXX) is not allowed“的问题

热门文章

  1. 视频“云、边、端”全流程支持H.265,意味着更低的流量成本与更高的视频质量,计算压力都在边缘侧
  2. 单片机与触摸屏通信c语言,讲述如何实现单片机与触摸屏的通信
  3. VC中CDockablePane使用心得
  4. VC密码正确无法登陆。证书过期。处理。
  5. 一种考虑时空关联的深度学习短时交通流预测方法
  6. 时空图卷积网络:一种用于交通预测的深度学习框架
  7. adb shell dunpsys SurfaceFlinger
  8. 摩托罗拉linux软件下载,摩托罗拉手机软件驱动下载
  9. CVE-2022-21999 Windows Print Spooler(打印服务)特权提升漏洞
  10. 计算机毕业设计Java医院信息管理系统(系统+源码+mysql数据库+Lw文档)