数据结构之线性表3

news2025/1/28 1:06:03

我们的目标:

1、了解线性结构的特点 掌握顺序表的定义、查找、插入和删除。

2、掌握链表的定义、创建、查找、插入和删除。

3、能够从时间和空间复杂度的角度比较两种存储结构的不同特点及其适用场合。(持续更新)


前言

本章节内容主要介绍线性表的链式表示和实现,即链表的使用。


继续上一篇内容:http://t.csdn.cn/KwKsg

三、链表

我们都知道,线性表的链式存储结构的特点是在逻辑上相邻的数据元素在物理上不一定相邻。

上一篇我们讲到了单链表,所以接下来来介绍循环链表。

1.1  循环链表

循环链表是另一种形式的链式存储结构。和单链表不同的是,它最后不是NULL,而是L(通俗来讲因为循环没有尽头)。

类似地,还有非空单循环链表和空表。如图所示:

12d9dda3e7774160925bf0a44342b813.png

5399b0cbb5a14278ac3f7f01f24c8c96.png

这说明了从循环链表中的任何一个结点的位置都可以找到其他所有结点,而单链表做不到; 

并且循环链表中没有明显的尾端——>如何避免死循环?

我们知道循环条件是

//单链表
p!=NULL
p->next!=NULL
//循环链表
p!=L
p->next!=L

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

e73e3ca9981b479b86e0bca28c104560.png

那么如何查找开始结点和终端结点?

答:开始结点:rear->next->next                  

        终端结点:rear 


1.1.2  循环链表的合并——单循环链表

下面是一个单循环链表:

978ebe97d5b241d296354a0d4af49c83.png

 代码实现:

LinkList  Connect(LinkList  Ta,LinkList  Tb)
{//假设Ta、Tb都是非空的单循环链表
          p=Ta->next;                                   //①p存表头结点
          Ta->next =Tb->next->next;                     //②Tb表头连结Ta表尾
          deleteTb->next;                               //③释放Tb表头结点
          Tb->next=p;                                   //④修改指针
          return  Tb;
}

总结:上述操作的时间复杂度为O(1)。


1.2 双向链表

如图所示:

62b2986e2ab04c97931124076d6eb7ad.png

28597552022b4c7c98e1d50a6ea4b268.png

 代码实现:

//---双向链表的存储结构---
typedef struct DuLNode{
    ElemType   data;              //数据域
    struct DuLNode  *prior;       //指向直接前驱
    struct DuLNode  *next;        //指向直接后继
}DuLNode, *DuLinkList;

双向链表分为两种,如图所示,图b中有两个环,而图a中只有一个表头结点的空表。

3b3586eec8b4427b81a16fe5818f4ca4.png

5ddbabdb197942c6b886920ac36bd13e.png

在双向链表中,若d为指向表中某一节点的指针:

 d->next->prior = d->prior->next = d


1.2.1 双向链表的插入

8e4e37d79a4e4b0eafe56068865029e6.png

代码实现: 

Status ListInsert_DuL(DuLinkList &L,int i,ElemType e){
   if(!(p=GetElemP_DuL(L,i))) return ERROR;
    s=new DuLNode; 
   s->data=e;
   s->prior=p->prior;  
   p->prior->next=s;
   s->next=p;  
   p->prior=s;
   return OK;
}

1.2.2 双向链表的删除

d41bc25472ac4ab8a3ade4f09d0bfb49.png

1. p->prior->next=p->next;                2. p->next->prior=p->prior; 

代码实现:

Status ListDelete_DuL(DuLinkList &L,int i,ElemType &e)
{
   if(!(p=GetElemP_DuL(L,i)))     return ERROR;
   e=p->data;
   p->prior->next=p->next;
   p->next->prior=p->prior;
   delete p; 
   return OK;
}

四、顺序表和链表的比较

在实际应用中,我们不能说哪种的存储结构更好,由于它们各有优缺点,选用哪种存储结构,则应根据具体问题具体分析,通常从空间性能和时间性能两个方面作比较分析。

f527cd13f43e447abd87be4a333ae1d6.png

五、线性表的应用

5.1 线性表的合并 

求解一般集合的并集问题:

问题:假设利用两个线性表La和Lb分别表示两个集合A和B,现要求一个新的集合:                                  A=A    B。例如, La=(7, 5, 3, 11)      Lb=(2, 6, 3)      设合并后La=(7, 5, 3, 11, 2, 6)

步骤:

依次取出Lb 中的每个元素,执行以下操作:

1.在La中查找该元素;

2.如果找不到,则将其插入La的最后。

代码实现:

void union(List &La, List Lb){
  La_len=ListLength(La);
  Lb_len=ListLength(Lb); 
  for(i=1;i<=Lb_len;i++){
      GetElem(Lb,i,e);
      if(!LocateElem(La,e)) 
           ListInsert(&La,++La_len,e);                     
  }
}

