让我们一次把线性表搞个清清楚楚明明白白

【数据结构】【王道408】——PPT精要与思维导图实战解析 本文分享了一套高效学习数据结构的方法,特别针对王道408课程。该方法的核心在于将PPT精要截图与亲手绘制思维导图相结合,通过“捕获-构建-应用”三步,将抽象知识转化为可视化、结构化的知识图谱。文章以并查集、红黑树等难点为例,详细拆解了如何利用此方法攻克数据结构学习难关,实现从被动接受到主动构建的转变,从而扎实掌握知识并提升解题能力。 阅读详情

一、写在前面

如果我说数据结构是计算机从业人员最基本也必须要掌握的,就像演员记台词是本分一样,应该没人会纠正我吧。下面就让我们一起来将数据结构中最基本的线性表、栈和队列搞个清清楚楚明明白白。

二、线性表

首先我们要知道线性表是具有相同特性数据元素的一个有限序列,该序列中所含元素的个数称为线性表的长度。就比如说吧,有一队士兵,士兵的人数就对应线性表的长度,士兵的人数是有限的,这就对应了有限序列,队伍中所有的都是士兵,这就对应了相同特性的数据元素。

当然,在一队士兵中,只有一个士兵在队头,一个士兵在队尾,在队头的士兵前面没有其他士兵,在队尾的士兵后面也没有其他士兵。除了在队头队尾的士兵外,其他的士兵紧挨着站在其前面和后面的士兵只有一个。线性表也是这样的,只有一个表头元素,一个表尾元素,表头元素没有前驱,表尾元素没有后继,除表头表尾元素外,其他元素都只有一个直接前驱,一个直接后继。

线性表的存储结构有顺序存储结构和链式存储结构。前者称为顺序表,后者称为链表。

(1)顺序表

顺序表就是把线性表中的所有元素按照其逻辑顺序,依次存储到从指定存储位置开始的一块连续的存储空间中。就比如说下图中几个房间都挨着,你可以根据房间号马上就找到任何一个房间的位置,这就是顺序表的随机访问特性。虽然这样方便了,不过在插入删除房间时,就可能要移动很多位置才可以达到挨着的效果,所以说顺序表在插入删除元素时候要移动多个元素。图1
那么就到了定义顺序表结构体的时候了,其实很简单

typedef struct{
	int data[maxSize]; //存储顺序表元素的数组,类型就你随意定,这儿我定义了int型
	int length; //存储顺序表的长度
}Sqlist;//顺序表类型的定义

然后下面就开始初始化顺序表,插入元素,查找元素,删除元素了

//初始化
void initList(Sqlist &L){
	L.length = 0 ;//只需要把长度设为0就完事了
}

//插入
void insert(Sqlist &L,int p ,int e)//p是插入位置,e是插入元素
{
	int i = 0;
	if(p <0 || p>L.length || L.length == maxSize)//就位置错误,或者表已经达到最长,插入不成功,返回0
	{
		return 0;
	}
	for(i=L.length-1 ; i>=p ; --i){
		L.data[i+1] = L.data[i];//从后往前,逐个移位置
	}
	//现在就找到插入位置了,开始插入了
	L.data[p] = e;
	(++L.length);//插入了一个元素,长度加一
	return 1;//插入成功,返回1
}

//寻找
int find(Sqlist L, int e){
	int i;
	for(i=0; i > L.length;i++){
		if(e == L.data[i]){
			return i;//查找成功返回下标
		}
	}
	return -1;//不成功返回-1
}

//删除
int delete(Sqlist &L,int e){
	int index = find(L,e);//找到删除元素的下标
	if(index == -1){
		return 0;//元素不存在
	}
	for(i=index ; i<L.length;i++){
		L.data[i] = L.data[i+1];//用后面的元素覆盖
	}
	--(L.length);//长度减1
	return 1;//删除成功
}

(2)链表

