因此,我试图创建一个链接列表类,以更好地了解指针和数据结构的工作方式,但是我一直遇到-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;
}

最佳答案

AddHeadAddTail这两个函数都有一个严重的错误,因为立即删除了分配的节点

head = tempRef;
delete tempRef;


tail = tempRef;
delete tempRef;

因此,指针的头和尾具有无效值。

此外,这些功能不会在每个功能中相应地更新tailhead

最初,两个指针都等于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)类成员。

08-25 19:40