时间复杂度为:

7d496a02a53c456cb3c0e01d4fd66761.png

5.2 有序表的合并

有序表:线性表中的数据元素相互之间可以比较,且数据元素在线性表中依值非递减或非递增有序排列。

求解有序集合的并集问题:

问题:已知线性表La 和Lb中的数据元素按值非递减有序排列,现要求将La和Lb归并为一个新的线性表Lc,且Lc中的数据元素仍按值非递减有序排列。例如,

La=(1 ,7, 8) Lb=(2, 4, 6, 8, 10, 11)   则Lc=(1, 2, 4, 6, 7 , 8, 8, 10, 11)

步骤:

1. 创建一个空表Lc;

2. 依次从 La 或 Lb 中“摘取”元素值较小的结点插入到 Lc 表的最后,直至其中一个表变空为止;

3. 继续将 La 或 Lb 其中一个表的剩余结点插入在 Lc 表的最后。

代码实现:

void MergeList_Sq(SqList LA,SqList LB,SqList &LC){ 
     pa=LA.elem;  pb=LB.elem;     //指针pa和pb的初值分别指向两个表的第一个元素 
     LC.length=LA.length+LB.length;      	//新表长度为待合并两表的长度之和 
     LC.elem=new ElemType[LC.length];    	//为合并后的新表分配一个数组空间 
     pc=LC.elem;                         		//指针pc指向新表的第一个元素 
     pa_last=LA.elem+LA.length-1; 	//指针pa_last指向LA表的最后一个元素 
     pb_last=LB.elem+LB.length-1; 	//指针pb_last指向LB表的最后一个元素 
     while(pa<=pa_last && pb<=pb_last){  	//两个表都非空 
      if(*pa<=*pb) *pc++=*pa++;        	//依次“摘取”两表中值较小的结点      
      else *pc++=*pb++;      } pa++;             //LB表已到达表尾
     while(pb<=pb_last)  *pc+
     while(pa<=pa_last)  *pc++=*+=*pb++;          //LA表已到达表尾 
}//MergeList_Sq 

时间复杂度/空间复杂度为:

4c0cc2a499fa4124b9495c077f864043.png

有序表合并的优点:不需要开辟新的存储空间,可以使空间复杂度达到最低。


总结

以上就是本节所讲的内容,主要讲解链表的应用以及与顺序表的比较。希望各位大佬多多指点,我会在数据结构上一直持续更新下去!感谢佬们点支持!

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

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

相关文章

linux服务器怎么搭建网站

linux服务器怎么搭建网站 我是艾西&#xff0c;今天又是和想学习linux系统的小伙伴分享服务器系统操作小知识的时间。 这篇文章艾西会告诉大家怎么用linux系统搭建网站&#xff0c;网站是一个展示页面&#xff0c;用于商业的公告栏、门面以及用户容易记住的点&#xff0c;通过…

SpringSecurity中用户表单登录验证源码分析

SpringSecurity简单介绍 Spring Security所解决的问题就是安全访问控制&#xff0c;安全访问控制功能其实就是对所有进入系统的请求进行拦截&#xff0c;校验每个请求是否能够访问它所期望的资源。通过学习SpringMVC我们得知只有进入Controller的请求才会走拦截器(Interceptor)…

LOL自动走A和释放技能原理及安全防护

走A和自动释放技能并不什么变态功能&#xff0c;他的一切操作都是符合常理的&#xff0c; 但是在经过合理的逻辑代码编写后&#xff0c; 利用读取内存数据&#xff0c;快速执行和判断&#xff0c; 实现的功能却是超出大部分玩家的。 也就是说用这个功能&#xff0c;可以弥补…

Spring Security实战(二)—— 实现图形验证码

目录 一. 使用过滤器实现图形验证码 1. 自定义过滤器 2. 图形验证码过滤器 &#xff08;1&#xff09;引入kaptcha依赖 &#xff08;2&#xff09;配置一个 kaptcha 实例 &#xff08;3&#xff09;创建一个CaptchaController&#xff0c;用于获取图形验证码 &#xff08…

[论文速览] Sparks of Artificial General Intelligence: Early experiments with GPT-4

Sparks of Artificial General Intelligence: Early experiments with GPT-4 2023.3.22 微软官方发布了目前人类史上最强AI模型 GPT-4 的综合能力评估论文&#xff0c;总所周知&#xff0c;2023年是通用人工智能&#xff08;Artificial General Intelligence&#xff0c;AGI&a…

18从零开始学Java之switch分支语句中该怎么用?

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在上一篇文章中&#xff0c;壹哥给大家介绍了Java里的顺序、分支、循环结构的概念&#xff0c;并且重点给大家讲解了分支结…

WebSocket和Socket编程

