数据结构与算法学习(2)——线性表

数据结构与算法 个人学习总结 第2章 线性表 数据结构与算法 个人学习总结 第2章 线性表(原创文章,转载请注明出处) 包括顺序表、链表的算法思路,代码,各种线性表的对比 阅读详情

目录

线性表

何为“线性”:

顺序存储结构——顺序表

顺序表操作实现

顺序表的优缺点

链式存储结构——链表

单链表

表示方法

带头结点的单链表

单链表操作实现

建立带头结点的单链表

顺序(单)链表

双向链表​编辑

顺序表和链表的比较

应用(算法思路)

参考资料:


线性表

L=\left ( \alpha _{1},\alpha_{2},...,\alpha_{n} \right )

        由n个数据特性相同的元素,例如书籍信息(结构体),构成的有限序列。

何为“线性”:

        除第一个和最后一个数据元素外,每个数据元素只有一个前驱和后驱数据元素。


顺序存储结构——顺序表

        通过数组的方式,将线性表的数据元素存储在一块连续地址空间的内存单元中,从而得到顺序表的特点——逻辑上相邻的数据元素,其物理次序也是相邻的。

        Loc\left ( a_{i} \right )=Loc(a_{0})+i\ast l

顺序存储
存储地址bb+l...b+i*l...b+n*j
存储内容a0a1...ai...an

定义结构体如下:

#define MaxSize 100

//顺序表的静态数组实现方法
typedef struct
{
    DataType list[MaxSize];    //数据存储在数组中
    int size;                  //数据元素个数
}SeqList;

//动态分配顺序存储结构(优先级高)
typedef struct
{
    ElemType *elem;            //存储空间基址
    int length;                //当前长度
}SqList;

下面以动态分配方法定义的结构体为基础来实现顺序表的操作。

顺序表操作实现

1.初始化操作

typedef int Status;
 
#define TRUE  1
 
#define FALSE 0
 
#define OK 1
 
#define ERROR 0
 
#define INFEASIBLE  -1
 
#define OVERFLOW  -2

Status InitList(SqList &L)
{//初始化
    L.elem = new ElemType[MaxSize];    //请看注解

    if(!L.elem)    return OVERFLOW;
    L.length = 0;

    return OK;
}

        注:通常来说,当在局部函数中new出一段新的空间,该段空间在局部函数调用结束后仍然能够使用,可以用来向主函数传递参数。另外需要注意的是,new的使用格式,new出来的是一段空间的首地址。所以一般需要用指针来存放这段地址。

2.取值操作

Status GetElem (SqList L, int i, ElemType &e)
{
    if ( i<1 || i>L.length )  // i 不在有效位置
        return  ERROR;

    e = L.elem[i-1];

    return OK;
}   // 时间复杂度  O(1)   取决于i

3.查找操作

int LocateElem( SqList L, ElemType e)
{//在顺序表L中查找值为 e 的数据元素,返回其序号
    for( i = 0; i < L.length; i++ )
        if ( L.elem[i] == e ) 
            return i+1;

    return 0;
}//时间复杂度  O(n)

4.插入操作

Status ListInsert (SqList &L, int i, ElemType e)
{
    if(i<1 || i >L.length+1)   
        return ERROR;// 位置超界

    if (L.length == MAXSIZE) 
        return ERROR; // 存储空间已满

    for(j=L.length-1; j>=i-1;j--)
        L.elem[j+1]=L.elem[j];

    L.elem[i-1] = e;
    L.length++;
	 
    return OK;
}//时间复杂度  O(n)

5.删除操作

和插入操作差不多,只需要关注超界的L.length+1->L.length即可,其他反向操作就不多水啦

顺序表的优缺点

顺序表的优点

  • 逻辑相邻,物理相邻
  • 可随机存取任一元素
  • 存储空间使用紧凑

顺序表的缺点

  • 插入、删除操作需要移动大量的元素
  • 预先分配空间需按最大空间分配,利用不充分
  • 表容量难以扩充

链式存储结构——链表

