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;
}