C语言数据结构——第二章 线性表

时间:2021-09-01 00:19:37

二、线性表

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. Maven项目环境搭建实例.

    前言:最近下班比较早, 总是不愿意让自己闲着, 此时刚好从网上找到了一些项目的资源, 结合自己在公司做的项目, 所以拿来一起学习加复习一些平常用到和没接触过的新知识.做的这个项目的名称叫做babasp ...

  2. AFNetwork2.0在报错1016,3840的解决方法及一些感悟

    最近在学习AFNetwork,非常好的网络框架,能节省很多时间.不过请求网络数据时报错1016,3840. 这两个错误网上解决方法很多,http://blog.csdn.net/huifeidexin ...

  3. Java集合中Set的常见问题及用法

    在这里演示的案例是衔接Java集合中的List(点击查看)那篇博文的,本节我们学习的Set的用法. Set是Collection的一个重要的子接口,Set中的元素是无序排列的,并且元素不可以重复,被称 ...

  4. 启动scala的方法

    1.从官网 http://www.scala-lang.org/download/ 下载scala二进制通用版本以后,在终端命令行添加下载解压包的bin目录到环境变量: export PATH=/Us ...

  5. 安装完sql server 后修改计算机名后不能进行发布的订阅的解决办法

    由于需要需要配置一个发布订阅,可是一直报告:" sql server 复制需要有实际的服务器名称才能连接到服务器,不支持通过别名.ip地址或其他任何备用名称进行连接.请指定实际的服务器名称“ ...

  6. 【Nutch2.2.1基础教程之1】nutch相关异常

    1.在任务一开始运行,注入Url时即出现以下错误. InjectorJob: Injecting urlDir: urls InjectorJob: Using class org.apache.go ...

  7. [C++STDlib基础]关于单字符的操作——C++标准库头文件<cctype>

    网上实例 总结 /* _STD_BEGIN using _CSTD isalnum; using _CSTD isalpha; using _CSTD iscntrl; using _CSTD isd ...

  8. No such property: FOR_RUNTIME for class: org.gradle.api.attributes.Usage

    自从Android studio升级到3.1版本,谷歌又折腾出让你意想不到的错误.... 从github上下了个项目用来学习,却出现了如下错误: No such property: FOR_RUNTI ...

  9. C#中使用打印日志

    在日常的工作中经常需要日志,这样能够很容易定位到代码中的一些错误,.Net中有自带的日志接口.并没有仔细去研究,这里是我自己写的日志接口,记录下来以便以后用到,根据时间打印相关的日志文件,代码如下: ...

  10. 050 Kafka的引入介绍

    高吞吐量的分布式订阅消息系统 1.官网 http://kafka.apache.org/ 2.官网的介绍 3.结构 这个是版本1.0之后的版本. In Kafka the communication ...