数据结构初阶 —— 线性表(顺序表/链表)

顺序表和链表 顺序表和链表的简单介绍和实现 阅读详情

目录

一,线性表

二,顺序表

三,链表

单链表(单向无头不循环)

带头双向循环链表

四,备注


一,线性表

  • 具有相同特性的数据元素的有限序列,是线性数据结构中最简单、最基本、最常用的;
  • 在逻辑上是线性结构(是连续的一条直线),但在物理结构上并不一定是连续的;
  • 线性表在物理上存储时,通常以数组和链式结构的形式存储;
  • 常见的线性表:顺序表、链表,及栈、队列、字符串等;

二,顺序表

  • 用一段物理地址连续的存储单元,依次存储数据元素的线性结构;
  • 一般情况下采用数组存储,在数组上完成数据的增删查改;

顺序表分类

  • 静态顺序表:使用定长数组存储元素;
  • 动态顺序表:使用动态开辟的数组存储;
//静态顺序表,顺序表的静态存储
#define N 7 
typedef int SLDataType;
typedef struct SeqList
{
	SLDataType data[N]; //定长数组
	size_t size; //有效数据个数
}SeqList;
//动态顺序表,顺序表的动态存储
typedef int SLDataType;
typedef struct SeqList
{
	SLDataType* data; //指向动态开辟的数组
	size_t size; //有效数据个数
	size_t capicity; //容量空间(涉及扩容)
}SeqList;

顺序表缺陷

  • 增容需申请新空间,还可能需拷贝数据和释放旧空间,会有不小的消耗;
  • 增容一般为2倍增容,会有一定空间浪费;
  • 插入、删除,时间复杂度为O(N),效率较低;

接口实现

  • 由于静态顺序表,大小固定,现实中一般使用动态顺序表,大小可调整;
// 基本增删查改接口
// 顺序表初始化
void SeqListInit(SeqList* psl);
// 顺序表销毁
void SeqListDestroy(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 SeqListPrint(SeqList* psl);

注:完整接口实现代码路径;

试题

三,链表

  • 在物理存储结构上非连续、非顺序的;
  • 数据元素的逻辑顺序是通过链表中的指针链接次序实现的 ;

链表分类

  • 单向或双向链表
  • 带头或不带头链表(哨兵位)
  • 循环或不循环链表

单链表(单向无头不循环)
  • 结构简单,一般不会单独存数据,笔试、面试较多;
//单链表(无头单向不循环)
typedef int SLDataType;
typedef struct SListNode
{
	SLDataType data;
	struct SListNode* next;
}SListNode;

接口实现

//基本增删查改接口
//动态申请空间,生成一个节点
SListNode* BuySListNode(SLDataType x);

//传二级指针,是因为要在函数外修改phead
//单链表尾插
void SListPushBack(SListNode** pphead, SLDataType x);
//单链表头插
void SListPushFront(SListNode** pphead, SLDataType x);

//单链表尾删
void SListPopBack(SListNode** pphead);
//单链表头删
void SListPopFront(SListNode** pphead);

//单链表查找,先查找根据返回位置进行修改(无需在增加修改接口)
SListNode* SListFind(SListNode* phead, SLDataType x);

//单链表指定位置前插入,先查找在根据返回位置插入(插入时还需遍历链表效率低)
//单链表不适合在指定位置前面插入
void SListInsertBefore(SListNode** pphead, SListNode* pos, SLDataType x);
//单链表指定位置后插入,先查找在根据返回位置插入
void SListInsertAfter(SListNode* pos, SLDataType x);

//单链表指定位置删除,先查找在根据返回位置删除(删除时还需遍历链表效率低)
//单链表不适合在指定位置删除
void SListErase(SListNode** pphead, SListNode* pos);
//单链表指定位置后删除
void SListEraseAfter(SListNode* pos);

//单链表节点释放
void SListDestroy(SListNode** pphead);

//单链表打印
void SListPrint(SListNode* phead);
//单链表节点个数
int SListSize(SListNode* phead);
//是否为空链表
bool SListEmpty(SListNode* phead);

注:完整接口实现代码路径;

试题

判断链表是否带环

 分析:假设fast比slow快一倍,则L=M

 \frac{m+n}{i*C+n} = \frac{1}{2}   或   \frac{m-n}{i*C-n} = \frac{1}{2}

 推导出:

L = i*C - \left ( m+n \right ) = i*C - X  或

L = i*C - \left ( m-n \right ) = i*C - X

 结论:

头节点到入环起始节点之间的节点数等于相遇节点到入环起始节点之间的节点数!

即,一指针从头走,一指针从相遇节点走,每次均走一步,最终会在入环节点相遇;

带头双向循环链表
  • 带头双向循环链表,结构最复杂,一般用于单独存储数据;
  • 结构优势明显,实际使用的数据结构;

//双向链表
typedef int LTDataType;
typedef struct ListNode
{
	struct ListNode* prev;
	struct ListNode* next;
	LTDataType data;
}LTNode;

接口实现

//基本增删查改接口
//初始化链表,会创建头节点(哨兵)
void ListInit(LTNode** pphead);
//释放链表节点
void ListDestroy(LTNode* phead);

//链表尾插
void ListPushBack(LTNode* phead, LTDataType x);
//链表尾删
void ListPopBack(LTNode* phead);

//链表头插
void ListPushFront(LTNode* phead, LTDataType x);
//链表头删
void ListPopFront(LTNode* phead);

//查找节点
ListNode* ListFind(LTNode* phead, LTDataType x);

//指定位置前插入
void ListInsert(LTNode* pos, LTDataType x);
//指定位置删除
void ListErase(LTNode* pos);

//打印链表
void ListPrint(LTNode* phead);
//求链表的节点数
size_t ListSize(LTNode* phead);
//判断是否为空链表
bool ListEmpty(LTNode* phead);

注:完整接口实现代码路径;

四,备注

  • 存储体系结构及局部原理;
  • cpu访问内存时,会读取一段数据到缓存中;

拓展:与程序员相关的CPU缓存知识;

【数据结构初阶】顺序表和链表 本文介绍了线性表的两种主要实现方式:顺序表和链表。顺序表采用连续存储空间,支持高效随机访问(O(1))但插入删除效率较低;链表通过节点链接实现,插入删除高效(O(1))但访问需遍历(O(n))。具体阐述了: 顺序表分为静态(固定大小)和动态(可扩容)两种,动态顺序表通过数组扩容实现,但扩容时需数据迁移; 单链表包含头插/尾插等基本操作实现,每个节点含数据和后继指针; 双链表节点增加前驱指针,支持双向遍历,操作更灵活但内存开销更大。 文中通过C语言代码示例详细展示了各种数据结构的初始化、增删改查等核心操作实现 阅读详情

相关推荐

数据结构之线性表(顺序表和链表)

线性表 首先线性表的定义就是:零个或多个数据元素的有限序列。 列如高考前每个班级排队照准考证,这个队伍就可以看做一个线性表,大家都井然有序的排着队,是一个有限的序列,一个班就那么几十个人,而且每个人之间都是有顺序的,站错了顺序就不好核对信息。相对于在广场上一群人在跳广场舞、打拳、散步,这就不是线性表,首先它不是有序的序列,而是散乱的一堆,而且相对来说不是有限的。计算机处理的对象都是有限的,...

爱吃草莓蛋糕的猴博客 2389

初始数据结构-线性表

线性表 一:什么是线性表 线性表全名线性存储结构,是最基本、最简单、也是最常用的一种数据结构。 二:线性表的特点 存储的数据本身的类型一定保持相同,是int型就都是int型,是结构体就都是一种结构体。(方便寻址) 数据一旦用线性表存储,各个数据元素之间的相对位置就固定了。 三:线性表分类 顺序表,链表,栈,队列 1:顺序表 顺序表是线性表的一种,其特点是顺序表在物理层上的存储是连续的。 数组是最常见的线性表 1.初始化 2.插入元素 ​ 在下标为2的地方插入一个6 3.删除元素 这样的存储

weixin_44448217的博客 1575

c语言数据结构线性表实验(包括顺序表和链表)

目录 顺序表 1.插入元素. 2.删除元素. 3.查找元素. 4.判断顺序表是否对称. 5.重新按奇偶排列. 6.合并两个顺序表. 链表 1.创建一个链表lklist 2.遍历链表lklist 3.逆置链表lklist 4.删除lklist中偶数结点

数据结构--线性表--顺序表和链表

不带头单向不循环链表只适合头插、头删,进行其他的操作效率都不高不带头单向不循环链表只有一个next,所以要注意不带头单向不循环链表的相交不可能是一个X型,两个不带头单向不循环链表相交一定是Y型。

kk6kk的博客 550

R语言笔记三:矩阵、数组、列表和数据框

1.矩阵        矩阵是二维的,需要有行和列。向量是一维的。        在R软件中,矩阵是有维数的向量,这里的矩阵元素可以是数值型、字符型或者逻辑型,但是每个元素必须拥有相同的模式,这个和向量一致。 (1)创建矩阵: m <- matrix(1:20,4,5) 行数和列数的分配必须满足分配条件。若分配的行列过大,分配的元素不足够,则报错。 m <-

weixin_44384631的博客 6210

C语言实现贪吃蛇小游戏!(超简单详细)详细思路+源码分享

我们的今天的目标就是:用C语言来实现一个贪吃蛇项目,也不用太复杂,初学者能看懂就行!

致力于C语言C++知识分享! 1万+

数据结构与算法基础(王卓)(2):线性表的初始化及结构整理

位置:PPT:46;其中ElemType表示:线性表中的元素的类型也可以是自己自定义的数据结构类型位置:PPT:62;

Zz_zzzzzzz__的博客 2882

KANO分析模型

KANO分析模型的基本概念,目的意义,应用场景,实现方法和示例等

JasonH2021的博客 3066

数据结构--2.线性表

在我们数据结构中,最简单的一种数据结构,便是线性表,其逻辑关系为线性关系,那么我们就一起来了解一下线性表的几种基本结构 线性表

平生的小铺子 323

Unity3D实战:用EasyAR4.0稀疏空间地图打造AR导航应用(附完整代码)

本文详细介绍了如何使用Unity3D和EasyAR4.0的SparseSpatialMap功能构建AR导航应用。通过稀疏空间地图技术,开发者可以创建室内导航系统,解决传统GPS在室内环境中的局限性。文章包含完整代码示例,涵盖环境配置、地图构建、导航实现及性能优化等关键步骤,助力开发者快速掌握AR导航开发技巧。

t8u9v0的博客 1197

《python神经网络编程》程序实现

《python神经网络编程》程序实现 通过对这本书的学习,结合这本书的内容: 完成了以下代码: 其中NN.py实现了一个类,这个类可以完成神经网络的初始化,训练以及输入数据并得出结果。 而run.py则是对神经网络类的使用 NN.py: import numpy import scipy.special #神经网络类的实现 class neuralNetwork: #构造函数初始化类 def __init__(self,inputnodes,hiddennodes,outputnodes

ms8617484的博客 619

【算法与数据结构】线性表

【算法与数据结构】线性表

H_Lu711的博客 1753

使用 MATLAB/Simulink + Simscape Electrical 构建一个他励直流电机的启动与制动过程仿真模型

直流电机在工业控制、电动车辆、自动化设备中广泛应用。其中,他励直流电机(Separately Excited DC Motor)因其励磁绕组与电枢绕组分别供电,具有良好的调速性能和启动特性,常用于需要平稳启动和精确控制的场合。在实际应用中,电机的启动过程和制动过程对电网、机械系统以及电机本身都具有重要影响。因此,仿真分析他励直流电机的启动与制动特性,是电机控制设计的重要环节。本文将详细介绍如何使用构建一个他励直流电机的启动与制动过程仿真模型,并通过仿真分析其动态响应。本文详细介绍了如何使用构建一个。

amy_mhd的博客 231

《数据结构初阶》【顺序表 + 单链表 + 双向链表】

博客内容主要划分为:数据结构的介绍 + 数据结构的实现。主要涉及的数据结构:顺序表、单链表、双向链表。

序属秋秋秋的博客 2536

【YOLOv8科研级优化】集成YOLOv10的SCDown采样模块,让你的模型下采样更高效更精准

打开确保模型解析器能识别SCDown模块。通过将YOLOv10的SCDown模块集成到YOLOv8中,我们实现了一个“细节保留+高效下采样”的目标检测模型。这个改进不仅在工程上能提升小目标、细粒度场景的检测效果,更在科研上提供了“分阶段下采样”的创新思路——这种思路可以延伸到其他卷积网络(如ResNet、MobileNet)的下采样层改进中,帮你在论文中打造独特的研究点。

m0_71589036的博客 137

前拉后推计划逻辑适用于哪些行业和企业规模?

《前拉后推计划逻辑的行业适用性分析》摘要:前拉后推计划逻辑(需求端后推锚定交付、供应端前拉匹配资源)最适用于需求波动大且具规模效益的行业,包括家具制造(定制化需求+批量运输)、机械装备(非标设备+部件采购)、消费电子(短周期产品+核心部件备货)及汽车配套(交期绑定+批量生产)等领域。该模式要求企业具备:1)独立计划部门;2)ERP/MES等信息系统;3)资源冗余能力,故更适配中型(1-10亿营收)和大型企业(10亿+)。小型企业需简化应用,仅聚焦关键环节。不适配需求稳定(如快消品)、无规模效益或短周期生产的

