有顺序表A和B,其元素均按从小到大的升序排列,编写一个算法,将它们合并成一个顺序表C,要求C的元素也按从小到大的升序排列,用C语言写,要求顺序表可以从键盘输入
时间: 2024-09-20 14:02:07 浏览: 36
当然可以。在C语言中,你可以采用经典的双指针法来合并两个有序数组。这里是一个简单的示例:
```c
#include <stdio.h>
// 定义顺序表结构体
typedef struct {
int* data;
int size;
int capacity;
} SequenceList;
// 功能:合并两个有序列表到第三个列表
void merge(SequenceList* listA, SequenceList* listB, SequenceList* result) {
int i = 0, j = 0, k = 0;
// 遍历两个列表直到其中一个结束
while (i < listA->size && j < listB->size) {
if (listA->data[i] <= listB->data[j]) {
result->data[k++] = listA->data[i++];
} else {
result->data[k++] = listB->data[j++];
}
}
// 将剩余未添加的数据复制到结果列表
while (i < listA->size) {
result->data[k++] = listA->data[i++];
}
while (j < listB->size) {
result->data[k++] = listB->data[j++];
}
}
// 功能:从键盘读取并初始化顺序表
void read_sequence_list(SequenceList* list, char name[]) {
printf("请输入 %s 的元素个数:", name);
int n;
scanf("%d", &n);
list->capacity = n + 1; // 预留一个位置存储最后一个元素
list->data = (int*)malloc(list->capacity * sizeof(int));
for (int i = 0; i < n; i++) {
printf("请输入第 %d 个元素:", i + 1);
scanf("%d", &list->data[i]);
}
}
int main() {
SequenceList listA, listB, result;
// 分别读取两个有序列表
read_sequence_list(&listA, "A");
read_sequence_list(&listB, "B");
// 合并两个列表
merge(&listA, &listB, &result);
// 输出合并后的结果
printf("合并后的有序列表 C:\n");
for (int i = 0; i < result.size; i++) {
printf("%d ", result.data[i]);
}
printf("\n");
// 清理内存
free(result.data);
return 0;
}
```
运行这个程序,它会提示用户分别输入两个排序好的整数序列,然后合并这两个序列并输出合并后的有序序列。
阅读全文