数据结构 静态链表特别篇

本文介绍了静态链表的概念和特点,重点解析了如何在静态链表中进行数据存储和逻辑操作。通过算法解析和代码示例展示了初始化、分配、回收节点的方法,以及如何在静态链表中实现集合运算。此外,探讨了静态链表如何利用空间换取时间效率,避免了全表扫描。
摘要由CSDN通过智能技术生成

本教程来自 本人博客 越行勤‘s Blog ,欢迎大家访问
域名 https://yingwiki.top

静态链表

我在《 数据结构 第二章 :双链表,循环链表,静态链表以及对比总结》,初步认识了静态链表。

第一次去理解代码,其实有一点点费力。但是也不是那么复杂,主要抓住下面这一点

静态链表:分配一整个连续内存空间每个节点,每个节点集中安置;静态链表中没有用指针,但是数组的索引值 Index充当了指针的作用。

静态链表就是为那行没有指针的编程语言二存在的,存储数据用的是连续的空间,但是逻辑上连续的空间,在物理上无需连续,还是抓住了链表的特点。

typedef struct 
{
   
    ElemType data;
    int cur;//其实可以把它看着指针,指针也不少一个数吗?
}SLinkList[MaxSize];

cur: 就是下一个结点的数组下标,其实可以把它看着指针,指针也不少一个数吗?

算法解析

第一次实现静态链表,我面对的一个问题就是 如何寻找到没有使用的数据结点,我给出的解决方案是:

  • cur = 0,表示结尾
  • cur =MaxSize ,表示没有使用该段空间

所以需要开辟一个没有存储数据(插入结点等操作需要开辟空间)的结点就需要使用循环扫描出cur== MaxSize 的结点(没有使用的结点)。

有没有不需要循环的方法呢?当然是有的,我们来看看书上的一个例子。

题目

实现集合运算 ( A − B ) U ( B − U ) (A-B)U(B-U) (AB)U(BU) 来讨论静态链表的算法。

初步理解

为了更好的理解,我想提讲述出它的具体原理

在静态链表中 存着两个链表

  1. 链表1(备用链表). 头节点 为 SLinkList[0],存储着没有数据的结点
  2. 链表2(数据链表). 头结点为 SLinkList[1] (也可以不是 SLinkList[1] ,只要是空闲结点就可以了),存储着有数据的结点,

当然它是如何他是如何存储两个链表在一个数组中呢?

回想我们单链表是如何找到链表的呢? 找到头结点

那很简单,我们也只需要规定, L[0]为备用链表的头结点,L[1]为存储数据的头结点

开辟一个存储数据的结点:从备用链表中取出–>一个结点到数据链表中

删除回收一个存储数据的结点:从将被删除的结点–>插入到备用链表中

是不是很有启发性呢,经典的空间换取时间,当然我们这样多花费了1个空间(备用链表的头结点),就避免了时间复杂度为O(n)的大循环。

代码
InitSpace _SL

函数功能:初始化链表,由于此时没有存储数据,其实就是创建 备用链表

void InitSpace _SL(SLinkList &space)
{
   
    for(i=0;i<MaxSize-1;i++) //数组下标从0开始,只需要循环到 MaxSize-2
        space[i].cur=i+1;
    space[MaxSize - 1]==0;//0表示NULL ,space[MaxSize - 1]也就是 备用链表的尾结点
}

结果

如上图,每个cur指向下一个结点。

Malloc_SL

函数功能:从备用链表中取出(拿出来并在备用链表中删除)一个可以存储数据的新结点,返回其的数组下标(地址),返回0表示分配空间失败

int Malloc_SL(SLinkList &space)
{
   
    i=space[0].cur;//备用链表的第一个结点取出
    if(space[0].cur)//如果 space[0].cur==0 说明备用链表被使用完了,分配空间失败
        space[0].cur=space[i].cur;//将取出的结点从备用链表中删除
    return i;
}
Free_SL

函数功能: 将被删除的结点k,连接到备用链表的头结点之后(回收K结点)

Free_SL(SLinkList &space ,int k)
{
   
    space[k].cur=space[0].cur;sapce[0].cur=k;
}

简单示意图

画的太丑了

difference

函数作用:依次此输入 A,B的元素,计算 ( A − B ) U ( B − U ) (A-B)U(B-U) (AB)U(BU), ,计算结果到space ,S返回数据链表的头结点。

此函数使用许多功能,插入元素,删除元素等功能都在这里有体现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值