数据结构----静态链表的实现

------------恢复内容开始------------

静态链表的描述方法便于在不设“指针”类型的高级程序设计语言中使用链表结构,,用数组的一个分量表示一个节点,同时用游标代替指针,数组的第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);
}

  

 明天开始学习单循环链表,加油!

 

------------恢复内容结束------------

posted @   念经似的zzz  阅读(203)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· 因为Apifox不支持离线,我果断选择了Apipost!
点击右上角即可分享
微信分享提示