目录
2.1线性表的定义和基本操作
2.1.1线性表的定义
线性表是具有组且数据类型的n (n > 0)个数据元素的有限序列,其中n为表长,当n=0
时线性表是一个空表。若用L命名线性表,则其一般表示为
L={a1,a2,…,ai, ai+1,…,an)
a1是唯一的“第一个”数据元素,又称表头元素;an是唯一的“最后一个”数据元素,又
称表尾元素。除第一个元素外,每个元素有且仅有一个直接前驱。除最后一个元素外,每个元素
有且仅有一个直接后继。
线性表的特点如下
·表中元素的个数有限。
·表中元素具有逻辑上的顺序性,表中元素有其先后次序。
.表中元素都是数据元素,每个元素都是单个元素。
.表中元素的数据类型都相同,这意味着每个元素占有相同大小的存储空间。
.表中元素具有抽象性,即仅讨论元素间的逻辑关系,而不考虑元素究竟表示什么内容。
注意:线性表是一种逻辑结构,表示元素之间一对一的相邻关系.顺序表和链表是指存储结
构,两者属于不同层面的概念,因此不要将其混淆。
2.1.2线性表的基本操作
一个数据结构的基本操作是指其最核心、最基本的操作。线性表的主要操作如下:
InitList(&L):初始化表。构造一个空的线性表。
Length(L):求表长。返回线性表L的长度,即L中数据元素的个数。
LocateElem (L, e):按值查找操作。在表L中查找具有给定关键字值的元素。
GetElem (L, i ):按位查找操作。获取表L中第i个位置的元素的值。
ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e.
ListDelete(&L,i, &e):删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值。
PrintList(L):输出操作。按前后顺序输出线性表L的所有元素值。
Empty (L):判空操作。若L为空表,则返回true,否则返回false.
DestroyList (&L):销毁操作。销毁线性表,并释放线性表L所占用的内存空间。
注意:①基本操作的实现取决于采用哪种存储结构,存储结构不同,算法的实现也不同。
②“&”表示C++语言中的引用调用,在C语言中采用指针也可达到同样的效果。
2.2线性表的顺序表示
2.2.1顺序表的定义
线性表的顺序存储又称顺序表。它是用一组地址连续的存储.单元依次存储线性表中的数据元
素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。
假设线性表L存储的起始位置为LOC(A), sizeof(ElemType)是每个数据元素所占用存
储空间的大小,则表L所对应的顺序存储如图2.1所示。
每个数据元素的存储位置都和线性表的起始位置相差一个和该数据元素的位序成正比的常数,因此,线性表中的任一数据元素都可以随机存取,所以线性表的顺序存储结构是一种随机存
取的存储结构。通常用高级程序设计语言中的数组来描述线性表的顺序存储结构。
注意:线性表中元素的位序是从1开始的,而数组中元素的下标是从0开始的。
假定线性表的元素类型为ElemType,则线性表的顺序存储类型描述为
#define MaxSize 50 //定义线性表的最大长度
typedef struct{
ElemType data[MaxSize]; //顺序表的元素
int length; //顺序表的当前长度
}SqList; //顺序表的类型定义
一维数组可以是静态分配的,也可以是动态分配的。在静态分配时,由于数组的大小和空间
事先己经固定,一旦空间占满,再加入新的数据就会产生溢出,进而导致程序崩溃。
而在动态分配时,存储数组的空间是在程序执行过程中通过动态存储分配语句分配的,一旦
数据空间占满,就另外开辟一块更大的存储空间,用以替换原来的存储空间,从而达到扩充存储
数组空间的目的,而不需要为线性表一次性地划分所有空间。
#define InitSize 100 //表长度的初始定义
type