[英]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.