链式存储结构存储线性表数据元素的方式是,把存储有数据元素的结点用指针域构造成链。

单链表

结点:数据域|指针域  
数据域:元素本身信息
指针域:指示直接后继的存储位置

特点:

  • 不需预先分配空间
  • 指针占用额外存储空间
  • 不能随机存取,查找速度慢

表示方法

typedef struct LNode
{ 
    ElemType      data;		// 数据域
    struct LNode *next; 	// 指针域
}LNode,*LinkList;

带头结点的单链表

不带头结点的单链表

空表条件: L == NULL                   表尾条件: P->next == NULL

带头结点的单链表

空表条件: L->next == NULL        表尾条件: P->next == NULL

单链表操作实现

1.初始化操作

Status InitList(LinkList &L)
{
    L = new LNode;    //生成头结点
    L->next = NULL;   //头结点的指针域置空

    return OK;
}

2.取第i个数据元素的操作

Status GetElem (LinkList L, int i, ElemType &e)
{// L指向头结点
    int j=1; 
    LinkList p=L->next;  // p指向首元结点
    while(j<i && P)
    {
        p=p->next; 
		++j;
    }

    if(!p || j>i) 
        return ERROR; 

// i>n 或 i<=0  所指位置超界
    e=p->data;
    return OK;
} // 时间复杂度O(n) 

3.查找操作

LNode  *LocateElem (LinkList L, ElemType e)
{// L指向头结点
    p=L->next;  // p指向首元结点
   	while(p && p->data != e )
    	p=p->next; 

	return p; 
    // 查找成功返回值为e的结点地址,失败p为NULL
} // 时间复杂度O(n) 

4.插入操作

Status ListInsert (LinkList L, int i, ElemType e)
{// L指向头结点
    p=L;j=0;
    while(p && j<i-1) //p是要插入结点的前驱结点
    {
        p=p->next; 
        ++j;
    }
    if (!p||j>i-1) return ERROR;  // i>n+1 or i<1

    s=new LNode;   //(LinkList)malloc(sizeof(LNode));
    s->data=e;    
    s->next=p->next;
    p->next=s;
    return OK;
}//时间复杂度O(n)

5.删除操作

Status ListDelete (LinkList &L, int i)
{
    p=L;  j=0;
    while( p->next && j<i-1 )
    {
    //查找第i-1个结点,p->next是要删除的结点
        p=p->next;  
        ++j;
    }
    if( !p->next || j>i-1) 
    //当 i>n or i<1时 删除位置不合理
	    return ERROR;

    q=p->next;  
    p->next=q->next;
    delete  q;  // 释放删除结点的空间
    return OK;
}

建立带头结点的单链表

void CreateList_H(LinkList &L, int n)//前插法
{ 
    L= new LNode;
    L->next=NULL; // 先建立一个带头节点的空链表
    for(i=0; i<n; i++)
    {
         p=new LNode; // 生成新结点
         cin >> p->data;  // 给数据域赋值
         p->next=L->next;
  	     L->next=p; // 新结点插在头结点后
     }
} //时间复杂度O(n) 

void CreateList_R(LinkList &L, int n)//后插法
{ 
    L= new LNode;
    L->next=NULL; // 先建立一个带头节点的空链表
    r = L;
    for(i=0; i<n; i++)
    {
        p=new LNode; // 生成新结点
        cin >> p->data;  // 给数据域赋值
        p->next=NULL; 
	    r->next=p; // 新结点插在r结点后
	    r=p; // r=r->next;
     }
} //时间复杂度O(n) 

顺序(单)链表

循环链表:
        表尾条件:p->next==H
        有头结点的空表条件:H->next == H

对循环链表,有时不给出头指针,而给出尾指针可以更方便的找到第一个和最后一个结点。

(借用一下老师的ppt)

双向链表

typedef struct Node
{
    DataType data;
    struct Node *next;
    struct Node *prior;
}DLNode;

实现操作的代码省略(主要是p->prior->next之类的运用,虽然我习惯用(--p)->next)

顺序表和链表的比较

应用(算法思路)

