只有一个首结点和尾结点;
除首尾结点外,其他结点只有一个直接前驱和一个直接后继。
ADT List
{
数据对象:D={ai|ai∈ElemSet,i1,2,3...n,n≥0}
数据关系:R={<ai-1,ai|ai-1,ai∈D,i=2,...,n}
线性表的基本操作
1.初始化线性表 L
2.销毁线性表L
3.清空线性表L
4.求线性表L的长度
5.判断线性表L是否为空
6.获取线性表L中的某个数据元素内容
7.检索值为e的数据元素
8.在线性表L中插入一个数据元素
9.删除线性表L中第i个数据元素
}ADT List
线性表的顺序表示又称为顺序存储结构或顺序映像。
#define MAXSIZE 100//最大长度
typedef struct{
ElemType *elem;//指向顺序表的基地址
int length;//顺序表的当前长度
}SqList;//顺序表的类型定义
如果你的C和C++基础不够扎实,建议看下我这篇博客
C、C++函数传参疑难解析
Status InitList_Sq(SqList &L)
{ //构造一个空的顺序表L
L.elem=new ElemTyPe[MAXSIZE];
//为顺序表分配空间
//存储分配失败
if(!L.elem)exit(OVERFLOW);
//空表长度为0
L.length=0;
return OK;
}
"Status InitList_Sq(SqList *L)
{
L->elem=new ElemType[MAXSIZE];
if(!L->elem)exit(OVERFLOW);
L->length=0;
return OK;
}
void DestroyList(Sqlist &L)
{
if(L.elem)
delete[]L.elem;//释放存储空间
}
void ClearList(SqList &L)
{
L.length=0;//将线性表的长度置为0
}
int GetLength(SqList L)
{
return(L.length);
}
int IsEmpty(SqList L)
{
if(L.length==0)
return 1;
else
return 0;
}
根据指定位置,获取相应位置数据元素的内容
int GetElem(SqList L,int i,ElemType &e)
{ //判断i值是否合理,若不合理,返回ERROR
if(i<1||i>L.length)
return ERROR;
e=L.elem[i-1];//第i-1的单元存储着第i个数据
return OK;
}
int LocateELem(SqList L,ElemType e)
{
for(i=0;i<L.length;i++)
if(L.elem[i]==e)
return i+1;
return 0;
}
Status ListInsert_Sq(SqList &L,int i,ElemType e)
{ //值不合法
if(i<1||i>L.length+1)return ERROR;
//当前存储空间已满
if(L.length==MAXSIZE)return ERROR;
for(j=L.length-1;j>i-1;j--)
//插入位置及以后的元素后移
//将新元素e放入第i个位置
L.elem[j+1]=L.elem[j];
L.elem[i-1]=e;
++L.length;//表长增加1
return OK;
}
Status ListDelete_Sq(SqList &L,int i,ElemType &e)
{
if((i<1)||(i>L.length))return ERROR;//i值不合法
e=L.elem[i-1];//将欲删除的元素保留在e中
for(j=i;j<=L.length-1;j++)
L.elem[j-1]=L.elem[j];//被删除元素之后的元素前移
--L.length;//表长减1
return OK;
}