【数据结构】【线性表】静态链表(附C语言源码)

server/2024/11/17 21:56:30/

静态链表

链表是物理结构为链式的线性表,其每个结点的存储位置不一定是连续的,每个结点依靠结点元素的中的指针线性相连。但有时候为了方便管理内存空间,会将链表的各个结点存储空间放在一块,其实现方式类似于数组,只不过由传统的数据类型改为结构体类型。

#include MaxSize 20;
typedef struct {//定义单链表结点类型EleType deta;//每一个结点存放一个数据元素int next;//指向下一个结点所在数组位置
}SLinkList[MaxSize];
该结构体定义了一个新的东西,名字为:SLinkList,它表示一个结构体数组,数组的每个元素都等同于该结构体
typedef struct LNode{//定义单链表结点类型EleType deta;//每一个结点存放一个数据元素struct LNode *next;//指针指向下一个结点
}LNode,*LinkList;
这是原来的单链表结构体的定义

[!静态链表结构体和普通链表结构体的比较]

  • 将结构体指针换成了整型变量。静态链表不再通过结构体指针去链接结点,而是通过整型变量去表示结点之间的关系。
  • 重定义将单个结构体换成了结构体数组。在进行结构体的重定义时,不再定义为一个结构体,而是定义成一个结构体数组用于存储链表,使得链表的物理空间从分散的变成了一整块。
//原有的结构体只定义了一个结构体,原有结构体重定义等效于:
typedef struct LNode LNode,*LinkList;
//静态链表的结构体定义了一个结构体数组,静态链表结构体重定义等效于:
typedef struct Node SLinkList[MaxSize];定义了一个长度为Maxsize的Node类型的数组
静态链表的基本操作

一段连续的空间,用数组下标去代替指针有天然的优势。和其他的链表相比,静态链表最重要的特点就是结点的结构体指针换成了整型变量。因此在程序的设计上最重要的也是这一部分。首先要解决一个问题:指针的空,用整型变量如何表示?其实很简单,因为这里的整型变量表示的是结构体数组的下标,下标要是非负数才有实际意义,因此我们可以用负数去表示指针的NULL。
初始化静态链表

//初始化静态链表
bool InitStaticList(SLinkList &L){if(MaxSize<1)//判断链表长度是否合法return false;//链表长度不合法,初始化失败L[0]->next=-1;//初始化头结点的next为-1,表示空for(int i=1;i<MaxSize-1;i++){L[i]->next=-2;//初始化剩余结点的next为-2,表示空或已删除}return true;
}

静态链表的插入

插入分为按位序插入和指定结点的前插和后插,无论是哪种插入无非就做两件事:1.找位置,即找数组中的空结点,存入数据元素。2.修改next或prior,找到其前驱结点或后继节点修改对应指针这里需要注意的是静态链表如何判断空结点,可以根据结点的next的数字来判定,例如-1表示该结点为头结点,-2表示该结点为空,-3表示该结点不为空但为表尾结点等

静态链表的删除

插入分为按位序删除和指定结点删除,无论是哪种删除无非就做三件事:1.找到该结点及其前驱结点或后继结点。2.修改前驱结点或后继结点的指针,使其相连。3.释放删除结点的空间

静态链表的一些比较

  • 和其他链表相比,静态链表用数组实现链表,空间连续;但空间固定,不能随机存取
  • 和顺序表相比,静态链表的操作不需要大量移动元素

http://www.ppmy.cn/server/142453.html

相关文章

后端:Spring AOP原理--动态代理

文章目录 1. Spring AOP底层原理2. 代理模式3. 静态代理4. 动态代理4.1 jdk 实现动态代理4.2 cglib 实现动态代理4.3 jdk、cglib动态代理两者的区别 1. Spring AOP底层原理 创建容器 new applicationContext()&#xff1b;Spring把所有的Bean进行创建&#xff0c;进行依赖注入…

Invar-RAG:基于不变性对齐的LLM检索方法提升生成质量

Invar-RAG&#xff1a;基于不变性对齐的LLM检索方法提升生成质量 论文链接:https://arxiv.org/html/2411.07021v1 论文概述 在检索增强型生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;系统中直接应用大型语言模型&#xff08;Large Language Models, LLM…

Python习题 250:删除空文件夹

(编码题)编写一段 Python 代码,删除指定目录的空文件夹。 参考答案: 使用 pathlib 库可以更简洁地处理文件路径。下面是一个使用 pathlib 库递归删除空文件夹的 Python 代码:from pathlib import Pathdef remove_empty_dirs(directory):# 遍历目录及其子目录for path in…

Linux 进程信号初识

目录 0.前言 1.什么是信号 1.1生活中的信号 1.2 OS中的信号 2.认识信号 2.1信号概念 2.2查看信号 2.3 signal函数 2.4代码示例 3. 信号处理方式 3.1 忽略信号 3.2 默认处理 3.3 自定义处理 4.小结 &#xff08;图像由AI生成&#xff09; 0.前言 在之前的学习中&#xff0c;我…

Redis 字符串(String)

Redis 字符串数据类型的相关命令用于管理 redis 字符串值&#xff0c;基本语法如下&#xff1a; 语法 redis 127.0.0.1:6379> COMMAND KEY_NAME实例 redis 127.0.0.1:6379> SET w3ckey redis OK redis 127.0.0.1:6379> GET w3ckey "redis"在以上实例中我…

【回溯法】——分割回文串

131. 分割回文串 一、题目难度 中等 二、相关标签与相关企业 [相关标签] [相关企业] 三、题目描述 给你一个字符串 s s s&#xff0c;请你将 s s s 分割成一些子串&#xff0c;使每个子串都是回文串。返回 s s s 所有可能的分割方案。 四、示例 示例1 输入&#xf…

Bugku CTF_Web——点login咋没反应

Bugku CTF_Web——点login咋没反应 进入靶场 随便输个试试 看来确实点login没反应 抓包看看 也没有什么信息 看了下源码 给了点提示 一个admin.css try ?12713传参试试 拿到一个php代码 <?php error_reporting(0); $KEYctf.bugku.com; include_once("flag.php&q…

Kafka-Controller选举

一、上下文 《Kafka-broker粗粒度启动流程》博客中我们分析了broker的大致启动流程&#xff0c;这个时候每个broker都不是controller角色&#xff0c;下面我们就来看下它是如何选举出来的吧 二、设置ZooKeeper ‌ZooKeeper是一个开源的分布式协调服务&#xff0c;主要用于分…