2.1线性表的定义和特点
线性表是由n(n>=0)个数据特性相同的元素构成的有限数列;n为线性表中元素的个数。
注:当n=0时,称其为空表;
特点:
1)除第一个元素跟最后一个元素外,其他元素都存在唯一的前驱跟后驱。
2)第一个元素无前驱;最后一个元素无后驱。
2.2线性表中基本操作的实现
//顺序表中的存储结构
typedef struct
{
ElemType *elem;
int length;
}SqList;
1)初始化:构造一个空的顺序表。
Status InitList(Sqlist &L)
{
L.elem=new ElemType[MAXSIZE];//分配一个最大的数组空间
if(L.elem==NULL)//判断分配是否成功
exit(overflow);
l.length=0;
return OK;
}
2)取值:取第i个位置的元素
思路:可以通过数组的下表来得到实现
Status Getelem(SqList L,int i,ElemType &e)
{
if(i<1 || i>L.length)//首先要判断i的取值是否合理
return ERROR;
e=L.elem[i-1];//注意第i个元素与数组中下标的关系,之间相差1;
return e;
}
3)查找:查找与e相等的元素的位置
注:只能查找第一个与e相等元素的位置或者是最后一个,并不能重复查找。
int LocateElem(SqList L,ElemType &e)
{
for(i=0;i<L.length;i++)
{
if(L.elem[i]==e)
{
return i+1;//返回的是i+1,并不是i
}
}
return 0;//查找不到返回0
}
4).插入:跟C语言中数组的插入特别类似,思路相同
利用循环将插入第i个位置的元素进行后移来实现,也就是数组中第i-1个元素。
Status ListInsert(Sqlist &L,ElemType e,int i)
{
int j;
if(i<1 || i>L.length)//判断i的取值是否合理
return ERROR;
if(L.length==MAXSIZE)//注意数组的最大容量,这个容易遗漏。
return ERROR;
for(j=L.length;j>=i,j--)
{
L.elem[j]=L.elem[j-1];元素依次后移
}
L.elem[i-1]=e;//插入元素
++L.length;//长度+1
return OK;
}
5)删除:与插入特别类似,C语言中也有涉及,利用循环将删除第i个元素进行覆盖。也就是数组中第i-1个元素。
Status Listdelete(SqList &L,int i)
{
if(i<1 || i>L.length)
return ERROR;
for(i=i-1;i<L.length-1;i++)//方法不统一,i的初始取值会影响到循环中代码i的取值
{
L.elem[i]=L.elem[i+1];
}
--L.length;//长度-1
return OK;
以上就是一些顺序表的基本操作。