数据结构----静态链表的实现
------------恢复内容开始------------
静态链表的描述方法便于在不设“指针”类型的高级程序设计语言中使用链表结构,,用数组的一个分量表示一个节点,同时用游标代替指针,数组的第0分量看成是头节点,数组的第1个分量代表备用节点(称为备用池)
1、静态单链表结构体定义
开辟一个结构体类型数组,结构体成员包含data和cur, 数组的第一个元素含义为头节点,其数据域为空,cur为 下一个节点的下标,cur的含义可以理解为链表节点的指针域
1 2 3 4 5 6 7 | typedef struct ListNode { ElemType data; int cur; }ListNode; typedef ListNode StaticList[MAX_SIZE]; //表示定义一个StaticList数组,数组成员都是ListNode类型 |
2、静态单链表初始化
数组的第一个元素含义为头节点,其数据域为空,cur为 -1 表示链表为空,数组的第二个数据域为空,cur为 2 表示下一个可用节点的下标为2 ,依次类推
1 2 3 4 5 6 7 8 9 | void InitSList(StaticList &space) { space[0].cur = -1; //头节点设置为-1表示当前链表为空 for ( int i = 1; i < MAX_SIZE - 1; i++) { space[i].cur = i + 1; //把下一个节点的下标赋值给当前节点的cur,即为当前节点指向下一个节点 } space[MAX_SIZE-1].cur = 0; //表示没有下一个节点,即链表最后一个节点的指针域为空,表示没有可分配的空间 } |
3、静态链表的头插
每插入一个节点,就把
(1)pool节点的cur值改成当前节点的cur值;
(2)当前节点的cur值修改为head结点的cur值,表示当前节点指向下一个节点;
(3)head节点的cur值修改为当前节点的下标,表示head头节点指向当前节点;
插入过程如下:
是不是跟链表的指针表示如出一辙?其实静态链表就是用游标cur代替指针进行操作,其他都一样
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 | void Insert(StaticList &space, ElemType x) { int i = Malloc_SL(space); if (i == 0) { printf ( "申请空间节点失败。\n" ); return ; } space[i].data = x; space[i].cur = space[0].cur; //第一步 space[0].cur = i; //第二步 } |
4、静态链表的显示
跟指针操作一模一样,都是从头节点开始依次往后面找,直到cur值为-1表示遍历链表结束
代码如下:
1 2 3 4 5 6 7 8 9 10 | void ShowSList(StaticList &space) { int i = space[0].cur; while (i != -1) { printf ( "%c-->" , space[i].data); i = space[i].cur; } printf ( "Nul.\n" ); } |
5、静态链表的头删
头删复杂一些,因为释放一个节点,就需要对pool节点的cur值进行修改 ,也需要对待删除节点的cur值修改,其实就是对头插的逆向工作,把头插反向一步一步回去就能理解头删操作了
步骤如下:
(1)head的cur值修改为待删除节点的cur值
(2)待删除节点的cur值修改为pool节点的cur值,因为pool节点的cur值始终是下一个备用节点的下标,即把下一个备用节点的下标给待删除节点的cur值
(3)pool节点的cur值修改为待删除节点的下标。即待删除节点变成当前备用节点,次节点指向下一个备用节点
代码如下:
1 2 3 4 5 6 7 | void Delete(StaticList &space) { int i = space[0].cur; space[0].cur = space[i].cur; space[i].cur = space[1].cur; space[1].cur = i; } |
6、测试代码Main函数如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include "StaticList.h" void main() { StaticList SL; InitSList(SL); for ( int i = 0; i < 5; i++) { Insert(SL, 'A' + i); } ShowSList(SL); Delete(SL); ShowSList(SL); } |
明天开始学习单循环链表,加油!
------------恢复内容结束------------
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!