追随内心 144

《数据结构》顺序表与链表

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

1 5002

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【初阶数据与算法】线性表之顺序表的定义与实现

其中memmove的第一个参数是我们要移动的目标位置的地址,很明显就是顺序表中第二个元素的地址,即ps->arr+1,第二个参数就是我们源位置的地址,是顺序表中第一个元素的地址,即ps->arr,它的第三个参数就是要拷贝的字节数,就是有效元素个数乘以一个元素的大小。在上面静态顺序表的静态是指它的大小是固定的,同理,动态顺序表里面的动态就是指顺序表的大小是不固定的,也就是顺序表底层的数组的大小是不固定的,可以动态的变化,比如开始时给出4个元素的大小,不够时顺序表可以实现自动增容。

hdxbufcbjuhg的博客 8780

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Statistics and Machine Learning Toolbox

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

【数据结构初阶】二、 线性表里的顺序表(C语言实现顺序表)

线性表里的顺序表:1 . 线性表 ; 2 . 顺序表 ; 3 .接口实现(实现动态顺序表) ;4 . 对应代码

正在努力学C呀!(要学好久呢......) 4931

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【数据结构初阶】顺序表专题

动态顺序表的实现 增删查改

凤年徐的博客 2851

【数据结构篇C++实现】- 线性表 - 顺序表和链表

