1.线性表的定义和特点
同一线性表中的元素必定具有相同的特性,即属于同一数据对象,相邻数据元素之间存在着序偶关系,诸如此类由n(n>=0)个数据特性相同的元素构成的有限序列称为线性表。线性表中元素的个数n(n>=0)定义为线性表的长度,n=0时称为空表。
对于非空的线性表或线性结构,其特点是:
(1)存在唯一的一个被称为“第一个”的数据元素;
(2)存在唯一的一个被称为“最后一个”的数据元素;
(3)除第一个之外,结构中的每个数据元素均只有一个前驱;
(4)除最后一个之外,结构中的每个数据元素均只有一个后驱。
2.线性表的顺序表表示和实现
2.1线性表的顺序存储表示
线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素,这种表示也称作线性表的顺序存储结构或顺序映像。
假设线性表的每个元素需占用l个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储起始位置。
线性表的第i个数据元素ai的存储位置为:
LOC(ai)=LOC(a1)+(i-1)*l
LOC(a1)是线性表的第一个数据元素a1的存储位置,通常称作线性表的起始位置或基地址。只要确定了存储线性表的起始位置,线性表中任一数据元素都可以随机存取,所以线性表的顺序存储结构是一种随机存取的存储结构。
//顺序表的存储结构
#define MAXSIZE 100 //顺序表可能达到的最大长度
typedef struct
{
ElemType *elem; //存储空间的基地址
int length; //当前长度
}SqList; //顺序表的结构类型为SqList
元素类型定义中的ElemType数据类型是为了描述统一而自定的,在实际应用中,用户可以根据实际需要具体定义表中数据元素的数据类型,既可以是基本数据类型,也可以是构造数据类型。
2.2顺序表中基本操作的实现
1.初始化
(1)为顺序表L动态分配一个预定义大小的数组空间,使elem指向这段空间的基地址。
(2)将表的当前长度设为0。
Status InitList(SqList &L) //构造一个空的顺序表L
{
L.elem=new ElemType[MAXSIZE]; //为顺序表分配一个大小为MAXSIZE的数组空间
if(!L.elem) exit(OVERFLOW); //存储分配失败退出
L.length=0; //空表长度为0
return OK;
}
2.取值
(1)判断指定的位置序号i值是否合理(1<=i<=L.length),若不合理,则返回ERROR;
(2)若i值合理,则将第i个数据元素L.length[i-1]赋值给参数e,通过e返回第i个数据元素的传值。
Status GetElem(SqList L,int i,ElemType &e)
{
if(i<1||i>L.length) return ERROR; //判断i值是否合理,若不合理,返回ERROR
e=L.elem[i-1]; //elem[i-1]单元存储第i个数据元素
return OK;
}
3.查找
(1)从第一个元素起,依次和e相比较,若找到与e相等的元素L.elem[i],则查找成功,返回该元素的序号i+1。
(2)若查遍整个顺序表都没有找到,则查找失败,返回0。
int LocateElem(SqList L,ElemType e)
{
for(i=0;i<L.length;i++)
if(L.elem[i]==e) return i+1;
return 0;
}
4.插入
(1)判断插入位置i是否合法(i值的合法范围是1<=i<=n+1),若不合法则返回ERROR。
(2)判断顺序表的存储空间是否已满,若满则返回ERROR。
(3)将第n个至第i个位置的元素依次向后移动一个位置,空出第i个位置(i=n+1时无需移动)。
(4)将要插入的新元素e放入第i个位置。
(5)表长加1。
Status ListInsert(SqList &L,