如何实现 Front() 方法以返回模板化双向链表C++的第一个元素?

How to implement Front() method to return the first element of a templated doubly linked list C++?

本文关键字:C++ 双向链表 第一个 元素 返回 实现 何实现 Front 方法      更新时间:2023-10-16

每当我在主中实现 front(( 方法(返回双向链表的第一个元素(时,即使以类似方式实现的 back(( 方法(返回尾巴的信息(工作,我也会出现分段错误。有人可以帮忙吗?

template <class T>
class Node {
public:
T info;
Node<T>* next;
Node<T>* prev;
Node(const T info){
this->info = info;
next = NULL;
prev =  NULL;
} 
Node* getNode(T info){
Node* newnode = (Node *)malloc(sizeof(Node));
}
};
template <class T> 
class DLlist {
private:
Node<T>* head;
Node<T>* tail;
int size;
public:
DLlist();
T front();
T back();
};
template<class T> 
DLlist<T>::DLlist(){
head = NULL;
tail = NULL;
size = 0;
}
template <class T> 
void DLlist<T>::addback(const T newdata){
if (isEmpty()){
Node<T> *newnode = new Node<T>(newdata);
head = tail = newnode;
size++;
return;
}
Node<T> *newnode;
newnode = new Node<T>(newdata);
newnode->prev = tail;
newnode->next = NULL;
tail->prev = newnode;
tail = newnode;
size++;
}
template <class T> 
T DLlist<T>::front(){
return (head->info);
}

addback()函数中:

Node<T> *newnode;                // Two lines where
newnode = new Node<T>(newdata);  // one suffices
newnode->prev = tail;
newnode->next = NULL;  // Unnecessary, your constructor did this
tail->prev = newnode;  // THIS IS YOUR PROBLEM
tail = newnode;
size++;

你的尾巴应该设置下一个指向新节点的指针,而不是它的上一个。把这些东西画在一张纸上可以大大有助于更好地理解它应该如何工作。

我总是愿意在这个网站上将糟糕的格式归结为复制/粘贴,但是您还可以做其他事情来简化代码,使其更现代等。

所以这里又是你的代码,清理了一点(这段代码使用 Webkit 风格经历了 clang 格式(:

#include <iostream>
template <class T>
struct Node {
T info;
Node<T>* next = nullptr;
Node<T>* prev = nullptr;
Node(const T& info)
: info(info)
{
}
// Don't know why you need this, so just deleting it because it's a bad
// function
};
template <class T>
class DLlist {
private:
Node<T>* head = nullptr;
Node<T>* tail = nullptr;
int size = 0;
public:
DLlist() = default;
bool isEmpty() { return head == nullptr && tail == nullptr; }
void push_back(const T& newdata);
const T front() const;
const T back() const;
};
template <class T>
void DLlist<T>::push_back(const T& newdata)
{
if (isEmpty()) {
head = new Node<T>(newdata);
tail = head;
size++;
return;
}
Node<T>* newnode = new Node<T>(newdata);
newnode->prev = tail;
tail->next = newnode; // THIS WAS PROBABLY YOUR ISSUE
tail = newnode;
size++;
}
template <class T>
const T DLlist<T>::front() const
{
return head->info;
}
template <class T>
const T DLlist<T>::back() const
{
return tail->info;
}
int main()
{
DLlist<int> list;
list.push_back(42);
list.push_back(54);
std::cout << list.front() << 'n';  // 42 prints just fine, Debian w/ LLVM 9
}