线性表.docx
《线性表.docx》由会员分享,可在线阅读,更多相关《线性表.docx(24页珍藏版)》请在冰豆网上搜索。
![线性表.docx](https://file1.bdocx.com/fileroot1/2022-11/24/7dd1fa5a-a30c-4ee9-a920-f55d3c2e358d/7dd1fa5a-a30c-4ee9-a920-f55d3c2e358d1.gif)
线性表
#include
#include
#defineSIZE20
#defineOK1
#defineERROR0
#defineOVERFLOW-2
typedefintStatus;
typedefintElemType;
typedefstruct
{
ElemType*elem;
intlength;
intlistsize;
}SqList;
intflag1=1,flag2=1;
StatusInitList(SqList&L,intsize);
StatusGetElem(SqListL,inti,ElemType&e);
voidPriorElem(SqListLA,SqListLB);
voidPrior_LElem(SqListL,intFlag);
voidNextElem(SqListLA,SqListLB);
voidNext_LElem(SqListL,intFlag);
voidListInsert(SqList&LA,SqList&LB);
voidListInsert_L(SqList&L,intFlag);
voidListDelete(SqList&LA,SqList&LB);
voidDelete_LElem(SqList&L,intFlag);
voidClearList(SqList&LA,SqList&LB);
voidDestoryList(SqList&LA,SqList&LB,SqList&LC);
voidMergeList(SqListLA,SqListLB,SqList&LC);
voidOutput(SqListLA,SqListLB,SqListLC);
voidoutput_L(SqListL);
voidmain()
{
inta=1;
SqListLA,LB,LC;
InitList(LA,SIZE);
InitList(LB,SIZE);
InitList(LC,2*SIZE);
ListInsert_L(LA,flag1);
ListInsert_L(LB,flag2);
system("cls");
while(a)
{
printf("\n\n");
printf("\t\t\t主菜单\n\n");
printf("\t\t-------------------------------------\n\n");
printf("\t\t\t1——输出前驱\n\n");
printf("\t\t\t2——输出后继\n\n");
printf("\t\t\t3——插入元素\n\n");
printf("\t\t\t4——删除元素\n\n");
printf("\t\t\t5——置空线性表\n\n");
printf("\t\t\t6——销毁线性表\n\n");
printf("\t\t\t7——合并线性表\n\n");
printf("\t\t\t8——输出线性表\n\n");
printf("\t\t\t0——退出\n");
scanf("%d",&a);
switch(a)
{
case1:
system("cls");
PriorElem(LA,LB);
system("cls");
break;
case2:
system("cls");
NextElem(LA,LB);
system("cls");
break;
case3:
system("cls");
ListInsert(LA,LB);
system("cls");
break;
case4:
system("cls");
ListDelete(LA,LB);
system("cls");
break;
case5:
system("cls");
ClearList(LA,LB);
system("cls");
break;
case6:
system("cls");
DestoryList(LA,LB,LC);
system("cls");
break;
case7:
system("cls");
MergeList(LA,LB,LC);
system("cls");
break;
case8:
system("cls");
Output(LA,LB,LC);
system("cls");
break;
case0:
system("cls");
printf("\n\n\n\n\n\n\n\n\t\t\t\t谢谢使用\n\n\n\n\n\n\n\n\n\n\n\n");
break;
}
}
}
StatusInitList(SqList&L,intsize)
{
L.elem=(ElemType*)malloc(size*sizeof(ElemType));
if(!
L.elem)
exit(OVERFLOW);
L.length=0;
L.listsize=size;
returnOK;
}
StatusGetElem(SqListL,inti,ElemType&e)
{
if(i<1||i>L.length)
returnERROR;
e=L.elem[i-1];
returnOK;
}
voidPriorElem(SqListLA,SqListLB)
{
inta;
printf("\n\n");
printf("\t\t\t主菜单\n\n");
printf("\t\t-------------------------------------\n\n");
printf("\t\t\t1——输出LA中元素的前驱\n\n");
printf("\t\t\t2——输出LB中元素的前驱\n\n");
printf("\t\t\t3——退出\n");
scanf("%d",&a);
switch(a)
{
case1:
system("cls");
Prior_LElem(LA,flag1);
system("cls");
break;
case2:
system("cls");
Prior_LElem(LB,flag2);
system("cls");
break;
case3:
system("cls");
break;
}
}
voidPrior_LElem(SqListL,intFlag)
{
inta,e,i,flag=0;
if(L.length==0)
printf("线性表已被置空");
elseif(Flag==0)
printf("线性表已被销毁");
else
{
printf("请输入输出前驱的元素:
");
G:
scanf("%d",&a);
for(i=1;i<=L.length;i++)
{
GetElem(L,i,e);
if(a==e)
{
flag=1;
if(i==1)
{
printf("\n\n元素%d没有前驱",a);
break;
}
GetElem(L,i-1,e);
printf("\n\n元素%d的前驱是:
%d",a,e);
}
}
if(flag==0)
{
printf("\n\n你输的数据不在线性表中,请重新输入:
");
gotoG;
}
}
printf("\n\n\n\n\n\n按Enter键→");
getchar();getchar();
}
voidNextElem(SqListLA,SqListLB)
{
inta;
printf("\n\n");
printf("\t\t\t主菜单\n\n");
printf("\t\t-------------------------------------\n\n");
printf("\t\t\t1——输出LA中元素的后继\n\n");
printf("\t\t\t2——输出LB中元素的后继\n\n");
printf("\t\t\t3——退出\n");
scanf("%d",&a);
switch(a)
{
case1:
system("cls");
Next_LElem(LA,flag1);
system("cls");
break;
case2:
system("cls");
Next_LElem(LB,flag2);
system("cls");
break;
case3:
system("cls");
break;
}
}
voidNext_LElem(SqListL,intFlag)
{
inta,e,i,flag=0;
if(L.length==0)
printf("线性表已被置空");
elseif(Flag==0)
printf("线性表已被销毁");
else
{
printf("请输入输出后继的元素:
");
I:
scanf("%d",&a);
for(i=1;i<=L.length;i++)
{
GetElem(L,i,e);
if(a==e)
{
flag=1;
if(i==L.length)
{
printf("\n\n元素%d没有后继",a);
break;
}
GetElem(L,i+1,e);
printf("\n\n元素%d的后继是:
%d",a,e);
}
}
if(flag==0)
{
printf("\n\n你输的数据不在线性表中,请重新输入:
");
gotoI;
}
}
printf("\n\n\n\n\n\n按Enter键→");
getchar();getchar();
}
voidListInsert(SqList&LA,SqList&LB)
{
inta;
printf("\n\n");
printf("\t\t\t主菜单\n\n");
printf("\t\t-------------------------------------\n\n");
printf("\t\t\t1——在LA中插入元素\n\n");
printf("\t\t\t2——在LB中插入元素\n\n");
printf("\t\t\t3——退出\n");
scanf("%d",&a);
switch(a)
{
case1:
system("cls");
ListInsert_L(LA,flag1);
system("cls");
break;
case2:
system("cls");
ListInsert_L(LB,flag2);
system("cls");
break;
case3:
system("cls");
break;
}
}
voidListInsert_L(SqList&L,intFlag)
{
inta,b,i,*p,*q;
if(Flag==0)
printf("线性表已被销毁");
else
{
if(L.length==0)
{
printf("请在线性表中输入数据,输入0结束(0不作为线性表中的数据)\n");
for(i=0;i{
scanf("%d",&L.elem[i]);
if(L.elem[i]==0)
break;
L.length++;
}
}
elseif(L.length>0&&L.length{
printf("请输入要插入的数据:
");
A:
scanf("%d",&a);
for(i=0;i{
if(a==L.elem[i])
{
printf("\n数据%d已存在线性表中,请重新输入:
",a);
gotoA;
}
}
printf("\n请输入要插入的位置:
(1~%d)",L.length);
B:
scanf("%d",&b);
if(b>L.length||b<1)
{
printf("\n\n你输入的位置有误\n请重新输入:
");
gotoB;
}
q=&(L.elem[b-1]);
for(p=&(L.elem[L.length-1]);p>=q;--p)
*(p+1)=*p;
*q=a;
++L.length;
printf("\n数据%d已插入到线性表中",a);
}
else
printf("线性表已存满");
}
}
voidListDelete(SqList&LA,SqList&LB)
{
inta;
printf("\n\n");
printf("\t\t\t主菜单\n\n");
printf("\t\t-------------------------------------\n\n");
printf("\t\t\t1——删除LA中的元素\n\n");
printf("\t\t\t2——删除LB中的元素\n\n");
printf("\t\t\t3——退出\n");
scanf("%d",&a);
switch(a)
{
case1:
system("cls");
Delete_LElem(LA,flag1);
system("cls");
break;
case2:
system("cls");
Delete_LElem(LB,flag2);
system("cls");
break;
case3:
system("cls");
break;
}
}
voidDelete_LElem(SqList&L,intFlag)
{
inta,*p,*q,flag=0,i;
if(L.length==0)
printf("线性表已被置空");
elseif(Flag==0)
printf("线性表已被销毁");
else
{
printf("请输入要删除的数据:
");
E:
scanf("%d",&a);
for(i=0;i{
if(a==L.elem[i])
{
flag=1;
break;
}
}
if(flag==0)
{
printf("\n数据%d不在线性表中,请重新输入:
",a);
gotoE;
}
p=&(L.elem[i]);
q=L.elem+L.length-1;
for(++p;p<=q;++p)
*(p-1)=*p;
--L.length;
printf("第%d个元素%d已被删除\n",i+1,a);
printf("\n\n\n按Enter键→");
getchar();getchar();
}
}
voidClearList(SqList&LA,SqList&LB)
{
inta;
printf("\n\n");
printf("\t\t\t主菜单\n\n");
printf("\t\t-------------------------------------\n\n");
printf("\t\t\t1——将LA置为空表\n\n");
printf("\t\t\t2——将LB置为空表\n\n");
printf("\t\t\t3——将LA和LB置为空表\n\n");
printf("\t\t\t4——退出\n");
scanf("%d",&a);
switch(a)
{
case1:
system("cls");
LA.length=0;
printf("已将LA表置为空表\n");
printf("\n\n\n按Enter键→");
getchar();getchar();
system("cls");
break;
case2:
system("cls");
LB.length=0;
printf("已将LB表置为空表\n");
printf("\n\n\n按Enter键→");
getchar();getchar();
system("cls");
break;
case3:
system("cls");
LA.length=0;
LB.length=0;
printf("已将LA和LB表置为空表\n");
printf("\n\n\n按Enter键→");
getchar();getchar();
system("cls");
break;
case4:
system("cls");
break;
}
}
voidDestoryList(SqList&LA,SqList&LB,SqList&LC)
{
inta;
printf("\n\n");
printf("\t\t\t主菜单\n\n");
printf("\t\t-------------------------------------\n\n");
printf("\t\t\t1——删除LA表\n\n");
printf("\t\t\t2——删除LB表\n\n");
printf("\t\t\t3——删除LA和LB表\n\n");
printf("\t\t\t4——退出\n");
scanf("%d",&a);
switch(a)
{
case1:
system("cls");
free(LA.elem);
flag1=0;
printf("已删除LA表\n");
printf("\n\n\n按Enter键→");
getchar();getchar();
system("cls");
break;
case2:
system("cls");
free(LB.elem);
flag2=0;
printf("已删除LB表\n");
printf("\n\n\n按Enter键→");
getchar();getchar();
system("cls");
break;
case3:
system("cls");
free(LA.elem);
flag1=0;
free(LB.elem);
flag2=0;
printf("已删除LA和LB表\n");
printf("\n\n\n按Enter键→");
getchar();getchar();
system("cls");
break;
case4:
system("cls");
break;
}
}
voidMergeList(SqListLA,SqListLB,SqList&LC)
{
int*pa,*pb,*pc,*pa_last,*pb_last;
pa=LA.elem;
pb=LB.elem;
pc=LC.elem;
pa_last=LA.elem+LA.length-1;
pb_last=LB.elem+LB.length-1;
while(pa<=pa_last&&pb<=pb_last)
{
if(*pa<*pb)
{
*pc++=*pa++;
LC.length++;
}
elseif(*pa==*pb)
{
*pc++=*pa++;
pb++;
LC.length++;
}
else
{
*pc++=*pb++;
LC.length++;
}
}
while(pa<=pa_last)
{
*pc++=*pa++;
LC.length++;
}
while(pb<=pb_last)
{
*pc++=*pb++;
LC.length++;
}
printf("已将LA和LB合并到LC中");
printf("\n\n\n按Enter键→");
getchar();getchar();
system("cls");
}
voidOutput(SqListLA,SqListLB,SqListLC)
{
inta,b,c,d,i;
printf("\n\n");
printf("\t\t\t主菜单\n\n");
printf("\t\t-------------------------------------\n\n");
printf("\t\t\t1——输出LA表\n\n");
printf("\t\t\t2——输出LB表\n\n");
printf("\t\t\t3——输出LC表\n\n");
printf("\t\t\t4——输出LA、LB和LC表\n\n");
printf("\t\t\t5——退出\n");
scanf("%d",&a);
switch(a)