C++ cpp链表程序:显示错误
下面是我的简单双链表程序,用于插入节点并显示链表 我在显示链接列表时出错 程序中的问题是,即使我添加了几个新节点,当我选择显示存储的链接列表时,它也会显示列表为空, 由于我是新手,无法定位逻辑错误,请帮助我解决 代码如下C++ cpp链表程序:显示错误,c++,oop,C++,Oop,下面是我的简单双链表程序,用于插入节点并显示链表 我在显示链接列表时出错 程序中的问题是,即使我添加了几个新节点,当我选择显示存储的链接列表时,它也会显示列表为空, 由于我是新手,无法定位逻辑错误,请帮助我解决 代码如下 #include<iostream> using namespace std; class DLL; class node { int data; class node *next; class node *prev; frien
#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;
}
}
}
#包括
使用名称空间std;
类DLL;
类节点
{
int数据;
类节点*next;
类节点*prev;
好友类动态链接库;
节点(int x)
{
数据=x;
next=NULL;
prev=NULL;
}
};
类DLL
{
节点*启动;
public:DLL();
无效插入();
void display();
};
DLL::DLL()
{
start=NULL;
}
void DLL::insert()
{
类节点*p;
国际贸易编号;
库特诺;
p=新节点(否);
if(start==NULL)
{
p->next=NULL;
p->prev=NULL;
}
其他的
{
p->next=开始;
p->prev=NULL;
p->next->prev=p;
开始=p;
}
}
void DLL::display()
{
节点*温度;
温度=启动;
if(temp==NULL)
{
coutprev=p;
开始=p;
}
}
感谢@WhozCraig对他的回答 您从未分配初始节点。这是一张纸、一支铅笔和两分钟的箭头和方框绘图应该解决的问题,在你熟练掌握动态分配之前,要习惯做很多这类事情 这: 应该是这样的:
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.
但是值得注意的是,节点
的构造函数已经将成员指针next
和prev
设置为NULL
。因此,上述代码可进一步简化为:
if (start != NULL)
{
p->next=start;
start->prev=p;
}
start=p;
也就是说,真正的解决方案是
std::list
或std:vector
,但我认为您必须从某个地方开始。祝你好运。当然我可以帮你:在你编写另一行代码之前,先学习如何使用调试器。如果你的链表是空的(即第一次插入),你永远不会分配start=p
。列表保持为空,并且泄漏了刚才分配的节点。移动start=p代码>从下面的else块中删除,因此它对if
和else
两种情况都无条件执行。(也就是说,在else块的}
结束后移动它)。也许我只是一个整洁的怪胎,但是为什么人们可以让他们的代码完全没有格式,像这样散乱?@WhozCraig这几乎是可以预测的。(LL角的情况),我不能被打扰看:)@ MtTimeMeMs,这就是为什么我用指针来做这些指针(我在C++中根本不做,使用标准库,我相信你也会这样做)。+ 1,我认为铅笔和纸是最被低估的开发工具。
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.
if (start != NULL)
{
p->next=start;
start->prev=p;
}
start=p;