#include <iostream> struct listNode { listNode * prev, * next; int val; listNode(): val(0), prev(nullptr), next(nullptr){} listNode(int v, listNode *p, listNode *n): val(v), prev(p), next(n) { if (prev != nullptr) prev->next = this; if (next != nullptr) next->prev = this; } };根据 listnode.h 中对链表 listNode 的定义,在 orderedList.hpp 中实现以下三个类: 抽象基类 OrderedList,表示一个整数链表,有以下方法: 构造函数:无参数,创建一个空的链表; void insert(int val) 向链表中插入一个元素,在 OrderedList 中该方法应当为纯虚函数; void printList() const 依次在屏幕上输出链表中的元素,元素之间用空格分隔,输出完整个链表后换行; 析构函数:释放链表所占用的空间。 此外,OrderedList还有一个保护成员:listNode * root; 具体类 AscendOrderedList,表示一个升序的链表,继承自 OrderedList,需要重载 void insert(int val) 函数,在插入的时候实现升序。 具体类 DescendOrderedList,表示一个降序的链表,继承自 OrderedList,需要重载 void insert(int val) 函数,在插入的时候实现降序。
时间: 2024-03-11 07:50:11 浏览: 75
以下是 orderedList.hpp 的实现:
```cpp
#pragma once
#include "listnode.h"
class OrderedList {
protected:
listNode* root;
public:
OrderedList() : root(nullptr) {}
virtual ~OrderedList() {
listNode* curr = root;
while (curr != nullptr) {
listNode* next = curr->next;
delete curr;
curr = next;
}
}
virtual void insert(int val) = 0;
void printList() const {
listNode* curr = root;
while (curr != nullptr) {
std::cout << curr->val << " ";
curr = curr->next;
}
std::cout << std::endl;
}
};
class AscendOrderedList : public OrderedList {
public:
void insert(int val) override {
listNode* curr = root;
listNode* prev = nullptr;
while (curr != nullptr && curr->val < val) {
prev = curr;
curr = curr->next;
}
if (prev == nullptr) {
root = new listNode(val, nullptr, curr);
} else {
prev->next = new listNode(val, prev, curr);
}
}
};
class DescendOrderedList : public OrderedList {
public:
void insert(int val) override {
listNode* curr = root;
listNode* prev = nullptr;
while (curr != nullptr && curr->val > val) {
prev = curr;
curr = curr->next;
}
if (prev == nullptr) {
root = new listNode(val, nullptr, curr);
} else {
prev->next = new listNode(val, prev, curr);
}
}
};
```
注意,我们在 OrderedList 类中的析构函数中,使用 while 循环遍历整个链表,并使用 delete 语句释放每个节点所占用的内存。
在 AscendOrderedList 类和 DescendOrderedList 类中,我们重载了 insert 函数,使用类似插入排序的方法,遍历链表查找插入位置,并插入新的节点。
在 printList 函数中,我们遍历整个链表,输出每个节点的值,并在最后输出换行符。
阅读全文