线性表之顺序表操作
求后继是指:输入一个元素值(而不是位置),求该元素在顺序表中的直接后继元素值。
注意:对每个功能进行测试时,要求把不合法的情况也测试一下。具体见下面的测试用例。
(3)验收/测试用例
通过菜单调用各个操作,测试点:
⦁ 没有初始化前进行其他操作,程序是否能控制住;即,如果没有初始化线性表,其他的功能是无法正常进行的,如果选择进行其他操作,要提示先进行初始化;
⦁ 初始化一个顺序表(初始化顺序表,是指初始化一个空的线性表,里面的元素个数是0);
⦁ 插入数据(位置, 数据),要测插入位置不合法的情况(0,1)、(2,1),正确插入3个数据(1,20)、(1,10)、(3,30);
⦁ 显示顺序表中的数据,屏幕输出10, 20, 30;
⦁ 判空,屏幕输出顺序表非空;
⦁ 输出顺序表长度,屏幕输出3;
⦁ 获取指定位置元素,要测指定位置在【1,3】范围之外的情况和之内的情况;
⦁ 定位,输入:40, 输出:不存在,输入20,输出位置为2;
⦁ 求直接前驱,要测求第一个元素的前驱、不存在顺序表中的元素的直接前驱,其他元素的直接前驱;输入10,输出:第一个元素没有前驱,输入20,输出前驱是10,输入40,输出该元素不存在;
⦁ 求直接后继,要测最后一个元素的后继、不存在顺序表中的元素的直接后继,其他元素的直接后继;同上求前驱;
⦁ 删除,要测位置在【1,3】范围之外的情况和之内的情况;
⦁ 清空操作后再测长度,判断是否为空;
⦁ 销毁顺序表,销毁线性表之后还能不能做插入,删除等操作,如果选其他操作,就要提示线性表已经销毁不存在;
⦁ 测试合并操作,第一个线性表中的元素是(2,3,4,5),第二个线性表中的内容是(1,4,6,7,8,9),合并后的结果,请输出。
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT 100
#define LISTINCREMENT 10
#define ERROR 0
#define OK 1
typedef int status ;
typedef int ElemType;
typedef struct{
ElemType *elem;
int length;
int listsize;
}list;
void mnue();
status intlist(list &); //1
void destroylist(list &); //2
void clearlist(list &); //3
status listempty (list &p); //4
status listlength(list &p); //5
status getelem(ElemType,list &p); //6
status listlocal(ElemType,list &p); //7
status priorelem(ElemType,list &p); //8
status nextelem(ElemType , list &p); //9
status listinsert(ElemType,status,list &p);//10
void listdelete(ElemType,list &p); //11
void listvisit(list &p); //12
void listsum(list,list,list&); //13
int main()
{
list l;
l.elem=NULL;
int select,m,n,i;
int charu;
while(1)
{
mnue();
printf("\n请输入你的选择是:\n");
scanf("%d",&select);
if(select>14)
printf(“输入不合法,请重试。\n”);
else if(select<=0)
{
printf(“已退出!\n”);
return 0;
}
else if(select>0)
{
switch(select)
{
case 1:
m=intlist(l);
if(m= =0) printf(“创建失败。\n”);
else printf(“创建成功。\n”);
break;
case 2:
destroylist(l);
break;
case 3:
clearlist(l);
printf(“清空完成。\n”);
break;
case 4:
m=listempty(l);
if(m==0) printf(“线性表为空。\n”);
else printf(“线性表不为空。\n”);
break;
case 5:
m=listlength(l);
printf(“线性表的长度为%d。\n”,m);
break;
case 6:
printf(“输入想获取的元素位置:\n”);
scanf("%d",&m);
n=getelem(m,l);
printf(“元素为%d:\n”,n);
break;
case 7:
printf(“输入想查询的元素:\n”);
scanf("%d",&m);
n=listlocal(m,l);
printf(“元素位置为%d:\n”,n);
break;
case 8:
printf(“输入元素:\n”);
scanf("%d",&m);
n=priorelem(m,l);
printf(“元素前驱为%d:\n”,n);
break;
case 9:
printf(“输入元素:\n”);
scanf("%d",&m);
n=nextelem(m, l);
printf(“元素后继为%d:\n”,n);
break;
case 10:
printf(“输入元素、位置:\n”);
scanf("%d %d",&m,&n);
charu= listinsert(m,n,l);
break;
case 11:
printf(“所需删除元素:\n”);
scanf("%d",&m);
listdelete(m,l);
break;
case 12:
listvisit(l);
break;
case 13:
list La;list Lb;list L;
La.elem=(ElemType )malloc(4sizeof(ElemType));
Lb.elem=(ElemType )malloc(4sizeof(ElemType));
L.elem=(ElemType )malloc(8sizeof(ElemType));
printf(“输入la的4个元素:\n”);
for(i=0;i<4;i++)
{
scanf("%d",&La.elem[i]);
}
printf(“输入lb的4个元素:\n”);
for(i=0;i<4;i++)
{
scanf("%d",&La.elem[i]);
}
listsum(La,Lb,L);
break;
}
}
}
return 0;
}
void mnue()
{
printf(“1-----初始化一个线性表\n”);
printf(“2-----销毁线性表\n”);
printf(“3-----清空线性表\n”);
printf(“4-----判断线性表是否为空\n”);
printf(“5-----求线性表长度\n”);
printf(“6-----获取线性表中指定位置元素\n”);
printf(“7-----获取线性表元素的位置\n”);
printf(“8-----求前驱\n”);
printf(“9-----求后继\n”);
printf(“10-----线性表指定位置插入元素\n”);
printf(“11-----删除线性表指定位置元素\n”);
printf(“12-----显示线性表\n”);
printf(“13-----合并两个非递减有序的线性表\n”);
printf(“14-----退出,输入一个负数\n”);
}
status intlist(list &p) //1
{
p.elem=(ElemType )malloc(LIST_INITsizeof(ElemType));
if(!p.elem) return ERROR;
p.length=0;
p.listsize=LIST_INIT;
return OK;
}
void destroylist(list &p) //2
{
free(p.elem);
p.length=0;
p.listsize=0;
p.elem=NULL;
printf(“销毁完成。\n”);
}
void clearlist(list &p) //3
{
p.length=0;
}
status listempty (list &p)//4
{
if(p.length= =0)
return ERROR;
else return OK;
}
status listlength(list &p)//5
{
return p.length;
}
status getelem(ElemType m,list &p)//6
{
if(m<0||m>=p.length)
printf(“不在长度范围内请再次输入:\n”);
return p.elem[m-1];
}
status listlocal(status m,list &p)//7
{
for (int i=0;i<p.length;i++)
{
if(m= =p.elem[i])
return i;
}
printf(“没有此元素,不好意思请再次输入:\n”);
return 0;
}
status priorelem(ElemType m,list &p)//8
{
for (int i=0;i<p.length;i++)
{
if((m= =p.elem[i])&&i= =0)
printf(“此元素没有前驱,请再次输入:\n”);
if(m= =p.elem[i])
return p.elem[i-1];
}
printf(“没有此元素,不好意思请再次输入:\n”);
return 0;
}
status nextelem(ElemType m, list &p)//9
{
for (int i=0;i<p.length;i++)
{
if((m = =p.elem[i]) & & i= =p.length)
printf(“此元素没有后继,请再次输入:\n”);
if(m= =p.elem[i])
return p.elem[i+1];
}
printf(“没有此元素,不好意思请再次输入:\n”);
return 0;
}
status listinsert(ElemType m,ElemType n,list &p) //10
{
if(n<0||n>p.length+1)
{
printf(“不在长度范围内请再次输入。\n”);
return ERROR;
}
if(p.length>=p.listsize)
{
p.elem=(ElemType *)realloc(p.elem,(p.listsize+LISTINCREMENT)*sizeof(ElemType)) ;
if(!p.elem)
{
printf(“再次申请线性表失败!\n”);
return ERROR;
}
p.listsize+=LISTINCREMENT;
}
p.elem[p.length]=m;
++p.length;
printf(“插入完成,完美,是我心中的大佬。\n”);
return OK;
}
void listdelete(ElemType m,list &p)
{
for (int i=0;i<p.length;i++)
{
if(m==p.elem[i])
{
p.elem[i]=p.elem[i+1];
}
else
{
printf(“没有此元素,请再次输入:\n”);
}
printf(“删除成功!\n”);
}
}
void listvisit(list &p)
{
printf(“此线性表为:\n”);
for (int i=0;i<p.length;i++)
{
printf("%d \n",p.elem[i]);
}
–p.length;
}
void listsum(list La,list Lb,list &Lc)
{
int i;int j;
list pa;list pb;list pc;
pa.elem=(ElemType )malloc(4sizeof(ElemType));
pb.elem=(ElemType )malloc(4sizeof(ElemType));
pa.elem=La.elem;
pb.elem=Lb.elem;
Lc.listsize=La.length+Lb.length;
Lc.length=La.length+Lb.length;
pc.elem=Lc.elem;
pc.elem=(ElemType )malloc(Lc.listsizesizeof(ElemType));
if(!pc.elem)
printf(“创建lc线性表失败!”);
for(i=0;i<pa.length;i++)
{
pc.elem[i]=pa.elem[i];
}
for(i=pa.length,j=0;i<pc.length,j<pb.length;i++,j++)
{
pc.elem[i]=pb.elem[j];
}
printf(“合并线性表成功.”);
}