Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ cpp链表程序:显示错误_C++_Oop - Fatal编程技术网

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;