三、【线性表】线性表概述

线性表概述 Linear List

在了解线性表之前,我们首先了解一下什么是线性结构。线性结构的特点是:在数据元素的非空有限集中

  1. 存在唯一的一个被称为“第一个”的数据元素。
  2. 存在唯一的一个被称为“最后一个”的数据元素。
  3. 除第一个外,集合中的每个数据元素均只有一个前驱。
  4. 除最后一个外,集合中的每个数据元素均只有一个后驱。


1 线性表的定义

线性表是一种最常用且最简单的数据结构。简单来说,一个线性表是 n n n ( n ≥ 0 ) (n \ge 0) (n0) 个数据元素的有限序列,其中 n n n 为表长,当 n = 0 n=0 n=0 时线性表是一个空表。若用 L L L 命名线性表,则其一般表示为
L = ( a 1 , a 2 , … , a i , a i + 1 , … , a n ) L = (a_1, a_2, \dots, a_i, a_{i+1}, \dots, a_n) L=(a1,a2,,ai,ai+1,,an)
其中 a 1 a_1 a1 又称为表头元素, a n a_n an 又称为表尾元素, i i i 称为数据元素 a i a_i ai 在线性表中的位序。除开表头元素,任意元素有且仅有一个前驱;除开表尾元素,任意元素有且仅有一个后驱。这种线性有序的逻辑特征就是线性表名字的由来。

在生活中,我们经常用到线性表这样的数据结构。例如,包含26个英文字母的字母表 ( A , B , C , … , Z ) (A, B, C, \dots, Z) (A,B,C,,Z) 就是一个线性表,其数据元素是单个字母字符。又比如,某个中学对学生年龄的统计 ( 12 , 12 , 13 , 14 , 12 ) (12, 12, 13, 14, 12) (12,12,13,14,12) ,其数据元素是整数。在稍复杂的情况下,线性表中的数据元素还可以由若干个数据项构成。例如某医院对病人的信息记录由五个部分组成:姓名、身份证号、性别、年龄和健康状况。在这种情况下,我们常把数据元素称为记录(Record),含有大量记录的线性表又称为文件(File)

姓名身份证号性别年龄健康状况

通过上述例子我们可以归纳,不同线性表中的数据元素的类型可以是不同的,但是在同一线性表中,所有数据元素必定具有相同特性(或属于同一数据类型)。

同时,我们可以发现线性表讨论的只是各数据元素之间的逻辑关系,并不涉及数据元素的存储和运算,因此线性表是一种逻辑结构。

总结一下,线性表有如下特点:

  • 表中元素个数有限。
  • 表中元素具有逻辑上的顺序性,有其先后次序。
  • 表中元素都是数据元素。
  • 表中元素的数据类型都相同,这意味着每个元素占有相同大小的存储空间。
  • 表中元素具有抽象性,即仅讨论元素间的逻辑关系。


2 线性表的基本操作

一个数据结构的基本操作是指其最核心,最基本的操作。其他较复杂的操作都可以通过调用其基本操作来实现。


2.1 主要操作

线性表的主要操作如下:

主要操作操作结果
InitList(&L)初始化操作,构造一个空的线性表
DestroyList(&L)销毁操作,销毁线性表并释放所占用的内存空间
ListEmpty(L)判空操作,若 L 为空返回True,否则返回False
ListLength(L)求表长操作,返回线性表 L 的长度,即元素个数
GetElem(L, i)按位查找操作,获取表 L 中第 i 个位置的元素的值
LocateElem(L, e)按值查找操作,在表中查找具有给定关键字值的元素
ListInsert(&L, i , e)插入操作,在表的第 i 个位置插入元素 e
ListDelete(&L, i , &e)删除操作,删除表中第 i 个元素的值,并用 e 返回删除元素的值
ListPrint(L)输出操作,按前后顺序输出线性表 L 的所有元素值

2.2 其他常用操作

2.2.1 两表的并集

假设现在有两个线性表 L A LA LA L B LB LB ,要求扩大线性表 L A LA LA ,将存在于线性表 L B LB LB 中而不存在于线性表 L A LA LA 中的数据元素插入到线性表 L A LA LA 中去。

基本思路是从线性表 L B LB LB 中依次取得每个数据元素,并依值在线性表 L A LA LA 中查找,若不存在则插入该数据元素。

2.2.2 两表的合并

假设现在有两个线性表 L A LA LA L B LB LB ,它们的数据元素按值非递减有序排列,现要求将 L A LA LA L B LB LB 归并为一个新的线性表 L C LC LC ,且 L C LC LC 中的元素仍按值非递减有序排列。例如,假设
L A = ( 3 , 5 , 8 ) L B = ( 2 , 8 , 9 ) \begin{aligned} LA &= (3, 5, 8) \\ LB &= (2, 8, 9) \end{aligned} LALB=(3,5,8)=(2,8,9)

L C = ( 2 , 3 , 5 , 8 , 8 , 9 ) \begin{aligned} LC &= (2, 3, 5, 8, 8, 9) \end{aligned} LC=(2,3,5,8,8,9)

基本思路是先令 L C LC LC 为空表,然后用两个指针 i i i j j j 分别指向 L A LA LA L B LB LB 中的元素,比较元素大小,将更小的元素插入 L C LC LC 中,并将对应的指针后移一位。



相关章节

第一节 【绪论】数据结构的基本概念
第二节 【绪论】算法和算法评价
第三节 【线性表】线性表概述
第四节 【线性表】线性表的顺序表示和实现
第五节 【线性表】线性表的链式表示和实现
第六节 【线性表】双向链表、循环链表和静态链表
第七节 【栈和队列】栈
第八节 【栈和队列】栈的应用
第九节 【栈和队列】栈和递归
第十节 【栈和队列】队列

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值