cpp链表程序:显示错误

时间:2014-06-27 18:19:27

标签: c++ oop

以下是我的简单双向链表程序,用于插入节点并显示链表,

我在显示链接列表时收到错误

程序中的问题即使我添加了几个新节点,当我选择显示存储的链表时,它显示列表为空, 由于我是新手,我无法找到逻辑错误,请帮助我,

代码如下

#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的回答!

1 个答案:

答案 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的构造函数已经将您的成员指针nextprev设置为NULL。因此,上述代码可进一步简化为:

if (start != NULL)
{
    p->next=start;
    start->prev=p;
}
start=p;

那就是说,真正的解决方案是std::list<int>std:vector<int>,但我想你必须从某个地方开始。祝你好运。