数组(顺序表)中插入/删除一个数

插入的大体思路:将数组从最后一个数到需要插入的位置 一直往后移一个位置 再将这个数插入即可
 

#include<stdio.h>
#define max 10
typedef struct {
	int date[max];//表示出这个需要操作的数组
	int length;//用其表示数组的长度
}sqlist;
void listinsert(sqlist &l,int i ,int e)//将e插入顺序表第i个位置
{
	for (int k = l.length; k >= i; k--)//及那个i及i个位置后面的数往后推一个  注意:从最后一个数开始  否则可能会导致覆盖
		l.date[k ] = l.date[k-1];//注意位置   位序和下标的关系
	l.date[i-1] = e;//给空出来的位置赋值
	l.length++;//数组的长度加1
}
void initlist(sqlist &l)
{
	l.length = 5;//先给出长度
	for (int i = 1; i < l.length; i++)
	{
		l.date[i-1] = i;//给顺序表中数组赋值
	}
	
}
int main()
{
	sqlist l;//建立一个顺序表l
	initlist(l);//给顺序表赋初值
	listinsert(l, 2, 5);//将5插入第二个位置    注意:第二个位置在数组中的表达是l.date[1]
	for (int i = 0; i <= l.length; i++)
		printf("%d\n", l.date[i]);
	return 0;
}

同时,为了增加使用的健壮性,我们可以使用一个bool型的函数

若输入i不符合条件 反馈false    符合条件  反馈true

#include<stdio.h>
#define max 10
typedef struct {
	int date[max];//表示出这个需要操作的数组
	int length;//用其表示数组的长度
}sqlist;
bool listinsert(sqlist& l, int i, int e)//将e插入顺序表第i个位置
{
	if (i<1 || i>l.length)
		return false;//顺序表 必须按序插入  即只有4个元素的情况下  若想插入到第8个位置是无效的  这样就会有空值出现
	if (l.length >= max)
		return false;//如果数组长度太大 也是不行的
	for (int k = l.length; k >= i; k--)//及那个i及i个位置后面的数往后推一个  注意:从最后一个数开始  否则可能会导致覆盖
		l.date[k] = l.date[k - 1];//注意位置   位序和下标的关系
	l.date[i - 1] = e;//给空出来的位置赋值
	l.length++;//数组的长度加1
	return true;//可行操作下 反馈true
}
void inlist(sqlist& l)
{
	l.length = 5;//先给出长度
	for (int i = 1; i < l.length; i++)
	{
		l.date[i - 1] = i;//给顺序表中数组赋值
	}

}
int main()
{
	sqlist l;//建立一个顺序表l
	inlist(l);//给顺序表赋初值
	if(listinsert(l, 2, 5))//将5插入第二个位置    注意:第二个位置在数组中的表达是l.date[1]
	for (int i = 0; i <= l.length; i++)
		printf("%d\n", l.date[i]);
	return 0;
}

练习:参考数组增加一个数,尝试编码 删除数组中的一个数

提示:

同数组增加数一样  不过有一些小小的变化  数组的增加数是将数组的最后一个数往后移动 直到需要增加的这个数 。
而这里 数组的减小 在于将i的后一个数向前一个覆盖  还有&e可以确保将删除的值传回来  有一个可视性。

代码如下:

#define max 10
#include<stdio.h>
typedef struct {
	int date[max];
	int length;
}sqlist;
bool listdelete(sqlist &l,int i,int &e)
{
	if (i > l.length || i < 1)
		return false;
	int k;
	e = l.date[i];//记录删除值
	for (k = i - 1; k < l.length - 1; k++)
		l.date[k] = l.date[k + 1];
	l.length--;
	return true;
}
void inlist(sqlist& l)
{
	l.length = 5;
	for (int i = 0; i < l.length; i++)
		l.date[i] = i;
}
int main()
{
	sqlist l;
	int e = -1;
	inlist(l);
	if (listdelete(l, 3, e))
		printf("删除值为%d", e);
	else printf("失效值");
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值