循环访问自定义双链表



我正在实现一个双链表。我已经实现了添加到列表的头部和尾部的功能。我一直在尝试制作一个可以打印给定对象的所有元素的函数。 尽管该函数打印第一个值,但它不会打印列表中的任何其他项。

d_list.h

#include<iostream>
#include "node.h"
#ifndef NODE_H
#define NODE_H

template<class T>
class d_list{
private:
int l_size;
Node<T>* head;
Node<T>* tail;
public:
d_list():l_size(0){
head=nullptr;
tail=nullptr;
}
Node<T>* gethead(){return this->head;}
Node<T>* gettail(){return this->tail;}
int getlength(){
return this->l_size;
}
void addashead(T data){
Node<T>* curr_node=new Node<T>(data);
if(this->head==nullptr){
this->head=curr_node;
this->tail=curr_node;
this->l_size=l_size+1;
}else {
curr_node->next=this->head->previous;
this->head->previous=curr_node;
this->head=curr_node;
this->l_size=l_size+1;
}
}
void addastail(T data ){
Node<T>* curr_node=new Node<T>(data);
if(this->tail==this->head){
this->head->next=curr_node->previous;
curr_node->previous=this->head;
this->tail=curr_node;
this->tail->next=nullptr;
this->l_size=l_size+1;
}
else{
this->tail->next=curr_node;
curr_node->previous=this->tail;
this->tail=curr_node;
this->l_size=l_size+1;
}
}
Node<T>* begin(){
return this->head;
}
Node<T>* end(){
return this->tail;
}
bool isempty(){
return this->head==nullptr;
}
T& back(){
return this->tail->m_data;
}
T& front(){
return this->head->m_data;
}
void printlist(){
Node<T>* temp= this->head;
while(temp) {
std::cout << temp->m_data<< " -> ";
temp = temp->next;
}

}
};
#endif

节点.h

template <class T>
class Node{
private:

public:
T m_data;
Node<T>* next;
Node<T>* previous;
Node()=default;
Node(T data){
m_data=data;
previous=nullptr;
next=nullptr;
}
~Node();

};

主.cpp

#include "d_list.h"
#include<iostream>
using namespace std;

int main(){
d_list<int> d1;

d1.addashead(50);

d1.addastail(20);

d1.addastail(60);

d1.addastail(80);

d1.printlist();
return 0;
}

addastail(( 和 addashead(( 方法中存在一些错误。

我删除了这些错误,检查这个:

void addashead(T data){
Node<T>* curr_node=new Node<T>(data);
if(this->head==nullptr){
this->head=curr_node;
this->tail=curr_node;
this->l_size=l_size+1;
}else {
curr_node->next=this->head;
this->head->previous=curr_node;
this->head=curr_node;
this->l_size=l_size+1;
}
}

在 else 部分的第一行, 你写道:

curr_node->next=this->head->previous;

但它应该是:curr_node->next=this->head;

因为curr_node的下一个应该指向头部,而不是头部的前一个。

void addastail(T data ){
Node<T>* curr_node=new Node<T>(data);
if(this->tail==this->head){
this->head->next=curr_node;
curr_node->previous=this->head;
this->tail=curr_node;
this->tail->next=nullptr;
this->l_size=l_size+1;
}
else{
this->tail->next=curr_node;
curr_node->previous=this->tail;
this->tail=curr_node;
this->l_size=l_size+1;
}
}

在if部分的第一行中,你写道:

this->head->next=curr_node->previous;

但它应该是:this->head->next=curr_node;

最新更新