顺序表和链表

目录

1.线性表

2.顺序表

2.1 概念及结构

2.2 接口实现

2.3 顺序表的问题及思考

3.链表

3.1 链表的概念及结构

3.2 链表的分类

3.3 链表的实现

3.4双向链表的实现

4.顺序表和链表的区别和联系


1.线性表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使
用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,
线性表在物理上存储时,通常以数组和链式结构的形式存储。

2.顺序表

2.1 概念及结构

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存
储。在数组上完成数据的增删查改。
顺序表一般可以分为:

1. 静态顺序表:使用定长数组存储元素。

2. 动态顺序表:使用动态开辟的数组存储。

2.2 接口实现

静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空
间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间
大小,所以下面我们实现动态顺序表。

typedef int SLDataType;
// 顺序表的动态存储
typedef struct SeqList
{
 SLDataType* array;  // 指向动态开辟的数组
 size_t size ;    // 有效数据个数
 size_t capicity ;  // 容量空间的大小
}SeqList;
// 基本增删查改接口
// 顺序表初始化
void SeqListInit(SeqList* psl);
// 检查空间,如果满了,进行增容
void CheckCapacity(SeqList* psl);
// 顺序表尾插
void SeqListPushBack(SeqList* psl, SLDataType x);
// 顺序表尾删
void SeqListPopBack(SeqList* psl);
// 顺序表头插
void SeqListPushFront(SeqList* psl, SLDataType x);
// 顺序表头删
void SeqListPopFront(SeqList* psl);
// 顺序表查找
int SeqListFind(SeqList* psl, SLDataType x);
// 顺序表在pos位置插入x
void SeqListInsert(SeqList* psl, size_t pos, SLDataType x);
// 顺序表删除pos位置的值
void SeqListErase(SeqList* psl, size_t pos);
// 顺序表销毁
void SeqListDestory(SeqList* psl);
// 顺序表打印
void SeqListPrint(SeqList* psl);

2.3 顺序表的问题及思考

问题:
1. 中间/头部的插入删除,时间复杂度为O(N)

2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。

3. 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容200,

我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。

思考:如何解决以上问题呢?下面给出了链表的结构来看看。

3.链表

3.1 链表的概念及结构

概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表
中的指针链接次序实现的 。

3.2 链表的分类

实际中链表的结构非常多样,以下情况组合起来就有8种链表结构:

1. 单向或者双向

2. 带头或者不带头

3. 循环或者非循环

1. 无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结
构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。
2. 带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都
是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带
来很多优势,实现反而简单了,后面我们代码实现了就知道了。

3.3 链表的实现

// 1、无头+单向+非循环链表增删查改实现
typedef int SLTDateType;
typedef struct SListNode
{
SLTDateType data;
struct SListNode* next;
}SListNode;
// 动态申请一个结点
SListNode* BuySListNode(SLTDateType x);
// 单链表打印
void SListPrint(SListNode* plist);
// 单链表尾插
void SListPushBack(SListNode** pplist, SLTDateType x);
// 单链表的头插
void SListPushFront(SListNode** pplist, SLTDateType x);
// 单链表的尾删
void SListPopBack(SListNode** pplist);
// 单链表头删
void SListPopFront(SListNode** pplist);
// 单链表查找
SListNode* SListFind(SListNode* plist, SLTDateType x);
// 单链表在pos位置之后插入x
// 分析思考为什么不在pos位置之前插入?
void SListInsertAfter(SListNode* pos, SLTDateType x);
// 单链表删除pos位置之后的值
// 分析思考为什么不删除pos位置?
void SListEraseAfter(SListNode* pos);

3.4双向链表的实现

// 2、带头+双向+循环链表增删查改实现
typedef int LTDataType;
typedef struct ListNode
{
LTDataType _data;
struct ListNode* next;
struct ListNode* prev;
}ListNode;
// 创建返回链表的头结点.
ListNode* ListCreate();
// 双向链表销毁
void ListDestory(ListNode* plist);
// 双向链表打印
void ListPrint(ListNode* plist);
// 双向链表尾插
void ListPushBack(ListNode* plist, LTDataType x);
// 双向链表尾删
void ListPopBack(ListNode* plist);
// 双向链表头插
void ListPushFront(ListNode* plist, LTDataType x);
// 双向链表头删
void ListPopFront(ListNode* plist);
// 双向链表查找
ListNode* ListFind(ListNode* plist, LTDataType x);
// 双向链表在pos的前面进行插入
void ListInsert(ListNode* pos, LTDataType x);
// 双向链表删除pos位置的结点
void ListErase(ListNode* pos); 