在链式存储中,每个结点不仅包含所存元素的信息,还包含着元素之间的逻辑信息。接着以房间为例,如下图,链表房间是散落的,每个房间有指向下一个房间的箭头,要想访问房间必须从第一个房间开始,依次访问,所以链式存储方式不支持随机访问。由于链表中的每个结点还需要划出一部分空间来存储指向下一个结点位置的指针,因此链表中结点的存储空间利用率较顺序表稍低一点。链表的结点可以散落在内存中的任何位置,而且不需要一次性划分所有结点所需的空间,因此,链表支持存储空间的动态分配。还是房间这个例子,如果新加一个房间,只需要改动房间的指向箭头就可以了,所以说,链表中进行插入删除操作不需要移动元素。

链表中还有单链表、双链表、循环单链表、循环双链表和静态链表之分。

(I)单链表

链表在每个结点中除了包含数据域外,还包含一个指针域,用以指向其后继结点。如下图所示
在这里插入图片描述
可以看到上图有一个头结点,这儿,咱就聊一下带与不带头结点的区别:
(1)带头结点的单链表,头指针head指向头结点,头结点的数据域不包含任何信息,从头结点的后继结点开始存储数据信息。头指针始终不等于NULL,当head—>next等于NULL时,链表为空。
(2)不带头结点的单链表,头指针head始终指向开始结点,也就是图中的A1,当head等于NULL时,链表为空。
单链表的结构体定义以及操作如下(双链表等类似,不再仔细说明):

//结构体定义
typedef struct LNode{
		int data;//存放数据域
		struct LNode *next;//指向后继结点的指针
}LNode;

//尾插法建立链表
void create(LNode *&C , int a[] , int n ){
	LNode *s,*r;//s用来指向新申请的结点,r始终指向C的终端结点
	int i;
	C = (LNode *)malloc (sizeof(LNode));//申请C的头结点空间
	r = C;
	for(i=0;i<n;i++){
		s=(LNode *)malloc (sizeof(LNode)); 
		s->data = a[i];//用新申请的结点接受a中的一个元素
		r->next = s;//用r接受新结点
		r = r->next;//r指向终端结点
	}
	r->next = NULL;//全部插入完成,终端结点置为NULL
}

//结点查找
while(p->next!=NULL){
	if(p->next->data == x){
		break;
	}
	p = p->next;
}
if(p->next == NULL){
	return 0;//查找失败
}

//结点删除
q = p->next;
p->next = p->next->next;//直接用后一个覆盖
free(q);//释放内存空间
(II)双链表

双链表就是在单链表的结点上又增添了一个指针域,指向当前结点的前驱。
在这里插入图片描述

(III)循环单链表

循环单链表就是在单链表的基础上,让终端结点指向链表的第一个结点。
在这里插入图片描述

(IV)循环双链表

和循环单链表类似,循环双链表就是在双链表的基础上让终端结点的next指针指向头结点,头结点的prior指针指向终端结点。
在这里插入图片描述

(V)静态链表

静态链表借助一维数组来表示,下图中左边为静态链表,右边为其对应的一般链表
在这里插入图片描述

三、结局

反正就是不怎么难,理解就完事了。图画的实在是太丑了。

数据结构与算法分析复习笔记(持续更新...欢迎指正) 数据结构与算法分析 文章目录数据结构与算法分析前言一、数据结构概述数据结构相关基本概念1. 数据2. 数据元素3. 数据项4. 数据对象5. 数据结构6. 程序结构7. 数据类型8. 算法基本结构简介1.从集合到结构体2.映射、函数、算法3.线性结构、树形结构、图形结构算法性能评价1.算法的时间复杂度二、线性结构( 线性表)三、树形结构四、图形结构 前言 复习408考研数据结构和学习蓝桥杯的笔记,也有相关的离散数学基础内容记录,本笔记以应试为主 持续更新ing 一、数据结构概述 数据结构相关基本概念 阅读详情

