数据结构之静态链表

静态链表的定义:

静态链表:分配一整片连续的内存空间,各个结点集中安置,逻辑结构上相邻的数据元素,存储在指定的一块内存空间中,数据元素只允许在这块内存空间中随机存放,这样的存储结构生成的链表称为静态链表。也就是说静态链表是用数组来实现链式存储结构,静态链表实际上就是一个结构体数组
在这里插入图片描述

举例:通过a[1]中存放的游标变量3可找到存放的数据元素5的后继元素为3,再通过a[3]中存放的游标变量2可找到存放数据元素3的后继数据为2,以此类推,直到某元素的游标变量为0即可停止(注:a[0]为头结点不存储数据元素)

备用链表:

在链表中,我们不可能恰好将所有的位置都使用,那么就会出现空闲的位置,用来连接这些空闲位置的链表,我们就将其称之为备用链表,他的作用为:回收数组中目前没有适用的空间

那么此时就相当于有两个链表,实现不同的功能,一个用来连接数据,另一个用来连接数组中的空闲空间。

一般情况下,备用链表的表头位于数组下标为0(a[0])的位置,而数据链表的表头位于数据下标为1(a[1])的位置。
在这里插入图片描述如上图所示:备用链表的连接顺序依次是:a[0],a[2],a[4]数据链表的连接顺序依次是a[1],a[3],a[5]

静态链表添加数据的实现过程:

以存储{1,2,3}为例,分析过程如下:

数据未存储前,数据链表当前是不存在的,所有的游标都存在于备用链表中,如下所示:
在这里插入图片描述下面我们要进行的工作是将1存储进去,此时既然要存储数据,因此必须产生数据链表,那么如何产生数据链表呢?方法:备用链表摘除结点,以便存储新数据,而最简便的方法就是摘除a[0]的后继节点,即为下标为1(a[1])的位置。

将1存放进去:
在这里插入图片描述将2存放进去:
在这里插入图片描述将3存放进去:

在这里插入图片描述

定义静态链表:

方法一:

#define Maxsize 10//定义静态链表的最大长度
struct Node//定义静态链表结构类型
{
   
	ElemType data;
	int next;//游标:为下一个数据元素的数组下标,类似于指针
};
void testSLinkList()
{
   
	struct Node a[Maxsize];//数组a作为静态链表
}

方法二:

#define Maxsize 10
struct Node
{
   
	ElemType data;
	int next;
};
typedef struct Node SLinkList[Maxsize];//这里相当于SLinkList可用来定义为一个数组,数组长度为Maxsize,类型为Node
void teastLinkLIst()
{
   
	SLinkList a;//等价于struct Node a[Maxsize]
}

验证其两种方式是否正确:

#include<stdio.h>
#define Maxsize 10
struct Node
{
   
	int data;
	int next;
};
typedef struct
{
   
	int data;
	int next;
}SLinkList[Maxsize];
void testSLinkList()
{
   
	struct Node x;
	printf("sizeX=%d\n", sizeof(x));
	struct Node a[Maxsize];//定义了一个数组a,其数组长度为Maxsize,类型为struct Node
	printf
  • 22
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
要删除静态链表中的一个节点,需要先找到要删除节点的前驱节点,然后将前驱节点的指针指向要删除节点的后继节点。具体操作步骤如下: 1. 遍历静态链表,找到要删除节点的前驱节点和后继节点。 2. 将前驱节点的指针指向后继节点,即跳过要删除的节点。 3. 如果要删除的节点是静态链表的第一个节点,则需要将头指针指向后继节点。 4. 释放要删除节点的空间。 下面是一个示例代码: ``` void deleteNode(int nodeIndex) { if (nodeIndex < 1 || nodeIndex > MAX_SIZE) { // 节点索引无效 return; } // 找到要删除节点的前驱节点和后继节点 int preIndex = 0; int curIndex = 1; while (curIndex != nodeIndex && curIndex != 0) { preIndex = curIndex; curIndex = staticList[curIndex].next; } if (curIndex == 0) { // 节点不存在 return; } // 将前驱节点的指针指向后继节点 staticList[preIndex].next = staticList[nodeIndex].next; if (nodeIndex == 1) { // 要删除的节点是第一个节点,需要更新头指针 headIndex = staticList[headIndex].next; } // 释放要删除节点的空间 staticList[nodeIndex].next = 0; staticList[nodeIndex].data = 0; freeIndexList.push(nodeIndex); } ``` 其中,`staticList` 是静态链表的数组,`MAX_SIZE` 是静态链表的最大长度,`headIndex` 是头指针的索引,`freeIndexList` 是空闲节点的索引列表。在代码中,我们通过遍历找到要删除节点的前驱节点和后继节点,并将前驱节点的指针指向后继节点,最后释放要删除节点的空间。注意,如果要删除的节点是第一个节点,需要更新头指针。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从未止步..

谢谢你的打赏,我会继续努力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值