2.11.静态链表


一.静态链表的基本概念:

1.上图说明:索引为0处是头结点,头结点不存储数据,但存储下一个结点的数组下标,本例中头结点里存储的下一个结点的数组下标为2,即索引为2的结点为头结点后的第一个结点,以此类推;

2.上图中计算结点地址的公式中数据元素的大小和游标的大小不是固定的,可能是16B不等。


二.用代码定义一个静态链表:

1.方式一:

图示:

代码:
#include<stdio.h>
#define MaxSize 10 //定义静态链表的最大长度
​
struct Node //定义静态链表结构类型 
{int data; //存储数据元素int next; //下一个元素的数组下标 
}; 
​
void testSLinkList()
{struct Node a[MaxSize]; //数组a作为静态链表(静态链表是连续的) 
}
​
​
int main()
{return 0;
}

2.方式二:

图示:

代码:
#include<stdio.h>
#define MaxSize 10 //静态链表的最大长度
​
typedef struct  //定义静态链表结构类型
{int data; //存储数据元素int next; //下一个元素的数组下标 
}SLinkList[MaxSize]; /*相当于定义了一个SLinkList类型的数组,当中的元素是SLinkList型,也就意味着有了SLinkList型的变量,testSLinkList函数里的SLinkList a也就合法了*/
​
void testSLinkList()
{SLinkList a; //a其实就是一个长度为10的数组,类型为SLinkList /*该数组的类型是SLinkList,每一个元素里包含data(占4B)和next(占4B),共8B大小,所以数组a总内存大小为80*/ 
} 
​
int main()
{return 0;
}
#include<stdio.h>
#define MaxSize 10 //静态链表的最大长度
​
struct Node //定义静态链表结构类型,类型为struct Node 
{int data; //存储数据元素int next; //下一个元素的数组下标 
};
​
typedef struct Node SLinkList[MaxSize];
/*typedef为重新定义类型名符号,把struct Node重新定义为SLinkList型数组*/
​
void testSLinkList()
{struct Node a[MaxSize]; //struct Node为类型,a为数组名 
} 
​
int main()
{return 0;
}

3.解读:


三.简述基本操作的实现:

1.初始化静态链表:

  • 头结点a[0]的next指针设为-1相当于没指向任何一个元素,等价于NULL

2.查找某个结点&插入某个结点&删除某个结点:

  • 查找只能从头结点遍历查找,因此查找结点的时间复杂度为O(n)

  • 注:查找的是某个位序的结点,而不是某个数组下标的结点,位序是指各个结点在逻辑上的顺序,而静态链表里的数组下标只是反应了各个结点在物理上的顺序

  • 插入元素前需要遍历找到一个空位置才能插入

  • 以上图为例插入一个元素,此时已经有4个元素了(头结点里的不算一个元素),那么下一个要插入的元素就是第5个元素(位序为5的元素),需要插在表尾即e4后面,此时要找的第5个元素的前驱结点即第4个元素e4,把第4个元素e4的next指针改为4,再把新插入的元素e5的next指针设为-1,因为e5是最后一个元素,后面没有其他元素了

  • 注:实际上从计算机的角度看,上图中没有存数据的结点只是没有存所需要的数据,实际上会有脏数据,为了识别出结点中真正不存在数据即没有脏数据和所需要的数据,在初始化时应该把不存在数据的结点的next指针设为一个特殊的值如-2(或字符或字符串等),这样以来在判断是否有数据时只需要看索引是否为指定的不存在数据的索引如-2:

  • 在删除一个结点时,需要把所删除的结点的next指针设为-2,代表此时该结点中已经没有数据了:


四.总结:

  • 虽然静态链表是连续的存储空间,但在这一片连续的存储空间内各个逻辑上相邻的数据元素也可以在物理上不相邻,各个元素的关系是通过数组下标(游标)联系起来的

  • 静态链表在增,删操作上不需要大量移动元素,只需要修改相关结点的数组下标(游标)即可

  • 静态链表的容量是固定的,不能改变

  • 文件分配表FAT本质是静态链表


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/64264.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Childishness and Playfulness】