4.顺序表和链表的区别和联系

不同点顺序表链表
存储空间上物理上一定连续逻辑上连续,但物理上不一定连续
随机访问支持O(1)不支持:O(N)
任意位置插入或者删除可能需要搬移元素,效率低O(N)只需修改指针指向
插入动态顺序表,空间不够时需要扩容没有容量的概念
应用场景元素高效存储+频繁访问任意位置插入和删除频繁
缓存利用率

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenMediaVault控制台web页面密码重置

要重置 OpenMediaVault(OMV)Web 控制台的密码,可以使用 omv-firstaid 命令行工具中的相应选项。按照以下步骤进行操作: 以管理员权限登录到 OMV 的命令行界面(通过 SSH 或直接登录)。 ssh登陆到root用户 运…

在windows上利用vmware17 搭建centos7 mini版本服务器

安装centos7mini 修改名称和安装路径 也可以点击自定义硬件,进行硬件配置修改 设置内存 设置处理器 点击下图按钮进行设置 点击done 点击开始安装 点击设置root密码 设置成功,点击done ,root密码设置的简单的话需要按两次done 等待安装完成…

软考系统分析师知识点集锦二:系统规划

一、系统规划的步骤 (1)初步调查:根据企业战略目标,分析企业现状以及系统运行状况。(2)确定系统目标:确定系统的服务范围质量等。(3)分析子系统的组成:做系统划分并指定子系统功能。(4)拟定系统的实施方案:分析子系统优先级,确定开发顺序。(5)进行可行性研究:编写可…

接口测试和功能测试有什么区别

本文主要分为两个部分: 第一部分:主要从问题出发,引入接口测试的相关内容并与前端测试进行简单对比,总结两者之前的区别与联系。但该部分只交代了怎么做和如何做?并没有解释为什么要做? 第二部分&#xff1…

如何利用IP代理进行海外推广?

在当今数字化的时代,网络营销已经成为企业策略的重要组成部分。而对于进去海外市场的跨境玩家来说,海外的推广推广是重中之重。然而,在开展推广的过程中,我们常常会遇到各种挑战,如地域限制、访问速度慢等。 为了解决…

提前编译:AOT

JIT与AOT的区别 IT和AOT这个名词是指两种不同的编译方式,这两种编译方式的主要区别在于是否在“运行时”进行编译 (1)JIT,Just-in-time,动态(即时)编译,边运行边编译 在程序运行时,根据算法计算出热点代码,然后进行JI…

【LeetCode刷题-双指针】--674.最长连续递增序列

674.最长连续递增序列 class Solution {public int findLengthOfLCIS(int[] nums) {int n nums.length,i 0,j 0,res 0;while(j < n){if( j>0 && nums[j-1] > nums[j]){i j;}j;res Math.max(res,j - i);}return res;} }

工地环境监测系统,支持接入政府环保平台,扬尘噪声实时在线监测数据、联动自动控制、超标报警、数据分析等功能

智慧工地云平台源码 智慧工地系统全套源码 环境监测系统源码 随着我国城市的发展&#xff0c;对住宅等的建设要求不断提高&#xff0c;为了满足人民的需要&#xff0c;不断进行规划、建设&#xff0c;但与此同时由于施工、运输、设备、建筑材料、施工设备等因素的影响&#xff…

Vue向pdf文件中添加二维码

&#x1f680; 场景一&#xff1a;利用vue向pdf文件中写入二维码图片或其他图片 &#x1f680; 场景二&#xff1a;向pdf中添加水印 思路&#xff1a; 1、先通过url链接生成二维码&#xff0c;二维码存在于dom中 2、使用html2canvas库将二维码的dom转为一个canvas对象 3、根据c…