相关推荐

(一)Tushare Pro教程:股票基本数据接口

 一直使用tushare作数据源,这里开个教程大家一起学习。 一、介绍        tushare是一个python股票数据源,现已升级到tushare pro版本,新版本在数据稳定性和获取速率上大幅提升。与wind、东财等收费数据源相比,tushare pro算是金融数据界的良心之作,其为从事金融工程、量化研究等方向的同学们提供了便利。tushare pro还有一点突出的特色就是已经将股票...

虎毛的博客 4万+

数据结构(知识点006)

数据结构(知识点006) 第二章 线性表 本章主要介绍: 1.什么是线性表2.顺序表及初始化过程详解3.顺序表以及基本操作4.链表(链式存储结构)及创建(C语言详解版) 5.链表的基本操作6.顺序表和链表的优缺点7.静态链表及实现8.静态链表基本操作9.静态链表和动态链表区别详解 10.循环链表(约瑟夫环)的建立及C语言实现11.双向链表及其创建12.双向链表基本操作13.双向循环链表及创建 13.数据结构实现项目——俄罗斯...

Outsider98k的博客 231

Maya绑定:人物绑定详细案例(创建骨骼、镜像骨骼、IK创建、IK打组、IK控制器、FK控制器、烘焙动画、导出)

Maya绑定:人物绑定详细案例(创建骨骼、镜像骨骼、IK创建、IK打组、IK控制器、FK控制器、烘焙动画、导出)

m0_45877477的博客 1627

数据结构学习笔记——第2章 线性表

数据结构学习笔记——第2章 线性表2 线性表2.1 线性表的定义和基本操作2.1.1 线性表的定义2.1.2 线性表的基本操作2.2 线性表的顺序表示2.2.1 顺序表的定义2.2.2 顺序表上基本操作的实现2.3 线性表的链式表示2.3.1 单链表的定义2.3.2 单链表上基本操作的实现2.3.3 双链表2.3.4 循环链表2.3.5 静态链表2.3.6 顺序表和链表的比较

foxlin1116的博客 512

QUIC 协议域名封堵:核心原理、关键技术与实现路径(C/C++代码实现)

随着 QUIC 协议在互联网领域的广泛应用,其基于 UDP 的传输特性与加密设计,打破了传统 TCP 协议下的域名封堵逻辑,给网络合规管理与安全防护带来新的技术难题。本文将脱离具体代码实现,聚焦 QUIC 协议域名封堵的核心原理、关键技术环节与实际落地路径,从协议特性本质出发,解析如何在遵循 RFC 9000、RFC 9001 等规范的前提下,实现对 QUIC 流量的精准域名封堵。

chen1415886044的博客 1465

高斯-约当(Gauss-Jordan)消元法——c++代码实现

具体算法的详细原理请参照此篇博客:高斯-约当(Gauss-Jordan)消元法下面是具体c++代码,不保证程序最优化,提供一个可行的程序,供大家改进,同时感谢大家提意见。——大神勿喷呀,我是一个小菜鸟~void Guss_Jordan(int n,double *a)//阶数n 系数矩阵a { double*a_temp = new double[n*n * 2];//a与单位矩阵的组合

zwz的学习之路 6872

马上2021年了线性表你还不知道原理?给老王整的明明白白

线性表必知必懂的原理给老王整的明明白白

TrueDei 3308

【福建dem】原始高程数据tif格式

DEM(Digital Elevation Model,数字高程模型)是一种地理信息系统中的关键数据集,它提供了地表地形的三维信息,通常用于分析地貌特征、模拟水文过程、规划建设、灾害预警等多个领域。这种数据对于地理分析非常有价值,例如,它可以用于计算坡度、坡向、地形粗糙度等地形特征,或者进行洪水模拟、地质灾害评估、太阳能辐射分析等。“福建dem原始高程数据tif格式”是研究和理解福建省地形地貌的重要资源,结合GIS工具,可以揭示丰富的地理信息,为科研、工程和决策提供有力支持。

