链表创建中的无限循环

时间:2019-10-01 20:53:16

标签: c data-structures infinite-loop

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

节点的结构

#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;
    }
}

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

1 个答案:

答案 0 :(得分:1)

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

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

在您的情况下,您的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的第二次迭代中保留它的旧地址,然后再次临时修改相同的地址。这次我们转到其他部分,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,这是您创建的静态节点的问题,因为您一直认为它每次都会创建新实例。您指向的节点就是自己的地址。