我在开头插入循环链接列表,但输出正在打印一些垃圾值。
typedef struct Node
{
int info;
struct Node *next;
}node;
node *head;
void insert(int x) //x will the value given by the user
{
node *ptr,*ptr1;
//ptr1 for pointing the last node again to first node
ptr=(node*)malloc(sizeof(node));
ptr->info=x;
if(head==NULL)
{
ptr->next=head;
head=ptr;
ptr1=ptr;
}
else
{
ptr->next=head;
head=ptr;
}
head->next=ptr1;
}
void show()
{
node *temp=head;
while(temp!=NULL)
{
printf("%d",temp->info);
temp=temp->next;
}
printf("\n");
}
答案 0 :(得分:1)
你有两个问题,一个导致无限列表,另一个导致undefined behavior。
当您在列表中插入第一个节点时获得的无限列表:
head->next=ptr1;
到那时head
和ptr
和 ptr1
都指向同一个节点,因此通过上面的分配,您可以说明下一个节点列表是......本身!。
未定义的行为是在另一种情况下,当列表不为空时,其原因是与上面相同的分配:
head->next=ptr1;
此处变量ptr1
尚未初始化,未初始化的本地(非静态)变量具有不确定值,并且使用这些变量除了初始化它们导致未定义行为。
实际上,未定义的行为在分配时并不会发生,但是当您下次尝试取消引用head->next
时会发生这种情况,因为该指针无效。
这两个问题的简单解决方案?不要做最后的任务!
答案 1 :(得分:0)
您没有在else {}分支中为ptr1分配任何内容,但稍后您将ptr1值存储为head-> next。由于ptr1未初始化,因此在打印列表时会出现垃圾。