线性表知识总结,一文搞懂什么是顺序表与链表,以及常见的操作

陈七的博客,学习知识分享,期待与大家的交流 4258

数据结构初阶:线性表

1111

yourfriendyo的博客 2749

《线性表、顺序表与链表》教案(C语言版本)

定义:线性表是n个具有相同特性的数据元素的有限序列,逻辑上连续,物理上可连续(顺序表)或不连续(链表)。实现动态顺序表的缩容功能(当元素数量小于容量的1/4时,容量减半)。对比单向链表和双向链表在删除尾节点时的时间复杂度差异。:顺序表的动态增容、链表的指针操作、时间复杂度分析。:链表节点的插入与删除逻辑、顺序表与链表的性能权衡。:合并两个有序链表,返回新的有序链表头节点。能够通过代码实现顺序表和链表的基本功能。掌握顺序表和链表的实现原理及核心操作。顺序表和链表的实现原理及适用场景。

maomi_9526的博客 2883

【数据结构初阶】线性表——顺序表(手撕顺序表)

想成为一名合格程序员,那么必不可少要学习数据结构,为后面软件开发等项目打下基础。那么现在从初阶的数据结构线性表——顺序表开始学习。那么将数据结构初阶的线性表——顺序表就到这里了。httpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttps。...............

m0_68931081的博客 765

【数据结构初阶-线性表】顺序表和链表,多图详解

细细咀嚼...

BaconZzz的博客 1929

数据结构 顺序表和链表

顺序表和链表的实现需要一定的c语言代码能力,需要掌握动态内存管理的相关知识,会使用mallocreallocfree等函数1.中间头部插入,删除数据,需要挪动数据,效率低下。2,空间不够,扩容,扩容有一定损耗,其次可能有一定的空间浪费。

weixin_67645591的博客 1834
上一篇: 数据结构初阶 —— 数据结构概述
下一篇: 数据结构初阶 —— 线性表(栈/队列)
挨代码
博客等级 码龄5年 1696粉丝 384原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值