#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-01 10:51:16 浏览: 65
orderedList.hpp 实现如下:
```c++
#include "listnode.h"
class OrderedList {
public:
OrderedList() : root(nullptr) {}
virtual ~OrderedList() {
listNode *p = root;
while (p != nullptr) {
listNode *tmp = p->next;
delete p;
p = tmp;
}
}
virtual void insert(int val) = 0;
void printList() const {
listNode *p = root;
while (p != nullptr) {
std::cout << p->val << " ";
p = p->next;
}
std::cout << std::endl;
}
protected:
listNode *root;
};
class AscendOrderedList : public OrderedList {
public:
void insert(int val) override {
listNode *p = root;
listNode *prev = nullptr;
while (p != nullptr && p->val <= val) {
prev = p;
p = p->next;
}
listNode *node = new listNode(val, prev, p);
if (prev == nullptr) {
root = node;
}
}
};
class DescendOrderedList : public OrderedList {
public:
void insert(int val) override {
listNode *p = root;
listNode *prev = nullptr;
while (p != nullptr && p->val >= val) {
prev = p;
p = p->next;
}
listNode *node = new listNode(val, prev, p);
if (prev == nullptr) {
root = node;
}
}
};
```
在 AscendOrderedList 和 DescendOrderedList 类中,重载了 insert 函数,实现插入的时候按照升序和降序排列。在 insert 函数中,首先遍历链表,找到插入位置,然后创建新的节点并插入到链表中。如果链表为空,则新节点作为根节点。需要注意的是,在插入节点时,需要更新节点的前驱和后继节点。
阅读全文