因此,我试图创建一个链接列表类,以更好地了解指针和数据结构的工作方式,但是我一直遇到-11 SIGSEGV错误。当我查找错误时,它说我可能正在使用解引用的指针或访问超出其范围的数组,但这些都不适合我的程序。我到处都在搜索类似的问题,但是似乎没有一个适用于我的程序。别人能看到我在做什么吗?
#include <stdexcept>
#pragma once
using namespace std;
#define NODE typename LinkedList<T>::Node*
template <typename T>
class LinkedList {
public:
void AddHead(const T& data); //Adds new node to the beginning of the list
void AddTail(const T& data); //Adds new node to the end of the list
LinkedList(); //Default constructor
LinkedList(const LinkedList<T>& list); //Copy constructor
struct Node {
/*Individual node that stores the data*/
T data;
Node* prev;
Node* next;
Node(); //Default constructor for node
Node(T _data); //Data constructor for node
Node(T _data, Node* _prev, Node* _next); //Full constructor for node
};
private:
NODE head = nullptr;
NODE tail = nullptr;
unsigned int count;
};
/*Function definitions*/
template <typename T>
void LinkedList<T>::AddHead(const T& data) {
NODE tempRef = new Node(data, nullptr, head);
head->prev = tempRef;
head = tempRef;
delete tempRef;
count++;
}
template <typename T>
void LinkedList<T>::AddTail(const T& data) {
NODE tempRef = new Node(data, tail, nullptr);
tail->next = tempRef;
tail = tempRef;
delete tempRef;
count++;
}
template <typename T>
LinkedList<T>::LinkedList() {
count = 0;
head = nullptr;
tail = nullptr;
}
template <typename T>
LinkedList<T>::LinkedList(const LinkedList<T>& list) {
this->head = list.head;
this->tail = list.tail;
this->count = list.count;
}
/*Node Constructors*/
template <typename T>
LinkedList<T>::Node::Node() {
next = nullptr;
prev = nullptr;
}
template <typename T>
LinkedList<T>::Node::Node(T _data) {
next = nullptr;
prev = nullptr;
data = _data;
}
template <typename T>
LinkedList<T>::Node::Node(T _data, Node* _prev, Node* _next) {
next = _next;
prev = _prev;
data = _data;
}
最佳答案
AddHead
和AddTail
这两个函数都有一个严重的错误,因为立即删除了分配的节点
head = tempRef;
delete tempRef;
和
tail = tempRef;
delete tempRef;
因此,指针的头和尾具有无效值。
此外,这些功能不会在每个功能中相应地更新
tail
和head
。最初,两个指针都等于
nullptr
。所以这些陈述head->prev = tempRef;
和
tail->next = tempRef;
导致不确定的行为。
可以通过以下方式定义
AddHead
函数template <typename T>
void LinkedList<T>::AddHead(const T& data) {
NODE tempRef = new Node(data, nullptr, head);
if ( head == nullptr )
{
head = tail = tempRef;
}
else
{
head = head->prev = tempRef;
}
count++;
}
而且函数
AddTail
看起来像template <typename T>
void LinkedList<T>::AddTail(const T& data) {
NODE tempRef = new Node(data, tail, nullptr);
if ( tail == nullptr )
{
tail = head = tempRef;
}
else
{
tail = tail->next = tempRef;
}
count++;
}
复制构造函数(和复制赋值运算符)应该被定义为Deleted,或者应该复制作为参数传递的列表的深拷贝。
否则,两个列表将尝试两次删除相同的节点(在您的析构函数中已被删除)。
结构
Node
应该声明为私有(private)类成员。