说完了插入再来删除,所谓删除就是将表中的第i个元素删去使得长度为n的线性表变为长度为n-1的线性表
例:删除顺序表(1,2,3,4,5)中的第3个元素,需要将第四到第五个元素往前移一个位置具体操作如下图所示
先是移动前的顺序表
然后移动4和5,4会将3覆盖也就达到了想要的删除效果
因为移动后原来5的位置会空出来一位,我们要将长度减1,也就是last要减少1
了解了思路,现在我们就可以来编写删除函数辣
void dellist(seqlist *l,int land)
{
//先判断删除的位置是否合法
if(land<1||land>l->last+1)
{
//这里的判断条件和插入的有一些不同,可以看见这里的last是加1的
//插入的时候合法范围是1到last+2,这里last+2指的是要插入到原表的表尾下一个的位置数(注意是位置数而不是下标值)
//删除的时候合法范围是 1到last+1,这里为什么不写加2,因为加2表示的是原表表尾下一个的位置数,但我们删除根本不会有这种操作
//所以只需要到表尾就可以了
printf("删除的位置有误\n");
return;
}
for(int i=land-1;i<l->last;i++)
{
l->elem[i]=l->elem[i+1];
}
l->last--;
}
主函数
int main()
{
int j;
seqlist *l;
l=&n;
int data;
for(j=0;j<5;j++)
{
printf("输入第%d个初始数据:",j+1);
scanf("%d",&data);
l->elem[j]=data;
}
l->last=j-1;//这里的j-1就是顺序表里最后一个元素的下标值,注意是下标值
int land;//land是用来代表删除第几个位置,注意land是第几个位置,不是下标值
printf("输入你要删除的位置\n");
scanf("%d",&land);
dellist(l,land);
printlist(l);
}
整体代码
#include <stdio.h>
#define MAXSIZE 10
struct seqlist
{
int elem[MAXSIZE];//这里我们拿整型数组来作示范
int last;//last用来记录表中最后一个元素的下标值,注意是下标值,所以我们初始化的时候last从-1开始取
}n;
void dellist(seqlist *l,int land)
{
//先判断删除的位置是否合法
if(land<1||land>l->last+1)
{
//这里的判断条件和插入的有一些不同,可以看见这里的last是加1的
//插入的时候合法范围是1到last+2,这里last+2指的是要插入到原表的表尾下一个的位置数(注意是位置数而不是下标值)
//删除的时候合法范围是 1到last+1,这里为什么不写加2,因为加2表示的是原表表尾下一个的位置数,但我们删除根本不会有这种操作
//所以只需要到表尾就可以了
printf("删除的位置有误\n");
return;
}
for(int i=land-1;i<l->last;i++)
{
l->elem[i]=l->elem[i+1];
}
l->last--;
}
//此处为打印函数是用来检验的
void printlist(seqlist *l)
{
for(int i=0;i<=l->last;i++)
{
printf("第%d个元素为%d\n",i+1,l->elem[i]);
}
}
int main()
{
int j;
seqlist *l;
l=&n;
int data;
for(j=0;j<5;j++)
{
printf("输入第%d个初始数据:",j+1);
scanf("%d",&data);
l->elem[j]=data;
}
l->last=j-1;//这里的j-1就是顺序表里最后一个元素的下标值,注意是下标值
int land;//land是用来代表删除第几个位置,注意land是第几个位置,不是下标值
printf("输入你要删除的位置\n");
scanf("%d",&land);
dellist(l,land);
printlist(l);
}
进行运行测试
我们输入初始数据1,2,3,4,5
运行结果图为
然后我们输入要删除第几个位置的元素
输入删除第三个位置的元素
发现打印出删除后的结果为1,2,4,5是正确的