面试一般会问 socket原理 socket为啥要有端口&#xff1a;确定一个链路的是一个四元组 Socket编程 socket通信 你做过socket编程吗&#xff0c;socket是怎么实现知道有连接过来的 说说WebSocket与socket的区别 先谈谈Websocket与Socket的区别 首先Socket 不属于协议范畴 &a…

处理用户输入

shell脚本编程系列 传递参数 向shell脚本传递数据的最简单方法是使用命令行参数 比如 ./add 10 30读取参数 bash shell会将所有的命令行参数都指派给位置参数的特殊变量。其中$0对应脚本名、$1是第一个参数、$2是第二个参数&#xff0c;依次类推&#xff0c;直到$9 #!/bin/b…

Unity3D打包WebGL并使用MQTT(二):使用json

Unity3D打包WebGL并使用MQTT(二):使用json 1. 软件环境 Unity: 2021.3stomp.js 2.3.3: 下载地址:https://www.jsdelivr.com/package/npm/stompjs 2. 内容介绍 这篇博客的主要内容是记录将一个Unity项目打包成WebGL项目&#xff0c;并集成MQTT进行json数据传输的过程。 3. …

〖Python网络爬虫实战⑬〗- XPATH实战案例

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;目前专栏免费订阅&#xff0c;在转为付费专栏前订阅本专栏的&#xff0c;可以免费订阅付费…

一篇文章理解堆栈溢出

一篇文章理解堆栈溢出引言栈溢出ret2text答案ret2shellcode答案ret2syscall答案栈迁移答案堆溢出 unlink - UAF堆结构小提示向前合并/向后合并堆溢出题答案引言 让新手快速理解堆栈溢出&#xff0c;尽可能写的简单一些。 栈溢出 代码执行到进入函数之前都会记录返回地址到SP…

wsl区分和切换,安装NVIDIA驱动+cuda+ffmpeg

wsl区分和切换&#xff0c;安装NVIDIA驱动cudaffmpeg 安装Nvidia驱动 打开terminal wsl --update进入wsl nvidia-smi网上找了一些博客&#xff0c;获取信息&#xff1a; window安装好驱动即可wsl有1和2 我的win10已经安装了驱动 wsl1和wsl怎么区分&#xff1f;切换 区分…

实时聊天提示的最佳做法

本文将教您更多关于有效的实时聊天功能对您的品牌的重要性&#xff0c;以及您可以使用的一些最佳实践来确保您的实时聊天功能尽可能好。实时聊天提示是为您的网站访问者显示的自动聊天消息。在SaleSmartly&#xff08;ss客服&#xff09;中&#xff0c;如您将聊天插件安装到您的…

Win10 安装 MongoDB 5.0.16

一、MongoDB 的官方&#xff1a;http://www.mongodb.com/ 下载&#xff1a;​ ​https://www.mongodb.com/download-center/community​ 二、下载msi文件&#xff0c;双击该文件进行安装。 &#xff08;1&#xff09;打开对话框 ,单击“Next” &#xff08;2&#xff09;请勾…

总结815

4月&#xff08;复习完高数18讲内容&#xff0c;背诵21篇短文&#xff0c;熟词僻义300词基础词&#xff09; 4.8 英语&#xff1a;早上继续背昨天没背完的第15篇文章单词&#xff0c;感觉效率极高&#xff0c;可能是昨晚睡眠质量特别好。下午抄写第16篇文章每日一句长难句看《…

Meetup 直播预告|助力企业数字化转型,8 大微服务容器开源实践亮点抢先看

随着数字化、智能化发展趋势不断加快&#xff0c;大中小型企业纷纷将企业“上云”提上日程&#xff0c;推动企业数字化转型。云时代下&#xff0c;企业需要新技术架构&#xff0c;使之更好地利用云计算优势&#xff0c;让业务更敏捷、成本更低、可伸缩性更强&#xff0c;云原生…

进程概念详解

目录 进程是什么&#xff1f; 描述进程&#xff1a;进程控制块-PCB task_struct task_struct 是什么&#xff1f; task_struct内容分类 组织进程 查看进程 fork创建子进程 进程状态 僵尸进程 孤儿进程 进程优先级 其他概念 进程是什么&#xff1f; 一般书上…

【微信小程序】父子组件之间传值

微信小程序父子组件之间传值有两种&#xff1a; 1.父组件向子组件传值 2.子组件向父组件传值 区别&#xff1a; 父向子传值使用的是属性绑定&#xff0c;子组件中的properties对象进行接收父组件传递过来的值。子向父传值使用的是自定义事件&#xff0c;父组件通过自定义事件…

VUE 学习笔记(一)开发环境搭建

1、Visual Studio Code安装及使用 下载地址官网&#xff1a;https://code.visualstudio.com/ 直接点击下载按钮即可&#xff0c;会根据系统自动下载合适的版本&#xff0c;无需自行选择。 2、VSCode 上安装&#xff1a;JavaScript Debugger 目前 Debugger for Chrome 已经处…

基于html+css的盒子内容旋转

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…