数据结构中顺序表的基本操作.docx
《数据结构中顺序表的基本操作.docx》由会员分享,可在线阅读,更多相关《数据结构中顺序表的基本操作.docx(9页珍藏版)》请在冰豆网上搜索。
![数据结构中顺序表的基本操作.docx](https://file1.bdocx.com/fileroot1/2023-4/19/4934eaa8-437c-4484-b2ed-8d2e33c20280/4934eaa8-437c-4484-b2ed-8d2e33c202801.gif)
数据结构中顺序表的基本操作
数据结构中顺序表的基本操作
//头文件
#include
#include
#include
//函数返回状态代码
#defineOK1
#defineERROR0
#defineTRUE1
#defineFALSE0
#defineINFEASIBLE-1
#defineOVERFLOW-2
//运用动态分配的顺序存储结构
#defineLIST_INIT_SIZE100
#defineLISTINCREMENT10
typedefintElemType;
typedefstruct{
ElemType*elem;
intlength;
intlistsize;
}SqList;
typedefintStatus;
StatusInitList(SqList&L){
//初始化一个顺序表
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!
L.elem)exit(OVERFLOW);
L.length=0;
L.listsize=LIST_INIT_SIZE;
returnOK;
}//InitSqList
StatusListInsert(SqList&L,inti,ElemTypee){
//在第i个元素前插入一个新的元素
if(i<1||i>++L.length)returnERROR;
if(L.length==L.listsize)
{
ElemType*newbase=(ElemType*)realloc(L.elem,(LIST_INIT_SIZE+LISTINCREMENT)*sizeof(ElemType));
if(!
newbase)exit(OVERFLOW);
L.elem=newbase;
L.listsize=LIST_INIT_SIZE+LISTINCREMENT;//勿忘
}
for(intj=L.length;j>=i;--j)//此处要注意
L.elem[j]=L.elem[j-1];
L.elem[i-1]=e;
returnOK;
}//ListInsert
StatusGetElem(SqListL,inti,ElemType&e){
//返回顺序表中的第i个元素
if(i<1||i>L.length)returnERROR;
e=L.elem[i-1];
returnOK;
}//GetElem
StatusListDelete(SqList&L,inti,ElemType&e){
//删除顺序表中的第i个元素
if(i<1||i>L.length)returnERROR;
e=L.elem[i-1];
for(i;iL.elem[i-1]=L.elem[i];
--L.length;
returnOK;
}//ListDelete
StatusPriorElem(SqListL,ElemTypecur_e,ElemType&pre_e){
//返回一个不是首元素的前驱
inti=2;
if(cur_e==L.elem[0])returnERROR;
while(i<=L.length&&(L.elem[i-1]!
=cur_e))
i++;
if(i==L.length+1)returnERROR;
elsepre_e=L.elem[i-2];
returnOK;
}//PriorElem
StatusNextElem(SqListL,ElemTypecur_e,ElemType&next_e){
//返回一个不是末元素的后继
inti=1;
while(i=cur_e))
i++;
if(i==L.length)returnERROR;
elsenext_e=L.elem[i];
returnOK;
}//NextElem
StatusListEmpty(SqListL){
//判断顺序表是否为空
returnL.length==0;
}//ListEmpty
StatusListLength(SqListL){
//求顺序表的长度
returnL.length;
}//ListLength
StatusDestroyList(SqList&L){
//销毁一个顺序表
if(L.elem)
free(L.elem);
L.elem=NULL;
printf("此顺序表已被销毁。
");
returnOK;
}//DestroyList
StatusClearList(SqList&L){
//清空一个顺序表
L.length=0;
returnOK;
}//ClearList
StatusListPrint(SqList&L)
{
printf("顺序表为:
");
if(ListEmpty(L))
{
printf("空。
\n");
returnERROR;
}
for(inti=0;i{
printf("%-4d",L.elem[i]);
}
printf("\n");
returnOK;
}
voidmain()
{
SqListL;
ElemTypea,b,c,d,e,f,pre_e,next_e;
inti,j,k,l,m,menu;
charp,q,r,s;
intis_stop_;
InitList(L);
is_stop_=FALSE;
while(!
is_stop_)
{
printf(
"1.添加元素2.查看指定位置的元素\n"
"3.删除元素4.查找元素前驱\n"
"5.查找元素后继6.检查是否为空\n"
"7.列出所有元素8.查看列表长度\n"
"9.清空表10.释放列表内存并退出\n"
"11.退出\n"
);
printf("请选择,执行以上操作:
");
scanf("%d",&menu);
switch(menu)
{
//"1.添加元素;\n"
case1:
printf("请输入你想创建的顺序表中元素的个数:
");
scanf("%d",&i);
if(i<1)printf("您输入的值有误,无法创建顺序表。
\n");
else
{
printf("请您依次输入您想创建的顺序表的元素:
");
for(j=1;j<=i;j++)
{
scanf("%d",&a);
ListInsert(L,L.length+1,a);
}
}
ListPrint(L);
break;
//"2.查看指定位置的元素\n"
case2:
printf("请输入您想获取的元素的位序:
");
scanf("%d",&k);
if(GetElem(L,k,b))printf("获得的元素为:
%d\n",b);
elseprintf("您输入的值有误,无法获取元素。
\n");
break;
//"3.删除元素\n"
case3:
printf("请输入您想删除的元素的位序:
");
scanf("%d",&l);
if(ListDelete(L,l,c))
{
printf("删除的元素为:
%d\n",c);
printf("删除元素后的顺序表为:
");
ListPrint(L);
}
elseprintf("您输入的值有误,无法删除元素。
\n");
break;
//"4.查找元素前驱\n"
case4:
printf("您想返回那个元素的前驱?
");
scanf("%d",&d);
if(PriorElem(L,d,pre_e))printf("元素%d的前驱为%d\n",d,pre_e);
elseprintf("您输入的值有误,无法返回前驱。
\n");
break;
//"5.查找元素后继\n"
case5:
printf("您想返回那个元素的后继?
");
scanf("%d",&e);
if(NextElem(L,e,next_e))printf("元素%d的后继为%d\n",e,next_e);
elseprintf("您输入的值有误,无法返回后继。
\n");
break;
//"6.检查是否为空\n"
case6:
if(ListEmpty(L))printf("此顺序表为空。
\n");
elseprintf("此顺序表不为空。
\n");
break;
//"7.列出所有元素\n"
case7:
ListPrint(L);
break;
//"8.查看列表长度\n"
case8:
printf("此顺序表的长度为:
%d\n",ListLength(L));
break;
//"9.清空表\n"
case9:
ClearList(L);
printf("顺序表已清空。
\n");
break;
//"10.释放列表内存\n"
case10:
DestroyList(L);
is_stop_=TRUE;
break;
//"11.退出\n"
case11:
is_stop_=TRUE;
break;
}
}
DestroyList(L);
}