放在社区学习活动(找不到就是我还没放)

参考资料:

1. 数据结构——使用C语言(第5版)

2. 数据结构——C++实现

3. 数据结构与算法 ppt(线性表)        张合生

数据结构与算法 - 线性表 数据结构与算法 - 线性表前言第1关:实现一个顺序存储的线性表第2关:实现一个链接存储的线性表总结 前言 线性表是最基本、最简单、也是最常用的一种数据结构。线性表结构中,数据元素之间通过一对一首尾相接的方式连接起来。具体实现时,线性表可以采用顺序存储,也可以采用链接存储。本实训项目的主要目标是学习和掌握基于 C 语言实现线性表,主要内容包括基于顺序存储和链接存储的方式来实现线性表。 提示:以下是本篇文章正文内容,下面案例可供参考 第1关:实现一个顺序存储的线性表 本关任务:实现 step1/Seqlist 阅读详情

相关推荐

数据结构中 线性表,栈,队列,算法之间的联系与区别

一。链表为什么需要         在程序中,经常需要将一种(通常是同为某个类型的)数据元素作为整体管理和使用,需要创建这种元素组,用变量记录他们,传进传出函数等。一组元素可能发生变化(像增加或删除元素。)        对于这种需求,最简单的解决方案便是将这样一组元素看成一个序列,用元素在序列里的位置和顺序,表示实际应用中的某种意义的信息,或者表示数据之间的某种关系。        这样的...

qq_35810838的博客 3657

《大话数据结构》读书笔记(三)

3.1 线性表的定义 线性表(list):零个或者多个数据元素的有限序列。 线性表是个序列,其次是强调有限的。 在计算机中处理的对象都是有限的,那种无限的数列,只存在于数学的概念中。 如果用数学语言来进行定义。 若将线性表记为(a1,a2,a3,...,a(i-1),ai,a(i+1),...,an),则表中 a(i-1)领先于 ai,ai领先于a(i+1),称 a(i-1)是 ai 的...

僵尸吃过跳跳跳 591

国标Gb28181里Contact和Route的使用

国标Gb28181是基于Sip协议的,因此对Contact和Route的使用,也可以说是Sip里Contact和Route的使用。Contact和Route则是sip协议里的头字段。 现在,在使用国标Gb28181来做项目时,经常会遇到这种情况,国标的下级是在内网里,上级在公网上。如果不做处理,下级到上级会经过nat协议的转换从而导致上级向下级发送请求时(比如获取目录请求)不能到达

wwyyxx26的专栏 5511

Java数据结构与算法2-线性表学习笔记

Java数据结构与算法2-线性表学习笔记

qq_45498432的博客 452

Cocos Creator3.5.2使用Spine切换皮肤

3、然后获取当前spine中是否有皮肤数据,如果spine连皮肤数据都没有,接着写可能会error,这里的 skins[skin],是判断皮肤列表中是否有需要更换的皮肤。2、因为spine往往意味着异步加载,换肤时也经常出现频繁异步的情况,所以下一步我们要可以判断当前spine组件里是否已经加载好了spine文件。换肤前隐藏好需要换肤的节点,避免穿帮;官网文档的换肤流程太简化,对于实际使用来说会有各种各样的问题。1、首先获取对应的spine组件。这里的skin自然是外部传入的需要换肤的皮肤名。

tc654321的博客 1817

音视频开发—H264相关概念和压缩原理详解(GOP、宏块、帧内压缩、帧间压缩)

本文讲述了H264相关概念和原理——GOP概念,SPS与PPS,帧内压缩原理,帧间压缩原理,解释了什么是运动补偿,什么运动矢量等等概念

weixin_46999174的博客 3978

数据结构与算法学习笔记-线性表(2)

2.2线性表的实现 2.2.1线性表的顺序存储 顺序存储:把线性表的结点按逻辑顺序依次存放在一组地址连续的存储单元里。 用这种方法存储的线性表简称顺序表 顺序存储的线性表的特点: 线性表的逻辑顺序与物理顺序一致; 数据元素之间的关系是以元素在计算机内“物理位置相邻”来体现。 设每个元素需占用/个存储单元,以所占的第一个单元的存储地址作为数据元素的存储位置。则线性表中第i+1个数据元素的存储...

