我在双向链表类上遇到一些困难,这是我的大学项目的一部分。该类的代码如下:
class container
{
public:
class node
{
public:
node * prev;
node * next;
int value;
};
container(int v);
node *start; // first element of the list
node *finish; // last element of the list
void insert_start(node *start, int val);
void print_container();
}
函数insert_start应该将元素添加到列表的开头。代码如下:
void container :: insert_start(node *start, int val)
{
if(start!=NULL)
{
cout << "in insert_start" << endl;
cout << "number added:" << val << endl;
node *element = new node;
element->value=val;
element->next=start;
start=element;
start->prev=NULL;
}
else
{
cout << "List is empty" << endl;
}
}
并且函数print_container应该打印我的链表。代码如下:
void container::print_container()
{
node *tmp;
tmp = start;
while(tmp!=nullptr)
{
cout << tmp->value << endl;
tmp=tmp->next;
}
}
不幸的是,我的程序有两个问题。首先,它
似乎在数据结构的添加元素中添加了相同的随机值。其次,在执行函数print_container期间存在分段错误。我想这可能是insert_start函数中的一个(或多个)错误,但是我对此不太确定。
这是测试程序:
int main(void)
{
int how_many_pieces;
container L(6);
L.insert_finish(L.finish,3);
cout << "added element: " << L.finish->value << endl;
L.insert_start(L.start,8);
cout << "added element: " << L.start->value << endl;
L.insert_start(L.start,12);
cout << "added element: " << L.start->value << endl;
//show elements of the L list
L.print_container();
cout << "\n";
return 0;
}
感谢您的任何帮助。
最佳答案
首先,不要将节点作为参数传递-不需要。容器类已经可以看到开始和结束节点,并且将它们传递进来只会使事情变得困惑。
其次,您应该将这些设置为私有(private),以便使用该类的任何人都必须使用您的insert_start或insert_finish函数。
新类将如下所示:
class container
{
private:
class node
{
public:
node * prev;
node * next;
int value;
};
node *start; // first element of the list
node *finish; // last element of the list
public:
container(int v);
void insert_start(int val);
void print_container();
};
第三,确保设置每个方向的链接。例如,在您的insert_start函数中:
node *element = new node;
element->value = val;
element->next = start;
element->prev = NULL;
start->prev = element; //This part was missing
start = element;
无需将原始节点返回到新节点,您就将其视为普通的单链接列表。如果要使用双向链接列表提供的遍历灵活性,则需要正确设置链接。
关于c++ - C++双链表打印,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34602630/