线性表(List):零个或多个数据元素的有限序列。
线性表的抽象数据类型:
ADT 线性表(List)
Data
线性表的数据对象集合为(a1,a2,......,an),每个元素的类型均为DataType。其中,除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个直接后继元素。数据元素之间的关系是一对一关系。
Operation
InitList(*L): 初始化操作,建立一个空的线性表L。
ListEmpty(L): 若线性表为空,返回true,否则返回false。
ClearList(*L): 将线性表清空。
GetElem(L,i,*e):将线性表L中的第i个位置元素值返回给e。
LocateElem(L,e):在线性表L中查找与给定值e相等的元素,如果 查找成功,返回该元素在表中序号表示成功;否则,返回0表示失败。
ListInsert(*L,i,e):在线性表L中的第i个位置插入新元素e。
ListDelete(*L,i,*e):删除线性表L中的第i个位置元素,并用e返回其值。
ListLength(L):返回线性表L的元素个数。
endADT
线性表的顺序存储结构代码:
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 50
typedef int ElemType;
typedef int Status;
typedef struct{
ElemType data[MAXSIZE];
int length;
}SqList;
说白了,线性表的顺序存储结构就三个属性:
1.存储空间的起始位置:数组data,它的存储位置就是存储空间的存储位置。
2.线性表的最大存储容量:数组长度MAXSIZE。
3.线性表的当前长度:length。
注: 数组的长度是存放线性表的存储空间的长度,也可以理解为线性表的最大长度;而线性表的长度是线性表中数据元素的个数。线性表的长度应小于或等于数组长度。
线性表的初始化,也就是将线性表长度置为0:
//初始化线性表
Status InitList(SqList *L){
L->length=0;
return OK;
}
查找线性表中第i个元素,并返回值给e:
//查找线性表中第i个元素,并返回值给e
Status GetElem(SqList L,int i,ElemType *e){
if(L.length==0||i<0||i>L.length)
return ERROR;
*e=L.data[i-1];
return OK;
}
查找线性表中与e值相等的元素的位置(第i个元素):
//查找线性表中与e值相等的元素的位置(第i个元素)
int LocateElem(SqList L,ElemType e){
int i;
if(0==L.length)
return ERROR;
for(i=1;i<=L.length;i++){
if(e==L.data[i-1])
return i;
else return ERROR;
}
}
判断线性表是否为空:
//判断线性表是否为空
bool ListEmpty(SqList L){
if(L.length==0)
return TRUE;
else return FALSE;
}
在线性表中第i个位置插入元素:
//在线性表中第i个位置插入元素
Status ListInsert(SqList *L,int i,ElemType e){
int k;
if(L.length==MAXSIZE||i<0||i>L.length+1)
return ERROR;
for(k=L.length;k>=i;k--){
L.data[k]=L.data[k-1];
}
L.data[i-1]=e;
return OK;
}
删除线性表的第i个元素,并用e返回其值:
//删除线性表的第i个元素,并用e返回其值
Status ListDelete(SqList *L,int i,ElemType *e){
int k;
if(L.length==0||i<0||i>L.length)
return ERROR;
*e=L.data[i-1];
for(k=i;k<L.length;k++){
L.data[k-1]=L.data[k]
}
return OK;
}
线性表的优缺点:
优点:1.无须为表示表中元素之间的逻辑关系而增加额外的存储空间。
2.可以快速地存取表中任一位置的元素。
缺点:1.插入和删除操作需要移动大量元素。
2.当线性表长度变化较大时,难以确定存储空间的容量。
3.造成存储空间的“碎片”。