gpt4 book ai didi

c - 创建链表时无限循环

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

为了创建链表,我将新节点设置为静态节点而不是动态节点,现在我的显示函数循环转换为无限循环,为什么?

节点结构

#include <stdio.h>
typedef struct node
{
int data;
struct node* next;
}node;

我所做的唯一改变是在这个函数中,并且在更改后它也工作得很好。

node *  createLinkedList(int n)
{
int i=0;
node * head=NULL;
node * temp=NULL;
node * p=NULL;

for(i=0;i<n;i++)

我从这里更改了我的代码,而不是编写

temp=(node *)malloc(sizeof(node));

我创建了一个静态节点“x”。

    {
node x; // instead of malloc I made a static node.
x.next=NULL;
printf("Enter data in node %d: ",i+1);
scanf("%d",&(x.data));
temp=&x;

if(head == NULL)
{
head=temp;
}
else
{
p=head;
while(p->next != NULL)
{
p=p->next;
}
p->next=temp;
}
}
return head;
}

这是显示功能,更改导致问题

void display(node * p)
{
node * temp=p;

这里正在转换为无限循环。

    while(temp->next != NULL)
{
printf("\t%d->",temp->data); //Due to static node this became an infinite loop , Why?
temp=temp->next;
}
}

为什么会这样,虽然当我动态分配内存时这个程序工作正常,但在将静态节点作为新节点后,正在创建无限循环???

最佳答案

主要问题不在于您的显示功能,而在于您创建链接列表时。

在函数中声明为静态的变量会保留其状态,因此基本上它的地址始终相同。

在您的情况下,您的 x 仅初始化一次并始终保留相同的地址。
在循环的第一次迭代中, temp 将具有相同的 x 地址, head 将具有相同的 x 地址。

        node x;                             // instead of malloc I made a static node. 
x.next=NULL;
printf("Enter data in node %d: ",i+1);
scanf("%d",&(x.data));
temp=&x;

if(head == NULL)
{
head=temp;
}

然后在循环 x 的第二次迭代中保留其旧地址,然后再次临时使用相同的地址。这次我们进入 else 部分,p 将获得 head 的地址,即 x 的地址。现在 p->next 将指向 temp 的地址,这也是 x 的地址。

else
{
p=head;
while(p->next != NULL)
{
p=p->next;
}
p->next=temp;
}

所以 x 的地址位于 temp, head, head->next 中,这是您创建的静态节点的问题,因为您认为它每次都会创建新实例。您所创建的节点指向的是自己的地址。

关于c - 创建链表时无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58192128/

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