我正在刷新我的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;
}
我运行时遇到代码块崩溃,所以我猜它是一个分段错误。但我无法弄清楚为什么它会悄悄进入这个。
答案 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;
}
}