【问题描述】
实现可变长顺序表的删除算法。任务要求:通过顺序表的初始化、插入算法,创建顺序表。根据删除需求,删除指定的顺序表元素。
【输入形式】
第一行输入整数N(1<=N<=100),M(1<=M<=100);N表示创建长度为N的顺序表;M表示执行M次删除操作。
第二行输入N个整数,表示顺序表的N个元素,依次放入表中;
接着输入M个整数,表示欲删除元素的位序。如如输入3,表示删除顺序表的第3个元素。
【输出形式】
输出执行M次删除后的顺序表元素。(若有删除位置不合法的,输出1个0)
【样例输入1】
5 2
11 22 33 44 55
1
4
【样例输出1】
22 33 44
【样例输入2】
8 3
10 20 30 40 50 60 70 80
9
4
0
【样例输出2】
0
0
10 20 30 50 60 70 80
删除算法和插入算法一样,时间主要消耗在元素的移动。最好的情况是删除位置在顺序表尾,不用移动元素;最坏的情况是删除位置在顺序表首部,需要移动 n-1个元素;
下面是删除算法的实现:
int deleteSq(Sqlist *L,int i)
{
if(i<0||i>L->length-1)return 0;
int j;
for(j=i;jlength-1;j++)
{
L->slist[j]=L->slist[j+1];
}
L->length--;
return 1;
}
最后完整代码的实现及运行结果检查:
#include#include #define INIT_SIZE 5 #define INCREM 3 typedef int ElemType; typedef struct Sqlist{ ElemType *slist; int length; int listsize; }Sqlist; int initSq(Sqlist *L) { L->slist=(ElemType*)malloc(INIT_SIZE*sizeof(ElemType)); if(!L->slist)return 0; L->length=0; L->listsize=INIT_SIZE; return 1; } int insertSq(Sqlist *L, ElemType e, int i) { if(i<0||i>L->length+1)return 0; if(L->length+1>L->listsize) { L->slist=(ElemType*)realloc(L->slist,(L->listsize+INCREM)*sizeof(ElemType)); if(!L->slist)return 0; L->listsize+=INCREM; } int j; for(j=L->length;j>i;j--) { L->slist[j]=L->slist[j-1]; } L->slist[i]=e; L->length++; return 1; } void printSq(Sqlist *L) { int i; for(i=0;i length;i++) { printf("%d ",L->slist[i]); } printf("n"); } int deleteSq(Sqlist *L,int i) { if(i<0||i>L->length-1)return 0; int j; for(j=i;j length-1;j++) { L->slist[j]=L->slist[j+1]; } L->length--; return 1; } int main() { Sqlist sq; ElemType e; int n,m; if(initSq(&sq)){ scanf("%d%d",&n,&m); int i,j; for(i=0;i 运行结果:



