以下是我的简单双向链表程序,用于插入节点并显示链表,
我在显示链接列表时收到错误
程序中的问题即使我添加了几个新节点,当我选择显示存储的链表时,它显示列表为空, 由于我是新手,我无法找到逻辑错误,请帮助我,
代码如下
#include<iostream>
using namespace std;
class DLL;
class node
{
int data;
class node *next;
class node *prev;
friend class DLL;
node(int x)
{
data=x;
next=NULL;
prev=NULL;
}
};
class DLL
{
node *start;
public: DLL();
void insert();
void display();
};
DLL::DLL()
{
start=NULL;
}
void DLL::insert()
{
class node *p;
int no;
cout<<"enter number";
cin>>no;
p=new node(no);
if(start==NULL)
{
p->next=NULL;
p->prev=NULL;
}
else
{
p->next=start;
p->prev=NULL;
p->next->prev=p;
start=p;
}
}
void DLL::display()
{
node *temp;
temp=start;
if(temp==NULL)
{
cout<<"list is empty\n";
}
else
{
while(temp!=NULL)
{
cout<<temp->data<<"\t";
temp=temp->next;
}
}
}
int main()
{
DLL d1;
int ch=1;
while(ch!=3)
{
cout<<"enter choice\n1 to insert\n2 to display\n";
cin>>ch;
switch(ch)
{
case 1:d1.insert();break;
case 2:d1.display();break;
default:cout<<"wrong input\n";break;
}
}
}
在回顾我的stackoverflow问题时,我发现了这个问题 并意识到初学者可能面临的困难,因此我为我所犯的错误添加了解决方案
逻辑错误在'insert'函数中,我没有指定节点启动,因此它显示空链表
它的解决方案可以如下
void DLL::insert()
{
class node *p;
int no;
cout<<"enter number";
cin>>no;
p=new node(no);
if(start==NULL)
{
p->next=NULL;
p->prev=NULL;
start = p; //this step needs to be added so that start will be assigned a node and not be null
}
else
{
p->next=start;
p->prev=NULL;
p->next->prev=p;
start=p;
}
}
感谢@WhozCraig的回答!
答案 0 :(得分:2)
您永远不会分配初始节点。这是一张纸,一支铅笔和两分钟绘制箭头和方框应该解决的问题,直到你在动态分配中流利习惯做一个< em>很多。
此:
if(start==NULL)
{
p->next=NULL;
p->prev=NULL;
// NOTE: start is still NULL
}
else
{
p->next=start;
p->prev=NULL;
p->next->prev=p;
start=p;
}
应该是这样的:
if(start==NULL)
{
p->next=NULL;
p->prev=NULL;
}
else
{
p->next=start;
p->prev=NULL;
p->next->prev=p;
}
start=p; // NOTE: start always references the last node allocated.
但值得注意的是node
的构造函数已经将您的成员指针next
和prev
设置为NULL
。因此,上述代码可进一步简化为:
if (start != NULL)
{
p->next=start;
start->prev=p;
}
start=p;
那就是说,真正的解决方案是std::list<int>
或std:vector<int>
,但我想你必须从某个地方开始。祝你好运。