奥迪双钻&#xff0c;旋风冲锋龙卷风&#xff0c;巨无霸 智能芯片 东西南北中&#xff0c;好像已经忘了怎么折叠了&#xff0c;折千纸鹤&#xff0c;折小船&#xff0c;折舞狮&#xff0c;折飞机 红外线小灯&#xff0c;纽扣电池&#xff0c;各种形状投影 爷爷的手电筒&am…

【C++初阶】第9课—标准模板库STL(string_3)

文章目录 1. string类对象的查找操作1.1 c_str返回c格式字符串1.2 substr获取string类对象子串1.3 find和rfind查找字符串内容1.4 find_first_of与find_first_not_of1.5 find_last_of与find_last_not_of1.6 copy复制string类对象内的字符串内容1.7 compare对比string类字符串1.…

【教程】如何下载WandB平台的运行数据?

【教程】如何下载WandB平台的运行数据&#xff1f; 前言 CSDN主页&#xff1a;https://blog.csdn.net/rvdgdsva 博客园主页&#xff1a;https://www.cnblogs.com/hassle Weights & Biases (WandB)是一个用于机器学习的平台&#xff0c;它提供了一套工具来帮助你跟踪、比…

vscode设置终端代理

转载请标明出处&#xff1a;小帆的帆的博客 设置终端代理 修改项目的.vscode/settings.json {"terminal.integrated.env.windows": {"http_proxy": "http://127.0.0.1:7890","https_proxy": "http://127.0.0.1:7890"}, }…

【Linux】自定义项目-进度条

更多精彩内容..... &#x1f389;❤️播主の主页✨&#x1f618; Stark、-CSDN博客 准备工作&#xff1a;"\r"与"\n"字符 ①&#xff1a;基本含义 在C语言和Linux环境中&#xff0c;\r是回车符&#xff0c;\n是换行符&#xff0c;用于控制文本格式和输出…

Linux从0到1——初识线程【什么是线程/线程控制/详解tid】

Linux从0到1——初识线程 1. 什么是线程&#xff1f;1.1 线程的概念1.2 结合代码理解线程1.3 重谈地址空间1.4 线程的优缺点 2. 线程异常和线程用途3. Linux进程VS线程4. 详解pthread_create的arg参数4.1 给线程传参4.2 一次创建多个线程 5. 线程控制5.1 线程退出5.2 线程分离5…

[免费]SpringBoot+Vue校园社团管理系统(优质版)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue校园社团管理系统(优质版)&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue校园社团管理系统(优质版) Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着信息技术的迅速发展&#x…

114 二叉树展开为链表

解题思路&#xff1a; \qquad 题目中已经明确&#xff0c;要用先序遍历的顺序展开&#xff0c;那么就需要按照“中-左-右”的顺序遍历二叉树&#xff0c;剩下的问题在于如何在遍历过程中完成链表指针的更新。 \qquad 由于“右子节点”需要链接到左子树最后一个节点之后&#…

Kylin麒麟操作系统 | Nginx服务部署

目录 一、理论储备1. Nginx概述2. Nginx与Apache的区别3. Nginx的服务配置 二、任务实施任务1 Nginx的编译安装1. Server配置2. 客户端测试 任务2 Nginx反向代理1. Server1配置2. Server2配置3. 客户端测试 一、理论储备 1. Nginx概述 Nginx是一个轻量级的web服务器&#xff…

类OCSP靶场-Kioptrix系列-Kioptrix Level 1

一、前情提要 二、实战打靶 1. 信息收集 1.1. 主机发现 1.2. 端口扫描 1.3 目录爆破 1.4. 敏感信息 2.根据服务搜索漏洞 2.1. 搜索exp 2.2. 编译exp 2.3. 查看exp使用方法&#xff0c;并利用 3. 提权 二、第二种方法 一、前情提要 Kioptrix Level是免费靶场&#x…

Golang囊地鼠gopher

开发知识点-golang 介绍红队专题-Golang工具Fscan简介主要功能ubuntu 安装windows 安装常用命令:项目框架源文件common目录Plugins目录Webscan目录入口点插件扫描类型爆破插件common.ScantypeWebtitle函数webpoc扫描POC 执行CEL-GO 实践CEL指纹识别免杀源码特征参考链接红队专…

快速上手Spring注解、SpringAop

1 Spring 注解的使用 1 IOC 的概念 IOC&#xff08;Inversion of Control&#xff09;&#xff1a;控制反转。 使用对象时&#xff0c;由主动new产生对象转换为由外部提供对象&#xff0c;此过程中对象创建控制权由程序转移到外部&#xff0c;此思想称为控制反转。通俗的讲就…

数据地图怎么做?推荐这款数据可视化地图生成器

在数字化与信息化高速发展的今天&#xff0c;企业迎来了前所未有的发展机遇&#xff0c;规模迅速扩张&#xff0c;市场版图不断延伸。然而&#xff0c;伴随着这种快速的发展&#xff0c;一个不容忽视的问题逐渐浮出水面——如何精准高效地掌握分布在各地的分公司、业务点乃至整…

鸿蒙项目云捐助第九讲鸿蒙App应用的捐助详情页功能实现

鸿蒙项目云捐助第九讲鸿蒙App应用的捐助详情页功能实现 这里接下来继续实现捐助详情页的布局页面&#xff0c;也就是当用户进入到分类页面后&#xff0c;点击分类的每一个商品就进入到捐助商品的详情页&#xff0c;这里的布局可以从下面的模板演化而来。 下面根据这个模板来进…

【数学】矩阵的逆与伪逆 EEGLAB

文章目录 前言matlab代码作用EEGLAB 中的代码总结参考文献 前言 在 EEGLAB 的使用中&#xff0c;运行程序时出现了矩阵接近奇异值&#xff0c;或者缩放错误。结果可能不准确。RCOND 1.873732e-20 的 bug&#xff0c;调查 EEGLAB 后发现是 raw 数据的问题。 matlab代码 A_1 …

华为HarmonyOS NEXT 原生应用开发:鸿蒙中组件的组件状态管理、组件通信 组件状态管理小案例(好友录)!

文章目录 组件状态管理一、State装饰器1. State装饰器的特点2. State装饰器的使用 二、Prop装饰器&#xff08;父子单向通信&#xff09;1. Prop装饰器的特点2. Prop装饰器的使用示例 三、Link装饰器&#xff08;父子双向通信&#xff09;1. Link装饰器的特点3. Link使用示例 四…

Pytorch | 对比Pytorch中的十种优化器:基于CIFAR10上的ResNet分类器

Pytorch | 对比Pytorch中的十种优化器&#xff1a;基于CIFAR10上的ResNet分类器 CIFAR10数据集ResNet提出背景网络结构特点工作原理优势 代码实现分析utils.pymain.py导入必要的库设备选择与数据预处理定义加载训练集和测试集主函数部分训练部分测试部分 结果10种优化器对应的训…

Linux系统操作03|chmod、vim

上文&#xff1a; Linux系统操作02|基本命令-CSDN博客 目录 六、chmod&#xff1a;给文件设置权限 1、字母法 2、数字法&#xff08;用的最多&#xff09; 七、vim&#xff1a;代码编写和文本编辑 1、启动和退出 1️⃣启动 2️⃣退出 2、vim基本操作 六、chmod&#x…

徐州数字孪生工业互联网可视化技术,赋能新型工业化智能制造工厂

#徐州数字孪生工业互联网#在当下智能制造的热潮之下&#xff0c;徐州作为中国制造业的重要基地&#xff0c;正积极拥抱数字化转型&#xff0c;通过数字孪生工业互联网可视化技术&#xff0c;赋能新型工业化智能制造工厂&#xff0c;引领制造业向更高效、更智能、更绿色的方向发…

C# 探险之旅:第二十四节 - 类型class基础,一场“类”似的奇妙冒险

嘿&#xff0c;勇敢的探险家们&#xff01;欢迎来到C#王国的“类”似奇妙冒险&#xff01;今天&#xff0c;我们要深入探索一个神秘而强大的领域——class&#xff08;类&#xff09;。想象一下&#xff0c;class就像C#世界里的一块魔法土地&#xff0c;每块土地上都能孕育出独…