C语言数据结构——第二章 线性表
二、线性表
2.1-线性表简介
2.1.1-线性表的定义
线性表是由若干个相同特性的数据元素组成的有限序列。若该线性表不包含任何元素,则称为空表,此时长度为0,当线性表不为空时,表中的元素的个数就是线性表的长度。
2.1.2-形式
{a[1],a[2],a[3]······,a[i]······,a[n]}
其中a[i]表示线性表中的任意一个元素,n表示元素的个数。表中a[1]为第一个元素,以此类推,a[n]就是最后一个元素,因为a[1]领先于a[2],所以我们称a[1]是a[2]的直接先驱元素,a[2]是a[1]的直接后继元素。在此表中我们称a[1]是表头,a[n]是表尾,在线性表中有且仅有一个表头和一个表尾元素,表头元素没有直接先驱元素,表尾没有直接后继元素。
- 线性表中每个结点至多只有一个前驱结点且至多只有一个后继结点
- 线性表中的元素个数一定是有限的
- 线性表中所有元素具有相同的性质
- 线性表中除表头以外,其他所有元素都有唯一的先驱元素
- 线性表中除表尾以外,其他所有元素都有唯一的后继元素
- 起始结点没有前驱结点
- 终端结点没有后继结点
2.1.3-类型
线性表中的元素之间可以存在某种关系。如,数字1~20里所有的技术排列{1,3,5,7,9,11,13,15,17,19},此时表内的元素的值是按照递增顺序来排列的,通常我们称这种类型的线性表为有序线性表(简称有序表),即该表中元素是按照某种顺序进行排列的。从严格意义上来讲,仅当线性表中所有元素以递增或递减的顺序排列(允许表中存在相同的元素),我们才称其为有序表;否则,我们均称其为无序表,元素之间既无递增关系也无递减关系。例:{1,13,5,74,9,11,5,26,46,77,195}
2.1.4-线性表的操作
- 创建线性表
- 向线性表中增加元素
- 对线性表中的元素进行修改
- 查找线性表中的特定元素
- 删除线性表中的元素
- 按值查找元素,返回元素序号
- 线性表使用完毕后,可将其销毁以释放所占用的资源
2.2-顺序表
2.2.1-顺序表的概念
顺序表示采用顺序存储的方式来存储数据元素的线性表。在顺序表中,我们通常将结点一次存放在一组地址连续的存储空间中,由于待存储空间连续且每个元素的占用空间相同,因此可以通过计算得出每个元素的存储位置。
2.2.2-顺序表的操作
(1)创建顺序表函数的实现
- 创建一个顺序表
- 对该顺序表进行初始化
(2)查找元素值函数的实现
- 输入待查找的元素值
- 若需查找的元素值存在于顺序表中,则输出其值所在的位置
- 若需查找的元素不在顺序表中,则进行相应的提示
(3)指定位置插入元素函数的实现
- 输入待插入元素的目标位置
- 输入待插入的元素值
- 输出成功插入元素后的顺序表
(4)指定位置删除元素函数的实现
- 输入待删除元素的下标位置
- 删除制定元素
- 输出删除元素后的顺序表
(5)遍历顺序表元素函数的实现
- 得到顺序表的长度
- 逐一输出该顺序表中的元素值
2.3-链表
2.3.1-链表的基本概念
链表是指采用链式结构来存储数据元素的线性表,它与顺序表最大的区别在于两者的存储结构不同。顺序表需要由系统提前分配一组连续的存储空间,并采用顺序存储的方式来存储数据元素;而链表是在每个结点创建时主动向系统申请相应的存储空间,并通过指针来链接各个包含数据元素的结点。即链表中元素的逻辑顺序是由指针的链接次序决定的,与存储空间的物理位置无关,因此在使用时仅能被顺序存取;而顺序表中元素的逻辑顺序与其物理位置直接相关,因此可实现随机存取。
与顺序表相比,链表还有以下特点:
- 链表实现了存储空间的动态管理
- 链表在执行插入与删除操作时,不必移动其余元素,只需要修改指针即可。
2.3.2-链表的构成
链表是由一系列的结点通过指针链接而形成的,每个结点可分为数据域和指针域两个部分,数据域可用于存储数据元素,指针域则是用于存储下一结点的地址。
2.3.3-链表的类型
链表可以分为单向链表、双向链表以及循环链表。
(1)在单向链表中,每个结点只包含一个指针域,它用来指向其直接后继结点,通常我们将这种链表称为单链表。注意:单链表中最后一个结点的指针域默认为空,因为根据单链表的定义,它没有直接后继结点。
(2)在双向链表中,每个结点包含两个指针域,其中一个用于指向先驱结点,可称之为先驱指针;另一个指向后继结点,称之为后继指针,通常我们讲这种链表称为双链表。注意:对于双向链表而言,他最后一个结点指向后继结点的指针域为空。
(3)循环链表的特点之一就是从表中任意结点出发,均可找到表中其他的结点。循环链表的特点是表中最后一个结点的指针域不为空,而是指向表中的第一个结点。
2.3.4-链表的操作
- 创建线性表
- 向线性表中增加元素
- 对线性表中的元素进行修改
- 查找线性表中的特定元素
- 删除线性表中的元素
- 按值查找元素,返回元素序号
- 线性表使用完毕后,可将其销毁以释放所占用的资源
2.3.5-单链表
-1.单链表的操作
(1)初始化结点函数的实现
- 创建一个数据域,用于存储每个结点的值
- 创建一个指针域,用于存储下一个结点的地址
- 还可以根据实际需要创建其他域,用于存储结点的各种信息
(2)初始化头结点函数的实现
- 创建单链表的头结点
- 将其初始化为空
(3)创建单链表函数的实现
- 获取头结点
- 由用户输入每个结点的值,并依次创建这些结点
- 每创建一个结点,就将其链入单链表的尾部
- 若用户输入“#”号,转(5);否则(2)
- 完成单链表的创建。
(4)尾端插入元素函数的实现
- 输入待插入结点的值
- 创建数据域为该值的结点
- 在当前单链表的微端插入该节点
(5)首端插入元素函数的实现
- 输入待插入结点的值
- 创建数据域为该值的结点
- 在当前单链表的首端插入该节点
(6)查找指定元素并返回其位置函数的实现
- 输入待查找的元素值
- 若在单链表中存在包含目标元素的结点,则输出第一个被找到的结点的值及其所在位置
- 若在单链表中不存在包含目标元素的结点,则输出相应提示
(7)删除元素函数的实现
- 输入待删除结点的值
- 在单链表中,查找与该值相等的结点
- 若查找成功,则执行删除操作
- 若查找失败,则输出相应提示
(8)遍历单链表函数的实现
- 若头结点的指针域为空,则输出相应提示
- 若头结点的指针域不为空,则将当前单链表中的元素逐一输出
2.3.6-循环单链表
循环单链表是在单链表的基础上,将其自身的第一个结点的地址存入表中最后一个结点的指针域中。与单链表相比,两者的基本操作大致类似,所以仅介绍循环单链表的创建、插入和删除操作。
-1.循环单链表的操作
(1)创建循环单链表函数的实现
- 获取头结点
- 由用户输入每个结点值,并一次创建这些结点
- 没创建一个结点,将其链入循环单链表的尾部,并将头结点的地址存入其指针域中
- 若用户输入“#”号,则输入结束,完成循环单链表的创建
(2)尾端插入函数的实现
- 输入待插入结点的值
- 创建数据域为该值的结点
- 在当前循环单链表的尾端插入该结点
(3)首端插入元素函数的实现
- 输入待插入结点的值。
- 创建数据域为该值的结点
- 在当前循环单链表的首端插入该节点
(4)删除元素函数的实现
- 输入待删除结点的值
- 在单链表中查找是否存在某一结点的值与待删除结点的值相等
- 若查找成功,则执行删除操作
- 若查找失败,则输出相应提示
2.3.7-双链表
-1.双链表的操作
(1)初始化结点函数的实现
- 创建一个数据域,用于存储每个结点的值
- 创建一个后继指针域,用于存储下一个结点的地址
- 创建一个先驱指针域,用于存储前一个结点的地址
- 根据实际需要创建其他域,用于存储结点的各种信息
(2)初始化头结点函数的实现
- 创建单链表的头结点
- 将其初始化为空
(3)创建双链表函数的实现
- 获取头结点
- 由用户输入每个结点的值,并依次创建这些结点
- 没创建一个结点,将其链入双链表的尾部
- 若用户输入“#”号,转(5),否则转(2)
- 完成双链表的创建
(4)尾端插入函数的实现
- 输入待插入接待的值
- 创建数据域为该值的结点
- 在当前双链表的尾端插入该结点
(5)首端插入元素函数的实现
- 输入待插入结点的值
- 创建数据域为该值的结点
- 在当前双链表的首端插入该节点
(6)删除元素函数的实现
- 输入待删除结点的值
- 在双链表中,查找与该值相等的结点
- 若查找成功,则执行删除操作
- 若查找失败,则输出相应提示
(7)遍历双链表函数的实现
- 若双链表为空,则输出相应提示
- 若双链表不为空,将双链表中的元素从前到后按次序输入
2.3.8-循环双链表
通过将双链表中最后一个结点的后继指针指向双链表的头结点,并将其头结点的先驱指针指向表中最后一个结点,它与双链表的基本操作大致相同,同样只介绍循环双链表的创建、插入及删除操作
-1.循环双链表的基本操作
(1)创建循环双链表函数的实现
- 获取头结点
- 由用户输入每个结点值,并依次创建这些结点
- 没创建一个结点,就将其链入循环双链表的尾部,并将其后继指针指向头结点,最后在头结点的先驱指针域中存入该节点的地址
- 若用户输入“#”号,则结束输入,完成循环双链表的创建
(2)尾端插入函数的实现
- 输入待插入结点的值
- 创建数据域为该值的结点
- 在当前循环双链表的尾端插入该结点
(3)首端插入元素函数的实现
- 输入待插入结点的值
- 创建数据域为该值的结点
- 在当前循环双链表的首端插入该结点
(4)删除元素函数的实现
- 输入待删除的结点的值
- 在循环双链表中查找是否存在某一结点的值与待删除结点的值相等
- 若查找成功,则执行删除操作
- 若查找失败,则返回相应的提示
小结:
(1)线性表是在逻辑结构上具有线性关系的数据集,而在其后介绍的顺序表和链表等结构都是在线性表的基础上衍生而来的。
(2)顺序表是在线性表的基础上采用了顺序存储的结构,通常在顺序表中存储数据的空间是连续的,元素存储位置也是相邻的,这在一定程度上反映了其逻辑结构上的线性关系,因此表中任意一个元素都可被随机访问,而我们通常会使用数组来实现这一数据结构;而链表是在线性表的基础上采用了连式存储的结构,元素之间的逻辑关系也是通过指针来反映的,因此元素不能被随机访问。
(3)对于链表,介绍了4中不同形式,即单链表,循环单链表,双链表,循环双链表。
- 单链表
结点构成:
- 每个结点包含一个数据域和一个指针域
- 数据域用于存储数据
- 指针域用来指向其直接后继结点
查找特点:
- 只可通过后继指针域查找其后继结点
- 循环单链表
结点构成:
- 每个结点包含一个数据域和一个指针域
- 数据域用于存储数据
- 指针域用来指向其直接后继点
- 最后一个结点的指针指向表中第一个结点
查找特点:
- 只可通过后继指针域查找其后继结点
- 双链表
结点构成:
- 每个结点包含一个数据域和两个指针域
- 数据域用于存储数据
- 先驱指针域用于指向其直接先驱结点
- 后继指针域用于指向其直接后继结点
查找特点:
- 既可通过后继指针域查找其后继结点,又可以通过先驱指针域查找其先驱结点
- 循环双链表
结点构成:
- 每个结点包含一个数据域和两个指针域
- 数据域用于存储数据
- 先驱指针域用于存储其直接先驱结点
- 后继指针域用于存储其直接后继结点
- 最后一个结点的后继指针指向表中的第一个结点,第一个结点的先驱指针指向表中最后一个结点
查找特点:
- 既可通过后继指针域查找其后继结点,又可以通过先驱指针域查找其先驱结点
C语言数据结构——第二章 线性表的更多相关文章
- c语言数据结构学习心得——线性表
线性表:具有相同数据类型的n(n>0)个数据元素的有限序列. 主要有顺序存储和链式存储. 顺序存储: 特点:地址连续,随机/存取,顺序存储. 建立:首地址/存储空间大小(数组),表长. 方式:静 ...
- 基于c语言数据结构+严蔚敏——线性表章节源码,利用Codeblocks编译通过
白天没屌事,那我们就来玩玩线性表的实现吧,快要失业了,没饭吃了咋整哦 题目描述假设利用两个线性表LA和LB分别表示两个集合A和B(即:线性表中的数据元素即为集合中的成员),现要求一个新的集合A=A∪B ...
- 数据结构(c语言版,严蔚敏)第2章线性表
弟2章线性表
- [数据结构 - 第3章] 线性表之双向链表(C语言实现)
一.什么是双向链表? 双向链表(double linked list)是在单链表的每个结点中,再设置一个指向其前驱结点的指针域.所以在双向链表中的结点都有两个指针域,一个指向直接后继,另一个指向直接前 ...
- 数据结构(C语言版)-第2章 线性表
#define MAXSIZE 100 //最大长度 typedef struct { ElemType *elem; //指向数据元素的基地址 int length; //线性表的当前长度 }SqL ...
- 第2章 线性表《C#数据结构和算法》
( )除第一个位置的数据 元素外,其它数据元素位置的前面都只有一个数据元素:( )除最后一个位置的 数据元素外,其它数据元素位置的后面都只有一个元素.也就是说,数据元素是 一个接一个的排列.因此,可以 ...
- 最小正子序列(序列之和最小,同时满足和值要最小)(数据结构与算法分析——C语言描述第二章习题2.12第二问)
#include "stdio.h" #include "stdlib.h" #define random(x) (rand()%x) void creat_a ...
- 《数据结构与STL-第二章 线性表》读书笔记
线性表 定义 线性表(linear list)是由零个或多个相同类型的数据元素构成的有限序列. 存储结构 顺序存储 最简单的存储方法是顺序存储法,即把线性表的数据元素按照逻辑次序顺序地放在一组地址连续 ...
- [数据结构 - 第3章] 线性表之单链表(C++实现)
一.类定义 单链表类的定义如下: #ifndef SIGNALLIST_H #define SIGNALLIST_H typedef int ElemType; /* "ElemType类型 ...
随机推荐
- 4级搭建类401-Oracle 19c Non-CDB DG搭建(Linux 主备一对一 LGWR ASYNC)公开
项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列除特定项目目前不对外发布,仅作为博客记录,其他公开.如学员在 ...
- PDF体检报告
//Title: 个人健康管理分析报告 using System; using System.Collections.Generic; using System.Linq; using System. ...
- Prettier - Code formatter使用
更多VSCode插件使用请访问:VSCode常用插件汇总 Prettier - Code formatter这是一款 格式化js.css代码插件,暂不解释. Prettier是什么? Prettier ...
- Piggy-Bank HDU - 1114 完全背包
#include<iostream> #include<cstring> using namespace std; const int INF=0x3f3f3f3f; ]; s ...
- STL标准库面试题(转)
一.vector的底层(存储)机制 二.vector的自增长机制 三.list的底层(存储)机制 四.什么情况下用vector,什么情况下用list 五.list自带排序函数的排序原理 六.deque ...
- 在linux系统中配置NVMe over FC
在linux系统中配置NVMe over FC与配置NVMe over TCP类似,前5步操作请参考<在linux系统中配置NVMe over TCP>,网页连接如下: https://w ...
- Vuex项目实战store
首先简单了解一下什么是Vuex? Vuex是一个专为Vue.js应用程序开发的状态管理模式.采用集中式存储来管理应用所有组件的状态. 以下是对vuex的使用的简单介绍: 一.安装 npm i vuex ...
- SQL四种语言:DDL,DML,DCL,TCL 的区别
1.DDL(Data Definition Language)数据库定义语言statements are used to define the database structure or schema ...
- (转)正则表达式:string.replaceAll()中的特殊字符($ \)与matcher.appendReplacement
string.replaceAll中的特殊字符 string.replaceAll(String regex, String replacement)中的replacement参数即替换内容中含有特殊 ...
- java锁(转)
Java中锁分类 锁的分类 公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲观锁 分段锁 偏向锁/轻量级锁/重量级锁 自旋锁(java.util.concurrent包下的几乎都 ...