我的链表代码出现了严重错误

时间:2014-09-23 13:38:49

标签: c++ list pointers

我正在刷新我的C ++编码技巧进行面试,我正在尝试理解我为链接列表编写的代码中的错误

struct Node
{
    int data;
    Node *next;
} *Head ;

void ListInit()
{
  Head = NULL;
}

void addfront(Node *Head, int data)
{
    Node *newnode = new Node;
    newnode->data = data;
    newnode->next = Head;
    Head = newnode;
}

void displaylist(Node *Head)
{
    Node *cur;
    cur = Head;
    if(cur==NULL)
    {
        cout<<"List is Empty ! ";
    }

    while(cur->next!=NULL)
    {
        cout<<"  "<<cur->data<<"  ";
        cur = cur->next;
    }
}

int main()
{
    ListInit();
    addfront(Head,5);
    addfront(Head,6);
    addfront(Head,8);
    addfront(Head,1);
    addfront(Head,9);

    displaylist(Head);
    return 0;
}

我运行时遇到代码块崩溃,所以我猜它是一个分段错误。但我无法弄清楚为什么它会悄悄进入这个。

3 个答案:

答案 0 :(得分:3)

Itjax 已经回答了您的问题,但除了Itjax建议您还需要更改此更改之外:

if(cur==NULL)
{
    cout<<"List is Empty ! ";
}

if(cur==NULL)
{
    cout<<"List is Empty ! ";
    return;
}

否则,当您的列表为空时,您的代码将再次崩溃。

答案 1 :(得分:2)

问题是您只是在addFront中修改Head指针的副本。尝试通过将其作为参考来更改原始文件:

void addfront(Node*& Head, int data) // note the extra &
{
    Node *newnode = new Node;
    newnode->data = data;
    newnode->next = Head;
    Head = newnode;
}

答案 2 :(得分:1)

ltjax是对的。在函数addfront()中,您可以更改局部变量Head的值,该变量与全局变量具有相同的名称。不要那样做!这是一种非常糟糕的风格。 此外,应用程序不会丢失,然后函数displaylist()作为其他内容作出反应而不是显示消息。在消息结束后使用return:

if (cur == NULL) 
{
    cout << "List is Empty!"; 
    return; 
}

或继续沿着分支循环:

if (cur == NULL)
{
    cout << "List is Empty!";
}
else
{
    while (cur-> next! = NULL)
    {
        cout << "" << cur-> data << "";
        cur = cur-> next;
    }
}