线性表的特点:
(1) 一对一的关系,(第一个元素没有前驱,最后一个无后继,其他的只有一个前驱和一个后继)不能一对多或多对一
(2) 同一个序列中元素的数据类型是相同的
线性表的基本操作:(应该包含顺序存储结构和链式存储结构)
理解:需要对其中的数据进行修改,用*,没有修改的没有用
InitList(*L):初始化线性表
EmptyList(L):判断线性表是否为空,为空返回真,否则返回假
ClearList(L):清空线性表
GetElem(L,i,*e):从线性表中获得第i个元素,返回给e
LocateElem(L,e):从线性表中找到与e相等的元素,如果找到,返回表中序号,如果没有,返回0
ListInsert(*L,i,e):在线性表的第i个位置插入数据e
ListDelete(*L,i,*e):删除线性表中的第i个元素,通过e元素返回
ListLength(L):返回线性表的长度
顺序存储结构(缺点:可能会比较浪费空间)
C语言用一维数组来实现顺序存储结构
数据长度和线性表长度的区别:
数据长度:存放线性表的存储空间的长度,存储分配后这个量一般是不变的
线性表长度:线性表中数据元素的个数,一般随着线性表的插入和删除操作而改变的
线性表的长度应该小于数据长度
第i个数据的存储位置:an=a1+(n-1)d
顺序存储结构的插入和删除
获得元素操作:
GetElem(L,i,*e):从线性表中获得第i个元素,返回给e
#define ERROR 0
//注意没有分号
#define OK 1
status GetElem (SqList L,int i,ElemType *e)
{
if(L.length==0||i<1||i>L.length)
return ERROR;
else
*e=L.data[i-1];
return OK;
}
Status返回值类型 ElemType 和线性表中元素相同的类型
插入操作:
ListInsert(*L,i,e):在线性表的第i个位置插入数据e
#define MAXSIZE 20
//线性表的最大容量
status ListInsert(SqList *L,int i,ElemType *e)
{
if(L->length==MAXSIZE||i<1||i>L->length+1)//此处为什么要加1
return ERROR;
else if(i<L->length)//插入位置不在线性表的末尾
{
for(int k=L->length-1;k>=(i-1);k--)
{
L->data[k+1]=L->data[k];
}
}
L->data[i-1]=e;//不管i是否在末尾,都在这个位置插入,区别只在是否需要向后移动
L->length++;
return OK;
}
删除操作:
ListDelete(*L,i,*e):删除线性表中的第i个元素,通过e元素返回
status ListDelete(SqList *L,int i,ElemType e)
{
if(L->length==0||i<1||i>L->length)
return ERROR;
*e=L->DATA[i-1];
if(i<L->length)
{
for(int k=i;k<L->length-1;K++)
{
L->length[k-1]=L->length[k];
}
}
L->length--;
return OK;
}