用vc6.0完整代码完成两个有序线性表的合并,要求同样的数据元素只出现一次
时间: 2024-11-27 12:09:38 浏览: 17
在Visual C++ 6.0中,我们可以使用结构体或类来表示线性表,并利用指针数组来合并两个有序的线性表。这里提供一个简单的示例,我们将创建一个结构体`ListNode`来存储节点,然后编写一个函数`MergeSortedLists`来合并这两个列表。请注意,这个例子假设你已经有一个`ListNode`结构,并且它们包含`data`和`next`字段。
```cpp
#include <iostream>
// 定义线性表节点
struct ListNode {
int data;
ListNode* next;
};
// 合并两个有序线性表
ListNode* MergeSortedLists(ListNode* list1, ListNode* list2) {
// 创建一个新的头结点和临时指针
ListNode* head = nullptr;
ListNode* temp = nullptr;
// 判断哪个列表为空或者更小
if (!list1 || (!list2 && list1->data <= list2->data)) {
return list1;
} else if (!list2) {
return list2;
}
// 比较两个列表当前节点的数据,将较小的节点添加到新链表
if (list1->data < list2->data) {
temp = list1;
list1 = list1->next;
} else {
temp = list2;
list2 = list2->next;
}
// 将新链表的头指针指向当前较小节点,然后继续遍历
head = temp;
// 递归地合并剩余部分,直到其中一个列表为空
while (list1 && list2) {
if (list1->data < list2->data) {
temp->next = list1;
list1 = list1->next;
} else {
temp->next = list2;
list2 = list2->next;
}
temp = temp->next;
}
// 如果还剩下未处理的节点,直接连接到新链表尾部
if (list1) {
temp->next = list1;
} else {
temp->next = list2;
}
return head;
}
// 打印链表
void PrintList(ListNode* node) {
while (node) {
std::cout << node->data << " ";
node = node->next;
}
std::cout << std::endl;
}
int main() {
// 创建两个示例的有序线性表
ListNode* list1 = new ListNode{1, new ListNode{2, new ListNode{3}}};
ListNode* list2 = new ListNode{4, new ListNode{5, new ListNode{6}}};
// 合并两个列表
ListNode* mergedList = MergeSortedLists(list1, list2);
// 输出合并后的结果
std::cout << "Merged List: ";
PrintList(mergedList);
delete mergedList; // 释放内存
return 0;
}
```
在这个例子中,`MergeSortedLists`函数会返回一个新的合并后的有序线性表,同时保持相同的元素只出现一次。
阅读全文