数据结构----静态链表的实现
------------恢复内容开始------------
静态链表的描述方法便于在不设“指针”类型的高级程序设计语言中使用链表结构,,用数组的一个分量表示一个节点,同时用游标代替指针,数组的第0分量看成是头节点,数组的第1个分量代表备用节点(称为备用池)
1、静态单链表结构体定义

开辟一个结构体类型数组,结构体成员包含data和cur, 数组的第一个元素含义为头节点,其数据域为空,cur为 下一个节点的下标,cur的含义可以理解为链表节点的指针域
typedef struct ListNode
{
ElemType data;
int cur;
}ListNode;
typedef ListNode StaticList[MAX_SIZE];//表示定义一个StaticList数组,数组成员都是ListNode类型
2、静态单链表初始化

数组的第一个元素含义为头节点,其数据域为空,cur为 -1 表示链表为空,数组的第二个数据域为空,cur为 2 表示下一个可用节点的下标为2 ,依次类推
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代替指针进行操作,其他都一样
代码如下:
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表示遍历链表结束
代码如下:
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值修改为待删除节点的下标。即待删除节点变成当前备用节点,次节点指向下一个备用节点

代码如下:
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函数如下:
#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);
}
明天开始学习单循环链表,加油!
------------恢复内容结束------------

浙公网安备 33010602011771号