C语言:线性顺序结构(数组)的插入,删除


/*
	线性表的插入,删除
*/

# include <stdio.h>
# include <malloc.h>

# define INCRE_SIZE 2  //线性表空间增量
 
//定义线性表类型
typedef struct
{
	int * ele; //线性空间基址
	int length;  //当前有效元素个数
	int initsize;  //空间大小
}SqList;

SqList create_list();  //创建线性空间
void traverse(SqList s);  //遍历元素
void insert(SqList &s, int pos, int e);  //在第pos个位置插入元素e
void del(SqList &s, int pos, int * val);  //删除第pos个位置元素

int main(void)
{
	int val;

	SqList s = create_list();
	traverse(s);

	//在线性表的第i个位置前插入元素e
	printf("在第3个位置上插入5\n");
	insert(s, 3, 5);
	traverse(s);

	//删除线性表的第i个元素
	printf("删除第1个元素\n");
	del(s, 1, &val);
	printf("删除的元素为 %d\n", val);
	traverse(s);

	return 0;
}

//创建线性表
SqList create_list()
{
	SqList s;
	int len;
	int val;
	int i;

	printf("输入线性表的长度 len = ");
	scanf("%d", &len);

	//线性表分配空间
	s.ele = (int *)malloc(sizeof(int) * len);
	s.initsize = len;	

	for(i = 0; i < len; i++)
	{
		printf("输入第%d个元素 val = ", i+1);
		scanf("%d", &val);

		s.ele[i] = val;  //线性表元素赋值
	}

	s.length = len;

	return s;
}

//遍历线性表
void traverse(SqList s)
{
	int i;
	for(i = 0; i < s.length; i++)
	{
		printf("%d ", s.ele[i]);
	}

	printf("\n");
}

//在线性表s的第pos为之前插入元素e
void insert(SqList &s, int pos, int e)
{
	int i;

	if(pos < 1 || pos > s.length + 1)
	{
		printf("插入位置错误!\n");
	}
	else
	{
		//若元素个数大于空间,则新增空间
		if(s.length >= s.initsize)
		{
			s.ele = (int *)realloc(s.ele, sizeof(int) * (s.initsize + INCRE_SIZE));
			s.initsize = s.initsize + INCRE_SIZE;
		}
 
		//pos以后的元素后移
		for(i = s.length -1; i >= pos - 1; i--)
		{
			s.ele[i + 1] = s.ele[i];
		}

		//插入元素
		s.ele[pos - 1] = e;

		s.length ++;
	}
}

void del(SqList &s, int pos, int * val)
{
	int i;

	if(pos < 1 || pos > s.length)
	{
		printf("删除位置错误!\n");
		return;
	}

	*val = s.ele[pos - 1];

	//表中的第pos+1个往后的元素向前移一位
	for(i = pos; i < s.length; i++)
	{
		s.ele[i-1] = s.ele[i];
	}

	s.length --;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值