【数据结构】线性表的知识点全面总结

目录

1.线性表的顺序表示

    1.1顺序表的基本概念 

    1.2顺序表的基本操作 

         1.2.1插入

         1.2.2删除

         1.2.3查找 

2.线性表的链式表示

    2.1单链表

         单链表的基本概念

         2.1.1基本操作

               2.1.1.1单链表的建立

               2.1.1.2插入

               2.1.1.3删除

               2.1.1.4查找 

    2.2双链表

         2.2.1基本操作

               2.2.1.1插入

               2.2.1.2删除

               2.2.1.3遍历

    2.3循环链表

         2.3.1循环单链表

         2.3.2循环双链表 

               2.3.2.1循环双链表的插入

               2.3.2.2循环双链表的删除 

3.静态链表

4.顺序表和链表的比较 


1.线性表的顺序表示

1.1顺序表的基本概念 

存储结构:逻辑上相邻的数据元素物理上也相邻。

实现方式分为:静态分配和动态分配

静态分配:使用静态数组实现,大小一旦确定无法改变。

动态分配:使用动态数组实现,顺序表存满时可以用malloc动态扩展顺序表的最大容量,需要将数据元素复制到新的存储区域,并用free函数释放原区域。

1.2顺序表的基本操作 

1.2.1插入

最好时间复杂度:O(1)

最坏时间复杂度:O(n)

平均时间复杂度:O(n)

//插入
bool ListInsert(SqList &L,int i,int e)
{if (i < 1 || i > L.length + 1)         //判断i是否合法return false;if (L.length >= MaxSize)             //判断是否存满return false;for (int j = L.length;j >= i;j--)//插入结点的位置之后的元素依次后移L.data[j] = L.data[j - 1];L.data[i - 1] = e;                     //插入eL.length++;               //顺序表长度加一return true;
}

1.2.2删除

最好时间复杂度:O(1)

最坏时间复杂度:O(n)

平均时间复杂度:O(n)

//删除
bool ListDelete(SqList& L, int i, int e)
{if (i < 1 || i > L.length + 1)//判断i是否合法return false;e = L.data[i - 1];        //将删除结点位置的元素值赋给efor (int j = i;j < L.length;j++)//删除结点后面的元素依次前移L.data[j - i] = L.data[j];L.length--;              //顺序表长度减一return true;
}

1.2.3查找 

查找方式有按位查找和按值查找。

按位查找

//按位查找
int GetElem(SqList L, int i)
{return L.data[i - 1];
}

按值查找

最好时间复杂度:O(1)

最坏时间复杂度:O(n)

平均时间复杂度:O(n)

//按值查找
int LocateElem(SqList L.int e)
{for (int i = 0;i<L>length;i++)if (L.data[i] == e)return i + 1;return 0;
}

注意:C语言中,结构体的比较不能直接用“==” 

2.线性表的链式表示

2.1单链表

单链表的基本概念 

定义:线性表的链式存储。

两种实现方式:带头结点和不带头结点

带头结点的空表判断:L->next==NULL

不带头结点的空表判断:L==NULL

头结点和头指针的区分:不管带不带头结点,头指针都始终指向链表的第一个结点,而头结点时带头结点的链表中的第一个结点,结点内通常不存储信息。

2.1.1基本操作

2.1.1.1单链表的建立

头插法

