数据结构之线性表的实现
数据集
D={ai|ai∈ElemSet,i=1,2,3……,n,n≥0}
操作集
1、线性表的构建
Status InitList(SqList &L)
{
//初始化线性表
//为L分配Elemtype类型的LIST_INIT_SIZE空间的大小
L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
//分配失败
if(!L.elem)
{
exit(OVERFLOW);
}
//分配成功后的状况
L.length=0;
L.listsize=LIST_INIT_SIZE;
return OK;
}
2、线性表的删除
Status DestroyList(SqList &L)
{
//释放线性表的元素
free(L.elem);
L.length=0;
L.listsize=0;
L.elem=NULL;
return OK;
}
3、线性表的清空
Status ClearList(SqList &L)
{
L.length=0;
return OK;
}
4、判断线性表是否为空表
Status IsEmptyList(SqList L)
{
if(L.length==0)
return OK;
else
return ERROR;
}
5、返回已知元素的前驱
Status PriorElem(SqList L,ElemType cur_e,ElemType &pre_e)
{
int i=2;
ElemType *p=L.elem+1;
//循环将p的值对应到i的位置
while(i<L.length&&*p!=cur_e)
{
i++;
p++;
}
//如果索引超出界限
if(i>L.length)
return ERROR;
else
{
//前驱为*p--
pre_e=*(--p);
return OK;
}
}
6、返回已知元素的后继
Status NextElem(SqList L,ElemType cur_e,ElemType &next_e)
{
//原理同返回前驱
int i=1;
ElemType *p=L.elem;
while(i<L.length&&*p!=cur_e)
{
p++;
i++;
}
if(i>L.length)
return ERROR;
else
{
next_e=*(++p);
return OK;
}
}
7、线性表元素的插入
Status ListInsert(SqList &L,int i,ElemType e)
{
//在i处插入元素e
ElemType *newbase,*q,*p;
if(i<1||i>L.length+1)
return ERROR;
if(L.length>=L.listsize)
{
//长度大于内存,重新分配空间
newbase=(ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)
exit(OVERFLOW);
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
//插入位置为q
q=L.elem+i-1;
for(p=L.elem+L.length-1;p>=q;--p)
*(p+1)=*p;
*q=e;
++L.length;
return OK;
}
8、线性表元素的删除
Status ListDelete(SqList &L,int i,ElemType &e)
{
//删除第i个位置的元素,并用e返回
ElemType *q,*p;
if(i<1||i>L.length)
return ERROR;
p=L.elem+i-1;
e=*p;
q=L.elem+L.length;
for(++p;p<q;++p)
*(p-1)=*p;
--L.length;
return OK;
}
9、获取线性表当前长度
int GetLength(SqList L)
{
return L.length;
}
10、返回指定位置的元素
Status GetElem(SqList L,int i,ElemType &e)
{
//判断是否超界
if(i<1||i>L.length)
exit(ERROR);
e=*(L.elem+i-1);
return OK;
}
主函数的实现
在这里可以运用循环来对线性表进行循环操作,本例子主要对线性表的插入进行了可以判断的循环,读者可根据需要自行修改
int main()
{
SqList L;
Status i;
//flag为插入元素是否循环,m为线性表的位置
int flag=1,j,m;
ElemType e=1,n;
i=InitList(L);
printf("初始化线性表,分配状态为%d,当前元素长度为%d,分配长度为%d\n",i,L.length,L.listsize);
system("pause");
//线性表的第一个元素位置为1
//线性表插入操作
while(flag)
{
//在i处插入元素
printf("输入插入的元素及位置,用空格隔开(比如”1 2“为在线性表第一处插入元素2)\n");
scanf("%d %d",&m,&e);
i=ListInsert(L,m,e);
printf("当前线性表的元素为");
for(j=0;j<L.length;++j)
printf(" %d ",*(L.elem+j));
printf("插入状态为%d,线性表为的当前长度为%d\n",i,GetLength(L));
printf("\n继续输入请按1,停止输入请按0\n");
scanf("%d",&flag);
//p++;
}
//线性表的删除
printf("请输入线性表删除的位置\n");
scanf("%d",&m);
i=ListDelete(L,m,e);
printf("删除操作执行结果为%d,删除元素为%d\n当前线性表元素为",i,e);
for(j=0;j<L.length;++j)
printf(" %d ",*(L.elem+j));
printf("\n");
system("pause");
printf("请输入要查询已知元素\n");
scanf("%d",&n);
i=PriorElem(L,n,e);
printf("查询状态为%d,该元素的先驱为 %d\n",i,e);
system("pause");
printf("请输入要查询已知元素\n");
scanf("%d",&n);
i=NextElem(L,n,e);
printf("查询状态为%d,该元素的后继为 %d\n",i,e);
system("pause");
return 0;
}
- 成果图
附源代码一份:(https://download.csdn.net/download/qq_37002607/11439307)
(https://github.com/idong1e/DataStruct)