鸿业远图科技 943

关于数据结构中线性表和链表简要概述

编程离不开数据结构,而线性表和链表是数据结构中最基本的两种类型,下面介绍一下线性表和链表的一些特性 1.线性表 存储方式:顾名思义,线性表就是以线性关系进行存储的表,也可以说是顺序表,其空间的内存地址一般而言都是连续的 时间复杂度:查找:O(1)     插入和删除:O(n) 空间复杂度:需要提前申请足够的内存单元,一般都会申请更大一些空间,容易造成资源浪费 2.链表 存储方式:采用链式存储结构,...

qq_43733715的博客 336

不用写触发器!帆软填报报表自动记录创建/修改时间的终极方案

本文详细介绍了帆软填报报表中无需编写数据库触发器,即可自动记录数据创建时间和修改时间的终极方案。该方案利用帆软内置函数和单元格条件属性,在应用层实现日期自动生成,有效规避了触发器带来的权限、维护和部署难题,为数据填报提供了更轻量、灵活且易于维护的解决方案。

weixin_28040125的博客 358

【Flink on k8s】- 1 - Flink Kubernetes Operator 简介 2023

Flink Kubernetes Operator 可以与 Kubernetes 的其他功能和工具集成,可以帮助用户快速定位和解决问题。Flink Kubernetes Operator可以在Kubernetes上实现高可用性,以确保 Flink 集群的稳定性和可靠性。Flink Kubernetes Operator 可以快速地部署 Flink 集群,而无需手动配置和管理集群。Flink Kubernetes Operator可以将Flink集群与其他应用程序隔离,以避免资源争用和干扰。

欢迎来到我的博客,一起探索代码里的世界! 1344

24张图,九大数据结构安排得明明白白!

点击关注上方“五分钟学算法”, 设为“置顶或星标”,第一时间送达干货。 数据结构想必大家都不会陌生,对于一个成熟的程序员而言,熟悉和掌握数据结构和算法也是基本功之一。数据结构本身其实不过是数据按照特点关系进行存储或者组织的集合,特殊的结构在不同的应用场景中往往会带来不一样的处理效率。 常用的数据结构可根据数据访问的特点分为线性结构和非线性...

墨鱼菜鸡 292

Istio ICA考试之路---3-2

部署2个测试容器,分别是test和test2.test注入标签subset=v1。这里文档中省略了metadata的3行,可以从前面任意一个yaml复制粘贴过来。通过test2测试容器访问,50%概率触发500故障注入。通过test测试容器访问,20%概率触发延迟注入。发起20次请求,一共10次被500。

Q先生 725

图解!九大常见数据结构被24张图给安排的明明白白!

数据结构想必大家都不会陌生,对于一个成熟的程序员而言,熟悉和掌握数据结构和算法也是基本功之一。数据结构本身其实不过是数据按照特点关系进行存储或者组织的集合,特殊的结构在不同的应用场景中往往会带来不一样的处理效率。 常用的数据结构可根据数据访问的特点分为线性结构和非线性结构。线性结构包括常见的链表、栈、队列等,非线性结构包括树、图等。数据结构种类繁多,本文将通过图解的方式对常用的数据结构进行理论上的介绍和讲解,以方便大家掌握常用数据结构的基本知识。 本文提纲 1 数组 数组可以说是最基本最常见的数据结构

weixin_47083537的博客 323

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

24张图,九大数据结构安排得明明白白

