前面讲了关于顺序表的查找,这篇文章将讨论顺序表的插入与删除
首先来看看插入操作,
在第i个位置插入一个新元素,使长度为n的线性表变为长度为n+1的线性表
我们在前一篇文章结尾谈到插入与删除需要移动大量的元素,其实就是移动原表的一些位置的结点(在顺序表的末尾插入无须移动结点,直接插入即可)
例:已知顺序表(1,2,3,4,5)需在第4个元素之前插入一个元素6,则需将第5个位置到第4个位置依次往后移动一个位置,然后将元素6插入到第4个位置
以下为操作示意图
移动之前的顺序表
移动过后的顺序表
插入元素6之后
接下来是我写的插入元素的函数
void inslist(seqlist *l,int number,int land)
{
//先判断 插入的位置是否合法,这里的land表示的是第几个位置而不是下标
if(land>l->last+2||land<1)//这里l->last+2的原因是last是从-1开始取的
{
printf("插入的位置不合法\n");
return;
}
//然后判断表是否已经满了
if(l->last>MAXSIZE-1)
{
printf("表格已经满了,无法插入\n");
return;
}
//然后进行移动
for(int i=l->last;i>=land-1;i--)
{
l->elem[i+1]=l->elem[i];
}
l->last++;
//完成后就把元素6插入
l->elem[land-1]=number;
}
主函数
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;
int number;
int land;
printf("输入你要插入的数字\n");
scanf("%d",&number);
printf("输入你要插入的位置\n");
scanf("%d",&land);
inslist(l,number,land);
printlist(l);
}
下面是整体的代码
#include <stdio.h>
#define MAXSIZE 10
struct seqlist
{
int elem[MAXSIZE];//这里我们拿整型数组来作示范
int last;//last用来记录表中最后一个元素的下标值,注意是下标值,所以我们初始化的时候last从-1开始取
}n;
void inslist(seqlist *l,int number,int land)
{
//先判断 插入的位置是否合法,这里的land表示的是第几个位置而不是下标
if(land>l->last+2||land<1)//这里l->last+2的原因是last是从-1开始取的
{
printf("插入的位置不合法\n");
return;
}
//然后判断表是否已经满了
if(l->last>MAXSIZE-1)
{
printf("表格已经满了,无法插入\n");
return;
}
//然后进行移动
for(int i=l->last;i>=land-1;i--)
{
l->elem[i+1]=l->elem[i];
}
l->last++;
//完成后就把元素6插入
l->elem[land-1]=number;
}
//此处为打印函数是用来检验的
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;
int number;
int land;
printf("输入你要插入的数字\n");
scanf("%d",&number);
printf("输入你要插入的位置\n");
scanf("%d",&land);
inslist(l,number,land);
printlist(l);
}
接着我们来运行一下,输入初始数据1,2,3,4,5
然后我们插入6这个元素,插入到第4个位置,然后用来检验的printlist函数就把插入之后的表的内容全部打印出来了