分别用顺序表和链表完整实现两个有序集合 A、B合并成有序集合C,例如A={3,4,5,7},B={1,2,6},A,B合并后C={1,2,3,4,5,6,7}。c语言格式
时间: 2024-09-26 20:07:35 浏览: 43
在C语言中,我们可以分别用顺序表和链表来实现这个功能。这里给出两种数据结构的示例:
**顺序表实现(数组):**
```c
#include <stdio.h>
// 定义一个整数类型的顺序表节点
typedef struct {
int data;
int next; // 对于顺序表,下一个元素的索引
} Node;
// 合并有序顺序表
Node* merge_sorted_arrays(int arr1[], int size1, int arr2[], int size2) {
// 创建新数组C,并初始化为arr1的第一个元素
Node *arrayC = (Node*)malloc(sizeof(Node));
arrayC->data = arr1[0];
arrayC->next = 0;
int i = 1, j = 0; // 指向arr1和arr2的指针
// 遍历两个数组,直到其中一个结束
while (i < size1 && j < size2) {
if (arr1[i] <= arr2[j]) {
Node* newNode = (Node*)malloc(sizeof(Node)); // 新增元素到arrayC
newNode->data = arr1[i];
newNode->next = arrayC->next;
arrayC->next = newNode;
i++;
} else {
Node* newNode = (Node*)malloc(sizeof(Node)); // 新增元素到arrayC
newNode->data = arr2[j];
newNode->next = arrayC->next;
arrayC->next = newNode;
j++;
}
}
// 把剩余元素添加到arrayC
while (i < size1) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = arr1[i];
newNode->next = arrayC->next;
arrayC->next = newNode;
i++;
}
while (j < size2) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = arr2[j];
newNode->next = arrayC->next;
arrayC->next = newNode;
j++;
}
return arrayC;
}
// 示例
int main() {
int arr1[] = {3, 4, 5, 7};
int size1 = sizeof(arr1) / sizeof(arr1[0]);
int arr2[] = {1, 2, 6};
int size2 = sizeof(arr2) / sizeof(arr2[0]);
Node* result = merge_sorted_arrays(arr1, size1, arr2, size2);
// 输出结果并释放内存...
}
```
**链表实现(单链表):**
```c
#include <stdio.h>
typedef struct Node {
int data;
struct Node* next;
} ListNode;
// 合并有序链表
ListNode* merge_sorted_lists(ListNode* list1, ListNode* list2) {
if (!list1 || !list2) return (list1 ? list1 : list2); // 先处理空链表的情况
ListNode* head = (list1->data <= list2->data) ? list1 : list2;
ListNode* tail = head;
if (head != list1) tail->next = merge_sorted_lists(list1, list2->next);
else tail->next = merge_sorted_lists(list1->next, list2);
return head;
}
// 示例
int main() {
// 创建链表表示A和B...
ListNode* list1 = create_linked_list({3, 4, 5, 7});
ListNode* list2 = create_linked_list({1, 2, 6});
ListNode* mergedList = merge_sorted_lists(list1, list2);
// 输出结果和释放内存...
}
```
阅读全文