静态黑洞路由是什么作用,如何配置?

环境&#xff1a; 华三交换机 问题描述&#xff1a; 静态黑洞路由是什么作用&#xff0c;如何配置&#xff1f; 解决方案&#xff1a; 静态黑洞路由&#xff08;Static Blackhole Route&#xff09;是一种网络路由配置技术&#xff0c;用于将特定目的地的流量引导到一个黑洞…

【华为云IaaS基础三件套之----计算ECS、网络EIP、存储EVS】

MD[华为云IaaS基础三件套----计算、网络、存储] 华为云IaaS基础三件套之----计算ECS、网络EIP、存储EVS 说明: 这里只是简单从计算/网络/存储&#xff0c;进行介绍&#xff0c;阐明云上对于云下的优势&#xff1b;因ECS是三者综合&#xff0c;故最后说明。 1.网络----弹性公…

git分支管理以及不同git工作流对比

0、 单人开发场景 单人开发可能会出现的场景之一 如果多人协同开发我们则需要使用更加专业的工具Git&#xff08;分布式版本控制&#xff09; 1、多人协同工作使用git会出现什么问题? 代码冲突&#xff1a; 问题&#xff1a; 当多个开发者同时修改同一文件或同一行代码时…

深度学习之基于YoloV5的目标检测和双目测距系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 双目测距系统利用两个相机的图像来计算目标到相机的距离。通过对左右相机图像进行立体匹配&#xff0c;可以获得目标…

如果不用Baklib,哪一个帮助中心工具能够替代它?

在各行各业进入“留量时代”的当下&#xff0c;让用户获得良好的体验和留存老客户变得更为关键&#xff0c;这对于企业的客户服务提出了更高的要求。在使用各类互联网产品时&#xff0c;用户更倾向于通过自助方式寻找答案并解决问题&#xff0c;因此帮助中心的重要性也在不断提…

excel用RAND函数生成一个大于0小于1的随机数

插入-》函数&#xff1a; 选择RAND函数&#xff1a; 点击“继续”&#xff1a; 点击“确定”&#xff0c;就生成随机数了&#xff1a;

这个双11,谁赚了?

双11落幕&#xff0c;很多品牌迎来一年中最重要的一次生意爆发&#xff0c;但作为普通消费者&#xff0c;还是能感受到今年双11的消费氛围减弱了&#xff0c;一方面&#xff0c;电商大促驱向常态化&#xff0c;双11不一定是全年最低价&#xff0c;“有需要再买”的心态越来越多…

Domino为外出Internet邮件设置DKIM签名

大家好&#xff0c;才是真的好。 如果你看了上篇《Domino中和邮件安全有关的SPF、DKIM介绍》内容&#xff0c;想必就对DKIM概念不陌生&#xff0c;当然&#xff0c;上篇我们讲的是邮件入站的SFP、DKIM签名检查&#xff0c;这篇讲述的是外出邮件的DKIM签名。 是的&#xff0c;…

【第2章 Node.js基础】2.4 Node.js 全局对象(二) process 对象

process对象是一个全局对象&#xff0c;提供当前Node.js 进程信息并对其进行控制。通常用于编写本地命令行程序。 1.进程事件 process对象是EventEmitter类的实例&#xff0c;因此可以使用事件的方式来处理和监听process对象的各种事件。以下是一些常用的process对象事件&…

抖音直播 **** 匿名采集

2023年11月14日&#xff0c;弹幕消息为纯协议&#xff0c;可采集匿名直播间&#xff0c;可以采集发言&#xff0c;礼物&#xff0c;点赞&#xff0c;关注等匿名信息&#xff0c;不漏消息&#xff0c;所有消息均可采集 抖音直播***匿名采集2023-11-14 演示效果仅演示了发言类型的…

java入门,从CK到一部分数据到mysql

一、需求 需要从生产环境ck数据库导数据到mysql&#xff0c;数据量大约100w条记录。 二、处理步骤 1、这里的关键词是生产库&#xff0c;第二就是100w条记录。所以处理数据的时候就要遵守一定的规范。首先将原数据库表进行备份&#xff0c;或者将需要导出的数据建一张新的表了…