【发布时间】:2021-07-19 09:40:44
【问题描述】:
谁能告诉我这里哪里出错了?我认为问题出在 clear() 函数上,但并不完全确定。目标是创建一个双向链表。我仍然需要添加一些功能,但感觉我已经添加了足够的功能来运行我在 main() 中提供的功能。
#include <iostream>
using namespace std;
template <class T>
class doubLList;
template <class T>
class doubNode{
T data;
doubNode<T>* next;
doubNode<T>* prev;
public:
doubNode(T data = T(), doubNode<T>* prev = nullptr, doubNode<T>* next = nullptr) : data(data),
next(next), prev(prev) {}
friend doubLList<T>;
T& returnData() {return data;}
doubNode<T>*& returnNext() {return next;}
};
template <class T>
class doubLList{
doubNode<T>* head;
doubNode<T>* tail;
public:
doubLList() {head = new doubNode<T>; tail = new doubNode<T>; head->next = tail; tail->prev = head; cout<< "constructed" << endl;}
doubLList(const doubLList<T>& copy);
~doubLList();
doubLList<T>& operator=(const doubLList<T>& rhs);
void clear();
void insert(const T& data) {head->next = new doubNode<T>(data, head->next, head); head->next->next->prev = head->next;}
doubNode<T>*& returnHead() {return head;}
};
template <class T>
void doubLList<T>::clear(){
cout << "Clear" << endl;
while(head->next != tail){
cout << "Run" << endl;
doubNode<T>* delNode = head->next;
head->next = delNode->next;
head->next->prev = head;
delete delNode;
}
}
template <class T>
doubLList<T>::doubLList(const doubLList<T>& copy){
head = new doubNode<T>;
tail = new doubNode<T>;
head->next = tail;
tail->prev = head;
*this = copy;
}
template <class T>
doubLList<T>& doubLList<T>::operator=(const doubLList<T>& rhs) {
if(this == &rhs){
return *this;
}
clear();
doubNode<T>* rhsPtr = rhs->next;
while(rhs->next->next){
tail->prev = new doubNode<T>(rhsPtr->data, tail, tail->prev);
tail->prev->prev->next = tail->prev;
rhsPtr = rhsPtr->next;
}
}
template <class T>
doubLList<T>::~doubLList(){
clear();
delete head;
delete tail;
head = nullptr;
tail = nullptr;
}
int main() {
doubLList<int>test;
cout << test.returnHead() << endl;
test.insert(1);
return 0;
}
提前致谢!
【问题讨论】:
-
默认的构造函数和析构函数都不是很好。复制构造函数不是很好。你需要一步一步地把这些画出来。未初始化的指针和内存泄漏比比皆是。
-
void insert(const T& data)-- 你在哪里插入新数据?在列表的末尾?在列表的开头?此外,该功能的实现看起来非常可疑。插入例程通常会遍历列表,而您的代码根本不这样做。如果不是这样,tail将用于确定在最后插入的位置——同样,您的函数不会这样做。 -
另外,如果
insert实际上使用tail指针插入到列表的末尾以获得帮助,那么我建议您重写您的复制构造函数以简单地在循环中调用insert(一次insert正在工作)。这比你现在做的要容易得多。 -
head->next = new doubNode<T>(data, head->next, head)ininsert真的很混乱。为什么next的next是head?您的doubNodector 将prev作为第二个,next作为第三个。 -
OP,如果您将新节点分配给
head->next,则它们不会出现在列表的前面。他们要去head->next,这是列表中的第二个位置。
标签: c++ pointers linked-list dynamic-memory-allocation doubly-linked-list