gpt4 book ai didi

c - 在循环链表开头插入

转载 作者:行者123 更新时间:2023-11-30 20:25:27 25 4
gpt4 key购买 nike

我在开头插入循环链表,但输出打印了一些垃圾值。

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");
}

最佳答案

你有两个问题,一个导致无限列表,另一个导致 undefined behavior .

当您在列表中插入第一个节点时,您会得到无限列表,因为:

head->next=ptr1;

到那时,headptrptr1都指向同一个节点,所以上面的代码你说列表中的下一个节点是......它本身!。

<小时/>

未定义的行为是在另一种情况下,当列表不为空时,其原因与上面的相同的分配:

head->next=ptr1;

这里变量ptr1尚未初始化,未初始化的局部(非静态)变量具有不确定值,并且使用这些变量除非初始化它们会导致未定义的行为。

实际上,未定义的行为不会在赋值时发生,但当您下次尝试取消引用 head->next 时,它就会发生,因为该指针无效。

<小时/>

解决这两个问题的简单方法是什么?不要做最后的作业!

关于c - 在循环链表开头插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28940273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com