数据结构题集(C语言版-严蔚敏)算法题代码P17 2.11

P17 2.11

设顺序表va中的数据元素递增有序。试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性。

解法一:边判断边移动(代码更简单)

void Insert_list(int x, Seqlist &va) { //插入x,保持顺表递增有序
	if (va.list_len == va.list_size) {
		printf("顺序表已经满了!\n");
		return ;
	}
	int i;
	for (i = va.list_len ; i > 0 && x < va.a[i - 1]; i--) {
		va.a[i] = va.a[i - 1];
	}
	va.a[i] = x;
	va.list_len++;
	return ;
}

解法二:先找到需要移动的位置,再移动。(注意x插入头部、尾部的情况)

void Insert_list(int x, Seqlist &va) { //插入x,保持顺表递增有序
	if (va.list_len == va.list_size) {
		printf("顺序表已经满了!\n");
		return ;
	}
	int res = va.list_len;//考虑插入尾部
	for (int i = va.list_len - 1; i >= 0; i--) {
		if (x >= va.a[i]) {
			res = i + 1;
			break;
		}
		if (i == 0) {//考虑插入首部
			res = 0;
			break;
		}
	}
	for (int i = va.list_len - 1; i >= res; i--) {
		va.a[i + 1] = va.a[i];
	}
	va.a[res] = x;
	va.list_len++;
	return ;
}

完整代码:

#include <stdio.h>
#include <stdlib.h>//动态数组
#define len 10
#define size  20

typedef struct {
	int *a;//顺序表起始地址
	int list_len;//实际表长
	int list_size;//总长度
} Seqlist;

void Init_list(Seqlist &va) { //初始化顺序表
	va.a = (int *)malloc(len * sizeof(int));
	if (!va.a) {
		printf("内存分配失败!\n");
		exit(1);//程序将立即退出,不再继续执行后面的语句
	}
	va.list_len = len;
	va.list_size = size;
	printf("请输入长度为10的有序数列:\n");
	for (int i = 0; i < va.list_len; i++) {
		scanf("%d", &(va.a[i]));
	}
	return ;
}

//void Insert_list(int x, Seqlist &va) { //插入x,保持顺表递增有序
//	if (va.list_len == va.list_size) {
//		printf("顺序表已经满了!\n");
//		return ;
//	}
//	int res = va.list_len;//考虑插入尾部
//	for (int i = va.list_len - 1; i >= 0; i--) {
//		if (x >= va.a[i]) {
//			res = i + 1;
//			break;
//		}
//		if (i == 0) {//考虑插入首部
//			res = 0;
//			break;
//		}
//	}
//	for (int i = va.list_len - 1; i >= res; i--) {
//		va.a[i + 1] = va.a[i];
//	}
//	va.a[res] = x;
//	va.list_len++;
//	return ;
//}

void Insert_list(int x, Seqlist &va) { //插入x,保持顺表递增有序
	if (va.list_len == va.list_size) {
		printf("顺序表已经满了!\n");
		return ;
	}
	int i;
	for (i = va.list_len ; i > 0 && x < va.a[i - 1]; i--) {
		va.a[i] = va.a[i - 1];
	}
	va.a[i] = x;
	va.list_len++;
	return ;
}

int main() {
	Seqlist va;
	Init_list(va);
	int x;
	printf("请输入插入元素:\n");
	scanf("%d", &x);
	Insert_list(x, va);
	printf("最终结果:\n");
	for (int i = 0; i < va.list_len; i++) {
		printf("%d\t", va.a[i]);
	}
	free(va.a);
	return 0;
}

运行截图:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值