运用类结构的相关知识,构造链表类,根据给定输入数据完成链表对象的构造,并重载+=运算符,完成链表对象的拼接,具体规则如下: 给定一组数,分别取其中的偶节点以及奇节点构造出两个链表对象A,B,然后将这两个链表对象使用+=运算符进行拼接,+=运算符的调用顺序取决于输入,当输入1时:运算顺序为A+=B;当输入2时:运算顺序为B+=A。+=运算符运算规则以A+=B为例说明如下:将A、B链表节点交叉构造出一个新链表,存于A,如果A链表为空链表,则A+=B的结果链表与B相同。最后,将链表A、B以及+=运算后的结果链表输出。 注:奇节点和偶节点指的是节点位置编号的奇偶性,而不是节点的值的奇偶性,例如:输入的第一个数据节点位置编号为1,是奇节点
时间: 2024-04-06 16:34:41 浏览: 50
好的,根据您的要求,我会为您解答这道题目。
首先,我们需要构造链表类,代码如下:
```cpp
#include <iostream>
using namespace std;
class Node {
public:
int val;
Node* next;
Node(int v = 0, Node* n = nullptr) : val(v), next(n) {}
};
class LinkedList {
private:
Node* head;
Node* tail;
int size;
public:
LinkedList() : head(nullptr), tail(nullptr), size(0) {}
LinkedList(const LinkedList& rhs) : head(nullptr), tail(nullptr), size(0) {
Node* p = rhs.head;
while (p != nullptr) {
add(p->val);
p = p->next;
}
}
~LinkedList() {
while (head != nullptr) {
Node* p = head;
head = head->next;
delete p;
}
}
void add(int val) {
Node* p = new Node(val);
if (head == nullptr) {
head = tail = p;
} else {
tail->next = p;
tail = p;
}
size++;
}
int getSize() const {
return size;
}
friend LinkedList operator+=(LinkedList& lhs, LinkedList& rhs) {
if (lhs.head == nullptr) {
lhs.head = rhs.head;
lhs.tail = rhs.tail;
} else {
Node *p = lhs.head, *q = rhs.head;
while (p != nullptr && q != nullptr) {
Node* tmp = q->next;
q->next = p->next;
p->next = q;
p = q->next;
q = tmp;
}
if (q != nullptr) {
lhs.tail->next = q;
lhs.tail = rhs.tail;
}
}
lhs.size += rhs.size;
return lhs;
}
friend ostream& operator<<(ostream& os, const LinkedList& ll) {
Node* p = ll.head;
while (p != nullptr) {
os << p->val << " ";
p = p->next;
}
return os;
}
};
```
上述代码中,我们定义了节点类 Node 和链表类 LinkedList,其中链表类包括链表头指针 head,链表尾指针 tail 和链表长度 size,以及常见的链表操作,如添加节点 add、获取链表长度 getSize 和输出链表元素 operator<<。此外,我们还重载了加等运算符 operator+=,用于链表的拼接。
接下来,我们需要根据给定的输入数据构造出两个链表 A 和 B。代码如下:
```cpp
LinkedList A, B;
int n, val;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> val;
if (i % 2 == 1) {
A.add(val);
} else {
B.add(val);
}
}
```
上述代码中,我们先定义了两个空链表 A 和 B,然后依次读入输入数据,并判断节点位置编号的奇偶性,将偶节点加入链表 A,将奇节点加入链表 B。
最后,我们需要根据输入的不同选择不同的拼接顺序,并输出链表 A、B 以及拼接后的链表。代码如下:
```cpp
int choice;
cin >> choice;
if (choice == 1) {
A += B;
} else {
B += A;
}
cout << "LinkedList A: " << A << endl;
cout << "LinkedList B: " << B << endl;
```
上述代码中,我们先读入输入的选择,如果选择为 1,则先将链表 B 拼接到链表 A 上,否则将链表 A 拼接到链表 B 上。最后,我们输出链表 A、B 以及拼接结果。注意,在输出链表时,我们重载了输出运算符 operator<<。
完整代码如下:
阅读全文