我构建一个LinkedList类作为项目的基础。我已经实现了基于LinkedList的但是有一个我无法解决的奇怪错误。基本上我的列表的头部和尾部总是空的。除了这个奇怪的问题,一切似乎都很好。我有三个文件:一个定义节点和列表的头,一个实现文件,最后一个文件来运行一切。谁能发现我的错误?我认为我的错误在于add方法。
头文件:
class Node
{
private:
int data;
Node *next;
Node *prev;
friend class LinkedList;
};
class LinkedList
{
private:
Node *head;
Node *tail;
public:
LinkedList();
~LinkedList();
bool empty();
void insert_left(int v);
void insert_right(int v);
Node* get_first();
Node* get_last();
void print_list();
void print_node(Node *n);
void remove_left();
void remove_right();
protected:
void add(Node *v, int d);
void remove(Node *v);
};
类实现文件:
#include <iostream>
#include "node.h"
using namespace std;
LinkedList :: LinkedList()
{
head = new Node;
tail = new Node;
head->next = tail;
tail->prev = head;
}
LinkedList :: ~LinkedList()
{
while(!empty())
{
remove_left();
}
delete head;
delete tail;
}
void LinkedList :: add(Node *v, int d)
{
Node *u = new Node;
u->data = d;
u->next = v;
u->prev = v->prev;
v->prev->next = v->prev = u;
}
void LinkedList :: insert_left(int v)
{
/**
if (head == NULL)
add(head, v);
else
add(head->next, v);
**/
//add(head->prev,v);
add(head->next,v);
}
void LinkedList :: insert_right(int v)
{
add(tail,v);
}
void LinkedList :: remove(Node *v)
{
Node *u = v->prev;
Node *w = v->next;
u->next = w;
w->prev = u;
delete v;
}
void LinkedList :: remove_left()
{
remove(head->next);
}
void LinkedList :: remove_right()
{
remove(tail->prev);
}
bool LinkedList :: empty()
{
return (head->next == tail);
}
void LinkedList :: print_list()
{
Node *tmp = head;
while(tmp != NULL)
{
cout << tmp->data << endl;
tmp = tmp->next;
}
}
void LinkedList :: print_node(Node *n)
{
Node *tmp = n;
cout << tmp->data << endl;
}
Node* LinkedList :: get_first()
{
return head;
}
Node* LinkedList :: get_last()
{
return tail;
}
主文件:
#include <cstdlib>
#include <iostream>
#include "list.cpp"
using namespace std;
int main(int agrc, char **argv)
{
LinkedList *l = new LinkedList();
//LinkedList *m = new LinkedList();
l->insert_left(200);
l->insert_left(700);
l->insert_left(300);
//Node *temp = l->get_first();
l->print_list();
//l->print_node(temp);
delete l;
return 0;
}
运行main之后获得以下输出,说明问题:
0
300
700
200
0
答案 0 :(得分:0)
1)在insert_left函数中使用head而不是head-&gt; next 2)在add()中你已经在head的左边添加了新节点,所以现在应该更新你的头了。
head = u
3)head和tail是你班级的数据成员,那么为什么你需要在函数中传递它们。直接使用它们。 像这样更新你的insert_left函数
void LinkedList :: insert_left(int v)
{
Node *u = new Node;
u->data = d;
u->next = NULL;
if (head == NULL)
{
head = u;
}
else
{
u->next = head;
u->next->prev = u;
head = u;
}
}
同样,您可以使用tail修改insert_right函数。