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类型 ...
随机推荐
- linux centos7环境下安装apache2.4+php5.6+mysql5.6 安装及踩坑集锦(三)
linux centos7环境下安装apache2.4+php5.6+mysql5.6 安装及踩坑集锦(三) 安装PHP 1.yum方式安装PHP方法同安装apache一样传送门:linux cent ...
- [Python]BeautifulSoup安装与使用
1.BeautifulSoup简介 BeautifulSoup4和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据 ...
- windows-problem :电脑上网的无线图标带有黄色星号,但不影响正常上网!
电脑可以上网,但是无线图标带有黄色星号如何解决? 进入“网络和共享中心”,点击“更改适配器设置”,看看是不是有两个以上的“本地连接”,只有一个有用,其他的删除即可.
- requests-验证码登录
ModuleNotFoundError: No module named 'bs4': 解决方法:pip install beautifulsoup4 https://blog.csdn.net/wi ...
- 关于在Ubuntu中无法使用tree命令的原因
初学linux系统的时候使用的是Ubuntu的操作系统,边看视频边学习,却发现很多命令行在自己使用的时候没有效果,只会盲目的百度,后面回过头来仔细一看才发现,原来终端早就给你答案了,只是自己一看到英语 ...
- Ora-00906:missing left parenthesis
问题描述 Ora-00906:missing left parenthesis 问题原因 varchar和varchar2 必须指定长度,不然会报错
- (转)R语言 SVM支持向量机在 R 语言中的实现和使用
支持向量机是一个相对较新和较先进的机器学习技术,最初提出是为了解决二类分类问题,现在被广泛用于解决多类非线性分类问题和回归问题.继续阅读本文,你将学习到支持向量机如何工作,以及如何利用R语言实现支持向 ...
- Selenium模块/目录说明
目录说明: selenium/common #定义了webdriver的异常类 selenium/webdriver #定义了webdriver所有python实现: 1.各种浏览器支 ...
- CodeForces 1144D
原题https://vjudge.net/problem/CodeForces-1144D /*求序列就经过几次step变成同一个数, 其实能发现一个数经过step1或者step2变成相邻的数, 所以 ...
- 2019牛客训练赛第七场 C Governing sand 权值线段树+贪心
Governing sand 题意 森林里有m种树木,每种树木有一定高度,并且砍掉他要消耗一定的代价,问消耗最少多少代价可以使得森林中最高的树木大于所有树的一半 分析 复杂度分析:n 1e5种树木,并 ...