簡體   English   中英

雙向鏈表 c++ 中 [] 運算符的問題

[英]Problem with [] operator in doubly linked list c++

我是 c++ 的真正初學者,我被添加了一項任務,即編寫一個包含基本方法和運算符的類似 stl 的雙向鏈表。 所以我做了一些基本的方法,但是當我使用 [ ] 運算符編譯代碼后,它會打印“分段錯誤”錯誤。 我很樂意在解決這個問題方面得到一些幫助。

#include <iostream>
using namespace std;

template<typename T>
class Node
{
    public:
        T data;
        Node *prev;
        Node *next;
        Node(T data, Node *prev = nullptr, Node *next = nullptr): data(data), prev(prev), next(next) {}

};

template<typename T>
class List
{
    public:
        T& operator[](T const index);
        List();
        List(const List&);
        ~List();
        bool empty();
        int size();
        void clear();
        void push_back(T data);
        void push_front(T data);
        void pop_back();
        void pop_front();
        void resize(int nums);
    private:
        int Size;
        Node<T> *tail;
        Node<T> *head;
};

template<typename T>
List<T>::List()
{
    Size = 0;
    head = nullptr;
    tail = nullptr;
}

template<typename T>
List<T>::List(const List & L)
{
    head = nullptr;
    tail = nullptr;
    int count = 0; 
    Node<T> *temp = head;
    while(temp)
    {
        push_back(temp->data);
        temp = temp->next;
    }
}

template<typename T>
List<T>::~List()
{
    Node<T> *temp;
    while(head)
    {
        temp = head;
        head = head->next;
        delete temp;
    }
}

template<typename T>
T & List<T>::operator[](T const index)
{
    Node<T> *curr = head;
    int counter = 0;
    while (curr)
    {
        if (counter == index)
        {
            return curr->data;
        }
        curr = curr->next;
        counter++;
    }
}

template<typename T>
void List<T>::push_back(T data)
{
    if (head == nullptr)
    {
        head =  new Node<T>(data, tail, nullptr);
    }
    if (tail != nullptr)
    {
        tail->next = new Node<T>(data, tail, nullptr);
    }
    tail = new Node<T>(data, tail, nullptr);
    ++Size;

}

template<typename T>
void List<T>::push_front(T data)
{
    head = new Node<T>(data, nullptr, head);
    Size++;
}

template<typename T>
void List<T>::pop_back()
{
    Node<T> *temp = tail;
    tail = tail->prev;
    delete temp;
    Size--;
}

template<typename T>
void List<T>::pop_front()
{
    Node<T> *temp = head;
    head = head->next;
    delete temp;
    Size--;
}

template<typename T>
void List<T>::clear()
{
    while (Size)
    {
        pop_back();
    }
}

template<typename T>
void List<T>::resize(int num)
{
    if (num > Size)
    {
        while (Size != num)
        {
            push_back(0);
        }
    }
    else{
        while (Size != num)
        {
            pop_back();
        }
    }
}

template<typename T>
bool List<T>::empty() {return Size == 0;}

template<typename T>
int List<T>::size() {return Size;}

int main()
{
    List<int> l;
    l.push_back(1234);
    l.push_back(124);
    l.push_back(10);
    l.push_front(1);

    for (int i = 0; i < l.size(); i++)
    {
        cout<<l[i]<<" ";
    }

    return 0;
}
if (tail != nullptr)
{
    tail->next = new Node<T>(data, tail, nullptr);
}
tail = new Node<T>(data, tail, nullptr);

這是你最大的錯誤。 您在tail之后添加next ,但隨后將tail設置為不同的內容。 所以,下次你推的時候,你會推到新的tail ,而不是從head開始的next鏈。 結果,您的列表比預期的要短,並且您將其遍歷到末尾。

您可能想要類似的東西:(未測試)

if (tail != nullptr)
{
    tail->next = new Node<T>(data, tail, nullptr);
    tail = tail->next;
}
else
{
    tail = new Node<T>(data, tail, nullptr);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM