假设现有两个顺序表A(2,4,6,8,10,12)和B(1,3,5,7,9,11),其元素均按照从小到大的顺序升序排序。编写一个算法将他们合并成一个顺序表C(要求C的元素也要按从小到大的顺序升序排序)。c语言完整代码
时间: 2024-12-11 08:20:12 浏览: 11
数据结构第五章作业答案参考(C语言)
在C语言中,可以使用经典的归并排序的思想来合并两个已排序的顺序表。这里提供一个简单的示例,假设这两个顺序表都是通过指针表示的:
```c
#include <stdio.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
// 合并两个有序链表
Node* mergeLists(Node* list1, Node* list2) {
// 创建一个新的头节点
Node* result = (list1 == NULL) ? list2 : ((list2 == NULL) ? list1 : (list1->data < list2->data) ? list1 : list2);
// 新的头节点初始化
Node* temp = result;
while ((list1 != NULL) && (list2 != NULL)) {
if (list1->data < list2->data) {
temp->next = list1;
list1 = list1->next;
} else {
temp->next = list2;
list2 = list2->next;
}
temp = temp->next;
}
// 将剩余未遍历完的部分连接到结果链表尾部
if (list1 != NULL)
temp->next = list1;
else if (list2 != NULL)
temp->next = list2;
return result;
}
// 打印顺序表
void printList(Node* head) {
while (head != NULL) {
printf("%d -> ", head->data);
head = head->next;
}
printf("NULL\n");
}
int main() {
// 初始化顺序表A和B
Node* A = (Node*)malloc(sizeof(Node));
A->data = 2;
A->next = (Node*)malloc(sizeof(Node));
A->next->data = 4;
// ...继续添加A列表剩余元素...
// 同理初始化B列表
// 合并两个列表
Node* C = mergeLists(A, B);
// 打印合并后的顺序表C
printList(C);
// 清理内存
free(A);
free(B); // 这里需要释放B,因为它们不再被引用
return 0;
}
```
这个程序首先比较两个链表的第一个元素,选择较小的那个添加到结果链表中,并移动指向较小元素的指针。直到其中一个链表遍历完,再将剩余部分添加到结果链表的末尾。
阅读全文