【问题描述】线性表L采用顺序存储结构sqlist,实现线性表删除元素操作:
函数原型:status listdelete(sqlist &l,int i,elemtype &e)
初始条件:线性表l已经存在,1<=i<=listlength(l)。
操作结果:删除线性表第i个元素,并用e返回其值;线性表长度减1。
int main()
{
sqlist l;int i;elemtype e;
initlist(l);
inputlist(l);
scanf("%d",&i);
if(listdelete(l,i,e)) listtraverse(l);
else printf("error");
destroylist(l);
return 0;
}
【输入形式】第1行:整型数据n,表示线性表的长度;
第2行:n个整型数据,表示线性表的n个元素;
第3行:整型数据i,表示删除素数的位序;
【输出形式】
执行正确:
第1行:输出线性表长度;
第2行:输出线性表元素;
执行失败:输出"error";
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define error 0
#define ok 1
typedef int status;
#define listinitsize 100
#define listincrement 10
typedef char elemtype;
typedef struct{
elemtype *elem;
int length;
int listsize;
}sqlist ;
status initlist(sqlist &l)//构造一个空的线性表L
{
l.elem=(elemtype *)malloc(listinitsize*sizeof(elemtype));
if(!l.elem) exit(error);//存储分配失败
l.length=0;
l.listsize=listinitsize;//初始存储容量
return ok;
}
//顺序表实验4个辅助函数:
status inputlist(sqlist &l)//顺序表输入
{ int i,n;
//printf("please input the length of the sqlist:");
scanf("%d",&n);//n个元素
l.length=n;
//printf("please input the data of the sqlist:");
for (i=0;i<=l.length-1;i++) scanf("%d",&l.elem[i]);//输入n个元素
return ok;
}
status listtraverse(sqlist l)//顺序表输出
{ int i;
//printf("the length of the sqlist:");
printf("%d\n",l.length);
// printf("the data of the sqlist:");
for (i=0;i<=l.length-1;i++) printf("%d ",l.elem[i]);
printf("\n");
return ok;
}
status destroylist(sqlist &l)//顺序表撤销
{ free(l.elem);
l.length=0;
l.listsize=0;
return ok;
}
status clearlist(sqlist &l)//顺序表重置
{
l.length=0;
return ok;
}
status listdelete(sqlist &l,int i,elemtype &e)
{
int j;
if(1<=i<l.length)//i=3,n=5
{
for(j=i-1;j<l.length-1;j++)//j=2
l.elem[j]=l.elem[j+1];
l.length--;return ok;
}
else return error;
}
int main()
{
sqlist l;int i;elemtype e;
initlist(l);
inputlist(l);
scanf("%d",&i);
if(listdelete(l,i,e)) listtraverse(l);
else printf("error");
destroylist(l);
return 0;
}