🧗♂️本专栏将不断更新数据结构相关的代码演示,喜欢可以关注一下作者。 🛹本文是对数据结构的顺序表的删除指定若干个元素算法的演示。
书本上中的DeleteK算法是
Status DeleteK(SqList&a,int i ,int k){
if(i<1||k<0||i+k>a.length)return INFEEASIBLE;
else{
for(count = 1;count<k;count++){
//删除一个元素
for(j = a.length;j>=i+1;j--){
a.elem[j-1] = a.elem[j];
}
a.length--;
}
}
return OK;
}本文的主要目的是修改书本上的代码,因为书中要求的是修改代码。
1.代码存在逻辑错误,即算法的设计思路不能完美实现删除的需求。 2.算法的效率很低,会浪费很多的时间。
for(count = 1;count<k;count++){
//删除一个元素
for(j = a.length;j>=i+1;j--){
a.elem[j-1] = a.elem[j];
}
a.length--;
}a.elem[j-1] = a.elem[j] //算法出错的位置
假定我们初始的顺序表中的元素为 1 2 3 4 5 DeleteK函数中传递的参数为DeleteK(L,1,2)
得到的初始顺序表如下

第一步count = 1,执行for循环操作后,顺序表就长成了这样,再接着执行for循环的操作的话,我们

期望得到的是,这样的一个顺序表

但是实际上得到的是这样子的一个顺序表。原因是为什么呢?请读者自己思考哦!😂😂😂😂

我们先来测试一下,来证明我们所说的没有问题。 输入一个1 2 3 4 5,得到一个顺序表1 2 3 4 5 输入想要删除的第i个元素的后k个元素,i,k。 输出最后的顺序表,如图所示

Status DeleteK(SqList &a,int i ,int k){
//本过程中顺序存储结构的线性表a中删除第i个元素起的k个元素
if(i<1||k<0||i+k>a.length)return INFEASIBLE;//参数不合法
else{
int j = i+k-1;
for(i;i<=j;i++){
//删除第一个元素
a.elem[i] = a.elem[i+k];
}
a.length = a.length-k;
}
return OK;
} 全部代码
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define INFEASIBLE -1
#define OVERFLOW -2
#define ERROR 0
#define OK 1
typedef int ElemType;
typedef int Status;
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct {
ElemType *elem; //存储空间基址
int length; //当前长度
int listsize; //当前分配的存储容量
}SqList; //顺序表类型
Status InitList_Sq(SqList &L){
//构造一个空的线性表
L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem)exit(OVERFLOW); //存储分配失败
L.length = 0; //空格长度为0
L.listsize = LIST_INIT_SIZE; //初始存储容量
return OK;
} //InitList_Sq
Status DeleteK(SqList &a,int i ,int k){
//本过程中顺序存储结构的线性表a中删除第i个元素起的k个元素
if(i<1||k<0||i+k>a.length)return INFEASIBLE;//参数不合法
else{
int j = i+k-1;
for(i;i<=j;i++){
//删除第一个元素
a.elem[i] = a.elem[i+k];
}
a.length = a.length-k;
}
return OK;
}
int main(){
SqList L;
InitList_Sq(L);
int n;
int x;
int k;
printf("请输入链表的长度");
scanf("%d",&n);
printf("请输入链表中的元素:");
for(int i = 0;i<n;i++){
scanf("%d",&L.elem[i]);
L.length++;
}
printf("初始化L的长度%d\n",L.length);
printf("请输入你想要删除的是第几个元素之后的多少个元素");
scanf("%d %d",&x,&k);
DeleteK(L,x,k);
for(int i = 0;i<n;i++){
printf("%d ",L.elem[i]);
}
printf("删除后L的长度%d\n",L.length);
for(int i = 0;i<L.length;i++){
printf("%d ",L.elem[i]);
}
}顺序表实际上就类似于c语言的数组,通过本文的学习,学会了制作一个简单的算法来正确删除指定位置的元素。希望你可以学到哦