Cris_0525的博客 891

一文看懂英伟达A100、H100、A800、H800、H20

想要Deepseek私有化部署吗?无论是训练大型AI模型,还是进行高性能计算(HPC),还是Deepseek私有化部署,都需要强大的GPU支持。而英伟达(NVIDIA)作为全球领先的AI芯片制造商,推出了一系列高性能GPU,包括等,广泛应用于AI训练、推理、科学计算等领域。如果想搭建一个属于自己的算力中心,该如何选择合适的GPU?本文将带你详细了解这些GPU的特性,并指导你如何搭建算力中心。一、英伟达算力GPU系列解析1. A100:数据中心AI计算的奠基石:Ampere:6912:432。

【可全包】本人程序员,不需要做任何吹嘘,只是实在写点程序,写点文档,熟悉各类主流框架,SSM,SpringBoot,Flask,Djiango,Mysql,Sqlite,VUE,Uniapp等,各类程序设计专家,优质作者 2万+

数据结构与算法C语言版学习笔记(2)-线性表、顺序存储结构的线性表

线性表是一种常见的数据结构,它是由一组有序的元素(节点)组成的数据序列。线性表中的元素之间存在一对一的关系,每个元素除了第一个元素外,都有唯一的前驱元素;每个元素除了最后一个元素外,都有唯一的后继元素。举一个例子:特点就是表里面的每个元素都具有相同的特征,要么都是字母,要么都是同一类的数据,而他们的关系就是一个接着一个连在一起。如果是几个稀疏多项式的加减,不可能让那些系数为0的2、3、4、5、6、7次项都存入线性表,不能去建立一个20000个元素的线性表,造成存储空间浪费,那么应该怎么做呢?

qq_53092944的博客 647

通讯接口应用笔记3:使用W5500实现Modbus TCP服务器

  前面我们设计实现了W5500的驱动程序,也讲解了驱动的使用方式。在最近一次的项目应用中,正好有一个使用W5500实现TCP通讯的需求,所以我们就使用该驱动程序轻松实现。这一篇中我们就来说一说基于我们W5500通讯驱动程序实现TCP通讯的过程。 1、应用需求   在本次应用中,要求实现一个基于W5500的Modbus TCP服务器。这个需求的描述虽然只有一句话,但是这个需求的内容可不简单。我们首先来分析一下这个需求的具体内容。   为了实现基于W5500的Modbus TCP服务器,我们必先须基于W550

木南创智 5499

基于RK3588与昇腾310B的异构K8s集群部署与NPU统一调度实战

本文介绍了基于RK3588与昇腾310B的异构K8s集群部署方案,通过HAMi+Volcano实现NPU统一调度。方案包含硬件配置、操作系统准备(银河麒麟/欧拉)、容器运行时部署及K8s集群搭建等关键步骤,支持多厂商NPU设备的统一抽象和精细化切分,为边缘AI计算提供高效资源管理能力。

huanghm88的专栏 280

数据结构与算法学习笔记——第二章:线性表-2-基于线性表操作的简单应用

基于线性表操作的简单应用

预见未来to50的专栏 296

【GameFramework框架内置模块】8、文件系统(File System)

最近好忙,鸽了好久。不能颓废了,继续发力。今天分享的是GF框架的文件系统。首先,引用比较官方的说法:GF的FileSystem虚拟文件系统,使用类似磁盘存储的感念对零散的文件进行集中管理,优化资源加载时产生的内存分配,也可以对资源进行局部片段加载,极大的提升了资源加载的性能。通俗点讲就是,我这个模块就是加载磁盘文件的,优化加载时产生的内存分配。那么,它是怎么优化的呢?

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 2452

青岛大学_王卓老师【数据结构与算法】Week04_09_线性表的应用2_学习笔记

(1) 依次从 La 或 Lb 中 “摘取” 元素值较小的结点插入到 Lc 表的最后,直至其中一个表变为空为止。现要求将 La 和 Lb 归并为一个新的线性表 Lc,且 Lc 中的数据元素扔按值非递减有序排列。(2) 继续将 La 或 Lb 其中一个表的剩余结点插入在 Lc 表的最后。已知线性表 La 和 Lb 中的数据元素按值非递减有序排列,(1) 创建一个空表 Lc。

DMLearner的博客 706

37、深入解析SCTP与RTP传输协议

本文深入解析了SCTP与RTP两种重要传输协议。SCTP提供可靠的多流数据传输,支持关联管理、选择性确认和错误处理,适用于高可靠性场景;RTP则专注于实时音视频数据的低延迟传输,配合RTCP实现质量监控。文章详细介绍了两种协议的数据结构、工作流程及应用场景,并对比其特性,帮助开发者根据可靠性、实时性和多流需求选择合适的协议。

time3的博客 83

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

《数据结构与算法基础 by王卓老师》学习笔记——2.3线性表的类型定义

线性表的类型定义

m0_55841508的博客 352

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

《数据结构与算法基础 by王卓老师》学习笔记——2.1线性表的定义和特点

线性表的定义和特点

m0_55841508的博客 436

pscad IEEE标准系统搭建说明

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

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

《数据结构与算法基础 by王卓老师》学习笔记——2.4线性表的顺序表示和实现2

1.线性表顺序存储结构的图示 2.顺序存储表示 3.举例

m0_55841508的博客 237

《数据结构与算法基础 by王卓老师》学习笔记——2.4线性表的顺序表示和实现3

线性表的顺序表示和实现3

m0_55841508的博客 428

《数据结构与算法基础 by王卓老师》学习笔记——2.4线性表的顺序表示和实现1

线性表的顺序存储表示、顺序存储结构和存储位置的计算

m0_55841508的博客 289

第一章例题2-有序线性表

给定一个有n个元素的有序线性表。若采用顺序存储结构,则在等概率前提下,删除其中的一个元素平均需要移动()个元素。

AngelCryToo的专栏 651

数据结构与算法——线性表(顺序表篇)

线性表且最简单的一种数据结构, 一个线性表是n个数据元素的有限序列 。本篇文章主要详细解读了线性表的基本概念,以及线性表中顺序表的重点知识。详细分析了顺序表的基本操作,图文结合,易于理解。............

小田是个程序员的博客欢迎你的到来呀~ 8318

数据结构与算法这么难,为什么我们还要学习?

提到数据结构与算法,就一定会伴随着诸多所谓的坚持和抱怨。同时,还有两个词总是出现,一个是内功,是对知识的定位,一个是吃透,是对自己的期待。可是,我们是不是被这两个词束缚太久了,以至于出现了很多的问题

Edison's 小宇宙 4万+

【数据结构算法】④、线性表算法练习篇、数据结构与线性表练习题-单选题+简答题、线性表算法练习题

【数据结构算法】④、线性表算法练习篇、数据结构与线性表练习题-单选题+简答题、线性表算法练习题

慢慢来就很快。 3606

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

这里是从PTA平台整理的【线性表】题目集

葑鈊丶 9489

数据结构于算法—线性表

通过前面[数据结构与算法前导](https://blog.youkuaiyun.com/qq_40693171/article/details/96913019)我么知道了数据结构的一些概念和重要性,那么我们今天总结下线性表相关的内容。当然,我用`自己的理解解`分享给大家。 - 其实说实话,可能很多人依然分不清`线性表,顺序表,和链表`之间的区别和联系! - 线性表:`逻辑结构`, 就是对外暴露数据之间的关系,不关心底层如何实现。 - 顺序表、链表:`物理结构`,他是实现一个结构实际物理地址上的结构。比如顺序表

bigsai 4855
上一篇: 数据结构与算法学习(1)——绪论
下一篇: 数据结构与算法学习(3)——栈和队列
zedkyx
博客等级 码龄7年 84粉丝 27原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zedkyx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值