应用:链表的逆置(带头结点的单链表的就地逆置:http://t.csdn.cn/J6bph) 

// 头插法建立单链表
LinkList List_HeadInsert(LinkList &L)
{LNode* s;int x;L = (LinkList)malloc(sizeof(LNode));//创建头结点L->next = NULL;               //初始为空链表scanf("%d", &x);             //输入结点的值while (x != 9999)          //循环结束条件,可以自己设置为其他值{s = (LNode*)malloc(sizeof(LNode));  //创建新的结点s->data = x;s->next = L->next;        L->next = s;          //将新结点插入表中,L为头指针scanf("%d", &x);}return L;
}

尾插法
//尾插法
LinkList List_TailInsert(LinkList& L)
{int x;L = (LinkList)malloc(sizeof(LNode));//创建头结点LNode* s, * r = L;      //r为表尾指针scanf("%d", &x);while (x != 9999){s = (LNode*)malloc(sizeof(LNode));  //创建新的结点s->data = x;r->next = s;                 r = s;                      //r指向新的表尾结点scanf("%d", &x);}r->next = NULL;return L;
}

2.1.1.2插入

后插 
//插入(后插)
s->next = p->next;
p->next = s;
前插
//插入(前插)
s->next = p->next;
p->next = s;
temp = p->data;    //交换数据域(偷天换日)
p->data = s->data;
s->data = temp;

2.1.1.3删除

按位序删除
p = GetElem(L, i - 1);  //查找删除位置的前驱节点
q = p->next;            //令q指向被删除结点
p->next = q->next;      //将*q结点从链中断开
free(q);                //释放结点的存储空间

指定结点删除

如果指定结点是最后一个结点时,需要特殊处理

q = p->next;            //令q指向*p的后继结点
p->data = p->next->data; //用后继结点的数据域覆盖
p->next = q->next;       //将*q结点从链中断开
free(q);                 //释放结点的存储空间

2.1.1.4查找 

 按位查找,按值查找,求单链表的长度

2.2双链表

2.2.1基本操作

2.2.1.1插入

1.s->next = p->next;
2.if(p->next!=NULL)p->next->prior = s;
3.s->next = p;
4.p->next = s;

上述代码的语句顺序不是唯一,但是1和2必须在4之前,否则会出现断链。 

2.2.1.2删除

//删除双链表结点*p的后继结点*q
bool DeleteNextNode(DNode* p)
{if (p == NULL)return false;DNode* q = p->next;//找到p的后继结点qif (q == NULL)      //p没有后继return false;p->next = q->next;if(q->next!=NULL)   //q不是最后一个结点q->next->prior = p;free(q);return true;
}

2.2.1.3遍历

后向遍历
//后向遍历
while (p != NULL)
{p = p->next;
}
前向遍历 
//前向遍历
while (p != NULL)
{p = p->prior;
}
//前向遍历(跳过头结点)
while (p->prior != NULL)
{p = p->prior;
}

2.3循环链表

2.3.1循环单链表

表尾结点的next指针指向头结点 

2.3.2循环双链表 

 表尾结点的next指针指向头结点 ;

 表头结点的prior指针指向表尾结点

2.3.2.1循环双链表的插入
//循环双链表的插入
/ bool InsertNextDNode(DNode * p, DNode * s)
{s->next = p->next;p->next->prior = s;s->prior = p;p->next = s;
}
2.3.2.2循环双链表的删除 
//循环双链表的删除 
p->next = q->next;
q->next->prior = p;
free(q);

3.静态链表

分配一整片的连续空间,容量固定不变,结束标志:next == -1

优点:增,删操作不需要大量移动元素。

缺点:不能随机存取,只能从头结点开始依次往后查找。 

4.顺序表和链表的比较 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机专业毕业设计项目推荐03-Wiki系统设计与实现(JavaSpring+Vue+Mysql)

Wiki系统设计与实现&#xff08;JavaSpringVueMysql&#xff09; **介绍****系统总体开发情况-功能模块****各部分模块实现** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设…

使用PHPStudy在本地快速建立网站并实现局域网外访问(无公网IP)

文章目录 使用工具1. 本地搭建web网站1.1 下载phpstudy后解压并安装1.2 打开默认站点&#xff0c;测试1.3 下载静态演示站点1.4 打开站点根目录1.5 复制演示站点到站网根目录1.6 在浏览器中&#xff0c;查看演示效果。 2. 将本地web网站发布到公网2.1 安装cpolar内网穿透2.2 映…

datagrip 相关数据连接信息无缝迁移

背景 因为公司换电脑了&#xff0c;接触的项目比较多&#xff0c;不同项目&#xff0c;不同环境的数据库连接有好几十个&#xff0c;如果在新电脑上挨个重新连接一遍劳心劳力&#xff0c;所以想看一下能不能直接将之前保存的连接信息直接迁移到新的电脑上面。 为此&#xff0c…

探索GreatADM:如何快速定义监控

引文 在数据库运维过程中&#xff0c;所使用的运维管理平台是否存在这样的问题&#xff1a; 1、默认监控粒度不够,业务需要更细颗粒度的监控数据。2、平台默认的监控命令不适合,需要调整阈值量身定制监控策略。3、不同类型的实例或组件需要有不同的监控重点,但管理平台监控固…

界面组件DevExpress WinForms v23.1 - 增强的图表、甘特图功能

DevExpress WinForms拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜…

《Python入门到精通》time模块详解,Python time标准库,time库函数大全

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:小白零基础《Python入门到精通》 time模块详解 1、获取操作time.time() 获取时间戳(float)time.time_ns() 获取时间戳(int)time.thread_time()…

VIT中的einops包详解

‘’‘einops有三个常用方法&#xff1a;rearrange,repeat,reduce’‘’ rearrange的操作相当于转置 rearrange(image,‘h w c -> w h c’) 高和宽转置 path ../data/cat_and_mouse.jpg image cv2.imread(path) h,w,c image.shape # shape第一个值是h,第二个是w image…

电子电路学习笔记之NCV84120DR2G——车规级单通道高压侧驱动器

关于车规级芯片&#xff1a; 关于车规级芯片&#xff08;Automotive Grade Chip&#xff09;&#xff0c;车规级芯片是专门用于汽车行业的芯片&#xff0c;具有高可靠性、高稳定性和低功耗等特点&#xff0c;以满足汽车电子系统的严格要求。这些芯片通常用于车载电子控制单元&…

【java】【SSM框架系列】【一】Spring

目录 一、简介 1.1 为什么学 1.2 学什么 1.3 怎么学 1.4 初识Spring 1.5 Spring发展史 1.6 Spring Framework系统架构图 1.7 Spring Framework学习线路 二、核心概念&#xff08;IoC/DI&#xff0c;IoC容器&#xff0c;Bean&#xff09; 2.1 概念 2.2 IoC入门案例 …

十五、Webpack打包图片-js-Vue、Label命令、resolve模块解析

一、webpack打包图片 &#xff08;1&#xff09;加载图片案例准备 为了演示我们项目中可以加载图片&#xff0c;我们需要在项目中使用图片&#xff0c;比较常见的使用图片的方式是两种&#xff1a; img元素&#xff0c;设置src属性&#xff1b;其他元素&#xff08;比如div&…

IP175D参考资料和引脚图

特性 宽工作温度范围IP175DLF(0C至70C) IP175DLFI (-40C至85C)内置6个MAC和5个PHY 每个端口可配置为10base-t、100Base-TX 最多2K个MAC地址 支持自极性10Mbps 广播风暴防护 汽车MDI-MDIX 支持3个MIL/RMII接口Layer2-4多字段分类器支持8-MultiField输入支持交通政策支持…

React 全栈体系(四)

第二章 React面向组件编程 六、组件的生命周期 1. 效果 需求:定义组件实现以下功能&#xff1a; 让指定的文本做显示 / 隐藏的渐变动画从完全可见&#xff0c;到彻底消失&#xff0c;耗时2S点击“不活了”按钮从界面中卸载组件 <!DOCTYPE html> <html lang"e…

特殊矩阵的压缩存储(对称矩阵,三角矩阵和三对角矩阵)

目录 1.对阵矩阵 2.三角矩阵 3.三对角矩阵&#xff08;带状矩阵&#xff09; 均假设数组的下标从0开始 1.对阵矩阵 定义&#xff1a;若对一个n阶矩阵A中的任意一个元素 aᵢ,ⱼ 都有aᵢ,ⱼaⱼ,ᵢ &#xff08;1≤i,j≤n&#xff09;&#xff0c;则称其为对称矩阵。 存储策略…

⛳ MVCC 原理详解

&#x1f38d;目录 ⛳ MVCC 原理详解&#x1f43e; 一、事务回顾&#x1f4d0; 1.1、什么是数据库事务&#xff0c;为什么要有事务&#x1f389; 1.2、事务包括哪几个特性&#xff1f;&#x1f38d; 1.3、事务并发存在的问题1.3.1、脏读1.3.2、不可重复读1.3.3、幻读 &#x1f…

Android Jetpack 中Hilt的使用

Hilt 是 Android 的依赖项注入库&#xff0c;可减少在项目中执行手动依赖项注入的样板代码。执行 手动依赖项注入 要求您手动构造每个类及其依赖项&#xff0c;并借助容器重复使用和管理依赖项。 Hilt 通过为项目中的每个 Android 类提供容器并自动管理其生命周期&#xff0c;…

依赖项的处理与层的创建与注册

依赖项的处理与层的创建与注册 依赖项的处理与层的创建与注册 新问题什么是 layer?layer 的创建与注册 与函数同时创建和绑定单独上传 layer 再绑定函数(推荐) 真正的运行时依赖 注册包的约定与平台强关联的运行时 1. 云端安装依赖2. 本地构建 Amazon Linux 2 容器环境3. 利用…

数字图像滤波的本质

一、说明 在数字时代&#xff0c;图像是我们交流和表达不可或缺的一部分。从社交媒体到医学成像&#xff0c;图像的质量和内容非常重要。这就是图像过滤和卷积领域介入的地方&#xff0c;为我们提供了一个转换和完善这些视觉叙事的工具包。 图像过滤不仅仅是让照片看起来更好;这…

Fiddler 系列教程(二) Composer创建和发送HTTP Request跟手机抓包

Fiddler Composer介绍 Composer的官方帮助文档&#xff1a;http://www.fiddler2.com/fiddler/help/composer.asp Fiddler的作者把HTTP Request发射器取名叫Composer(中文意思是&#xff1a;乐曲的创造者), 很有诗意 Fiddler Composer的功能就是用来创建HTTP Request 然后发送…

Chrome 基于 Wappalyzer 查看网站所用的前端技术栈

1. 找到谷歌商店 https://chrome.google.com/webstore/search/wappalyzer?utm_sourceext_app_menu 2. 搜索 Wappalyzer 3. 添加至Chrome 4. 使用 插件 比如打开 https://www.bilibili.com/ 就可以看到其所以用的前端技术栈了

【系统设计系列】 负载均衡和反向代理

系统设计系列初衷 System Design Primer&#xff1a; 英文文档 GitHub - donnemartin/system-design-primer: Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. 中文版&#xff1a; https://github.com/donnemart…