设有两条有序链表(即data域元素的关键字由前往后不断增大),试设计算法将这两条链表合并为一条新的有序链表,原链表不变。两条链表中data域关键字相同的元素合并为一条新的有序链表,原链表不变。两条链表中data域关键字相同的元素只选取一个存储到新的有序链表中,不同的元素都存储到新的有序链表中。 有以下三点要求:第一,直接编写链表的友元函数完成该功能;第二,链表的data域可存储用户自定义类对象;第三,编写main()函数测试线性表的正确性。
时间: 2023-06-23 15:08:10 浏览: 103
下面是实现该功能的链表友元函数的代码:
```cpp
template<typename T>
class LinkList {
private:
struct Node {
T data;
Node* next;
Node() : next(nullptr) {}
Node(const T& data, Node* next = nullptr) : data(data), next(next) {}
};
Node* head;
public:
LinkList() : head(new Node()) {}
~LinkList() {
Node* p = head;
while (p) {
Node* q = p->next;
delete p;
p = q;
}
}
void Insert(const T& data) {
Node* p = head;
while (p->next && p->next->data < data) {
p = p->next;
}
p->next = new Node(data, p->next);
}
friend LinkList<T> Merge(const LinkList<T>& l1, const LinkList<T>& l2) {
LinkList<T> result;
Node* p = l1.head->next;
Node* q = l2.head->next;
while (p && q) {
if (p->data < q->data) {
result.Insert(p->data);
p = p->next;
} else if (q->data < p->data) {
result.Insert(q->data);
q = q->next;
} else {
result.Insert(p->data);
p = p->next;
q = q->next;
}
}
while (p) {
result.Insert(p->data);
p = p->next;
}
while (q) {
result.Insert(q->data);
q = q->next;
}
return result;
}
};
```
这里的`LinkList`是模板类,可以存储任意类型的元素。`Insert`函数用于向链表中插入一个元素,`Merge`函数用于合并两条有序链表为一条新的有序链表。
为了实现链表的友元函数,需要将`Merge`函数声明为`LinkList`类的友元函数。在函数内部,定义一个新的空链表`result`,然后使用两个指针`p`和`q`分别指向两条原始链表的第一个元素(即头节点的下一个节点)。然后,不断比较`p`和`q`所指向的元素大小,将较小的元素插入到`result`链表中。如果两个元素相等,则只插入其中一个。最后,将剩余的元素插入到`result`链表中。返回`result`链表即可。
下面是一个测试代码的例子,其中定义了一个`Person`类,测试了`LinkList`类能否正确合并两条有序链表。
```cpp
#include <iostream>
#include <string>
#include "LinkList.h"
class Person {
public:
std::string name;
int age;
Person() : age(0) {}
Person(const std::string& name, int age) : name(name), age(age) {}
bool operator<(const Person& other) const {
return age < other.age;
}
bool operator==(const Person& other) const {
return name == other.name && age == other.age;
}
};
int main() {
LinkList<int> list1;
list1.Insert(1);
list1.Insert(3);
list1.Insert(5);
LinkList<int> list2;
list2.Insert(2);
list2.Insert(4);
list2.Insert(6);
LinkList<int> result = Merge(list1, list2);
for (LinkList<int>::Node* p = result.head->next; p; p = p->next) {
std::cout << p->data << " ";
}
std::cout << std::endl;
LinkList<Person> list3;
list3.Insert(Person("Tom", 20));
list3.Insert(Person("Mary", 18));
list3.Insert(Person("John", 22));
LinkList<Person> list4;
list4.Insert(Person("Tom", 21));
list4.Insert(Person("Mary", 18));
list4.Insert(Person("Bob", 19));
LinkList<Person> result2 = Merge(list3, list4);
for (LinkList<Person>::Node* p = result2.head->next; p; p = p->next) {
std::cout << p->data.name << " " << p->data.age << std::endl;
}
return 0;
}
```
阅读全文