二、线性表

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语言数据结构——第二章 线性表的更多相关文章

  1. c语言数据结构学习心得——线性表

    线性表:具有相同数据类型的n(n>0)个数据元素的有限序列. 主要有顺序存储和链式存储. 顺序存储: 特点:地址连续,随机/存取,顺序存储. 建立:首地址/存储空间大小(数组),表长. 方式:静 ...

  2. 基于c语言数据结构+严蔚敏——线性表章节源码,利用Codeblocks编译通过

    白天没屌事,那我们就来玩玩线性表的实现吧,快要失业了,没饭吃了咋整哦 题目描述假设利用两个线性表LA和LB分别表示两个集合A和B(即:线性表中的数据元素即为集合中的成员),现要求一个新的集合A=A∪B ...

  3. 数据结构(c语言版,严蔚敏)第2章线性表

    弟2章线性表

  4. [数据结构 - 第3章] 线性表之双向链表(C语言实现)

    一.什么是双向链表? 双向链表(double linked list)是在单链表的每个结点中,再设置一个指向其前驱结点的指针域.所以在双向链表中的结点都有两个指针域,一个指向直接后继,另一个指向直接前 ...

  5. 数据结构(C语言版)-第2章 线性表

    #define MAXSIZE 100 //最大长度 typedef struct { ElemType *elem; //指向数据元素的基地址 int length; //线性表的当前长度 }SqL ...

  6. 第2章 线性表《C#数据结构和算法》

    ( )除第一个位置的数据 元素外,其它数据元素位置的前面都只有一个数据元素:( )除最后一个位置的 数据元素外,其它数据元素位置的后面都只有一个元素.也就是说,数据元素是 一个接一个的排列.因此,可以 ...

  7. 最小正子序列(序列之和最小,同时满足和值要最小)(数据结构与算法分析——C语言描述第二章习题2.12第二问)

    #include "stdio.h" #include "stdlib.h" #define random(x) (rand()%x) void creat_a ...

  8. 《数据结构与STL-第二章 线性表》读书笔记

    线性表 定义 线性表(linear list)是由零个或多个相同类型的数据元素构成的有限序列. 存储结构 顺序存储 最简单的存储方法是顺序存储法,即把线性表的数据元素按照逻辑次序顺序地放在一组地址连续 ...

  9. [数据结构 - 第3章] 线性表之单链表(C++实现)

    一.类定义 单链表类的定义如下: #ifndef SIGNALLIST_H #define SIGNALLIST_H typedef int ElemType; /* "ElemType类型 ...

随机推荐

  1. 二叉树(5)HuffmanTree

    构建一棵 HuffmanTree. 测试代码 main.cpp: #include <iostream> #include "HuffmanTree.h" using ...

  2. mybatis - 基于拦截器修改执行语句中的ResultMap映射关系

    拦截器介绍 mybatis提供了@Intercepts注解允许开发者对mybatis的执行器Executor进行拦截. Executor接口方法主要有update.query.commit.rollb ...

  3. ps导出svg

    svg初识 看到一些复杂的svg图形很好奇是手写出来的么,看了源码望而却步.网上看到ps都可以导出svg,然后试了下. 需要加载一个脚本,js写的,把文件复制到路径后重启ps,修改图形名字,然后保存成 ...

  4. 基于 Ant Desigin 的后台管理项目打包优化实践

    背景 按照 Ant Design 官网用 React 脚手构建的后台项目,刚接手项目的时候大概30条路由左右,我的用的机子是 Mac 8G 内存,打包完成需要耗时2分钟左右,决定优化一下. 项目技术栈 ...

  5. BandwagonHost VPS CentOS7系统启用EPEL源

    BandwagonHost默认安装好了EPEL源,只是默认没有启用,所以很多软件都无法安装.我们需要手动启用一下,才能安装里面的软件. # vim /etc/yum.repos.d/epel.repo ...

  6. 题解 AT3853 【Otoshidama】

    题目传送门. 暴力枚举题. 分析 Step 1:定义两个变量,\(n\)和\(y\). int n,y; cin>>n>>y; Step 2:使用二重循环进行暴力枚举. for ...

  7. 一些常见的HTTP的请求状态码

    200:正确的请求返回正确的结果,如果不想细分正确的请求结果都可以直接返回200. 201:表示资源被正确的创建.比如说,我们 POST 用户名.密码正确创建了一个用户就可以返回 201. 202:请 ...

  8. CI系列之配置sonar

    基于GO项目 1.在jenkins新建sonar任务,设置2个变量用于接收代码分支和pipline的workspace[两个变量的作用在CI之Jenkinsfile中会讲到] A.添加构建参数 B.选 ...

  9. python面试的100题(16)

    Python高级 元类 42.Python中类方法.类实例方法.静态方法有何区别? 类方法: 是类对象的方法,在定义时需要在上方使用 @classmethod 进行装饰,形参为cls,表示类对象,类对 ...

  10. 二、vim的保存文件和退出命令

    vim的保存文件和退出命令   命令 简单说明 :w 保存编辑后的文件内容,但不退出vim编辑器.这个命令的作用是把内存缓冲区中的数据写到启动vim时指定的文件中. :w! 强制写文件,即强制覆盖原有 ...