线性表(List):零个或多个数据元素的有限序列。
线性表有n(n>=0)个元素,n也是线性表的长度。当n=0时,线性表称为空表。
四个特点:
1. 集合中必存在唯一的一个“第一元素”。
2. 集合中必存在唯一的一个 “最后元素” 。
3. 除最后一个元素之外,均有唯一的后继(后件)。
4. 除第一个元素之外,均有唯一的前驱(前件)。
线性表的抽象数据类型
定义及操作:
ADT 线性表(List)
Date
线性表的数据对象集合为{a1,a2,…,an},每个元素的类型均为DateType。其中,除第一个元素a1外,每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个直接后继元素。数据元素之间的关系是一对一的关系。
基本操作:
线性表的顺序存储结构
线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。
地址计算
由于C语言中的数组是从 0 开始的,所以对应关系如下图:
假设元素占用了C个存储单元,那么线性表中第 i 个数据元素 ai 的存储位置由 a1 可以得到:
LOC(ai)= LOC(a1)+(i - 1)*C
基本操作实现
- 初始化
int InitList(SqList &L)
{
L.elem = ElemType[MAX];
if (!L.elem)
{
return -1;
}
L.length = 0;
return 0;
}
- 销毁
void DestroyList(SqList &L)
{
if(L.elem)
{
delete [] L.elem;
}
}
- 查找(LocateElem)
从第一个元素a1开始依次和x比较,若相等,则返回该元素的下标。
int LocateElem(Sqlist L,Elemtype e)
{
for(i=0;i<L.Length;i++)
{
if(L.elem[i]==e)
{
return i;
}
}
return 0;
}
查找(GetElem)
Status GetEelm(SqList L,ElemType *e)
{
if(L.length==0||i<1||i>L.length)
{
return -1;
}
*e=L.elem[i-1];
return 0;
}
- 插入
Status ListInsert(SqList &L,ElemType e)
{
if(i<1||i>L.length+1;i++)
{
return -1;
}
if(L.length==MAX)
{
return -1;
}
if(i<=L.length)
{
for(i=l.length-1;i>=i-1;i--)
{
L.elem[j+1]=L.elem[j];
}
}
L.elem[i-1]=e;
L.length++;
return 0;
}
- 删除
Status ListDelete(SqList L,ElemType *e)
{
int k;
if(L.length==0)
return -1;
if(i<1||i>L.length)
return -1;
*e=L.elem[i-1];
if(i<L.length)
{
for(k=i;k<L.length;k++)
{
L.elem[k-1]=L.elem[k];
)
L.length--;
}
return 0;
}
- 求长
int GetLength(SqList L)
{
return (L.length);
}
文章参考《大话数据结构》