散列表的实现原理正是映射的原理,通过设定的一个关键字和一个映射函数,就可以直接获得访问数据的地址,实现O(1)的数据访问效率。从发生不平衡的结点起,沿刚才回溯的路径取直接下两层的结点,如果这三个结点在一条直线上,则采用单旋转进行平衡化,如果这三个结点位于一条折线上,则采用双旋转进行平衡化。由于二叉排序树本身为有序,当插入一个有序程度十分高的序列时,生成的二叉排序树会持续在某个方向的字数上插入数据,导致最终的二叉排序树会退化为链表,从而使得二叉树的查询和插入效率恶化。存储的顺序可以按照顶点的编号顺序进行。

代码界的扛把子 210

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

select count慢_MySQL索引原理与慢查询优化,看完把你安排的明明白白

索引目的索引的目的在于提高查询效率,可以类比字典,如果要查“mysql”这个单词,我们肯定需要定位到m字母,然后从下往下找到y字母,再找到剩下的sql。如果没有索引,那么你可能需要把所有单词看一遍才能找到你想要的,如果我想找到m开头的单词呢?或者w开头的单词呢?是不是觉得如果没有索引,这个事情根本无法完成?索引原理除了词典,生活中随处可见索引的例子,如火车站的车次表、图书的目录等。它们的原理都是一...

weixin_39820136的博客 269

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

周记-Repeater中的children和item区别

在开发的界面时,用到了,表头需要根据是否存在显示的项,来进行显示。 如果判断有没有存在显示的项,可以用下面的代码 表示的子项,而是访问中的项,这里要用到,不能去访问。这是一个比较简单的问题,这里我学到的一点是,了解基本用法,也就是用某个框架时,需要了解和掌握基本的惯用法,包括学习编程语言时也是。掌握了惯用法,可以类推,而不是每次都在互联网上查找。虚拟机占的磁盘太大了,所以用了移动硬盘,虚拟机也常开着,然后电脑就不时的蓝屏。找IT协助,说只能重装系统试下,那还是算了。感觉还是硬盘掉了的原因,容易碰到,链接不稳

天马行空 385

2024年Java基础 - 包,常见修饰符,内部类,一篇文章把InnoDB的事务机制给你弄的明明白白

A:定义包的格式package 包名;多级包用.分开即可B:定义包的注意事项A:package语句必须是程序的第一条可执行的代码B:package语句在一个java文件中只能有一个C:如果没有package,默认表示无包名A:案例演示为什么要有import其实就是让有包的类对调用者可见,不用写全类名了B:导包格式import 包名;注意:这种方式导入是到类的名称。虽然可以最后写*,但是不建议。C:package,import,class有没有顺序关系(面试题)

2401_84558326的博客 493

关键路径例题图解_图解!九大常见数据结构被24张图给安排的明明白白

数据结构想必大家都不会陌生,对于一个成熟的程序员而言,熟悉和掌握数据结构和算法也是基本功之一。数据结构本身其实不过是数据按照特点关系进行存储或者组织的集合,特殊的结构在不同的应用场景中往往会带来不一样的处理效率。常用的数据结构可根据数据访问的特点分为线性结构和非线性结构。线性结构包括常见的链表、栈、队列等,非线性结构包括树、图等。数据结构种类繁多,本文将通过图解的方式对常用的数据结构进行理论上的介...

weixin_39662432的博客 1831

严蔚敏数据结构c++版微盘_数据结构重学笔记

更新:考试也过了,这个也停更半年啦哈哈哈哈所以我料定我就是这种半途而fei的人做了个公众号,个人的,也不准备盈利,随缘更新,主要就是一些学习笔记和学习思路,心情好的时候出一套教学视频什么的。叫小王会编程,大家可以看看。正在同时更javaweb和java0基础,毕竟年轻,共同语言多一些,教程不会那么死板鸭感觉把springboot更完之后大家就可以做出世面上一些简单的网站了,还想做小程序的教学。反正...

weixin_39646018的博客 279
上一篇: 计算机网络中的时延到底是个什么东西?
下一篇: 用浅显的话语来讲述栈这种数据结构
Two_Bits
博客等级 码龄8年 25粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值