簡體   English   中英

鏈表創建中的無限循環

[英]Infinite loop in creation of linked list

為了創建鏈表,我將新節點設置為 static 節點而不是動態節點,現在我的顯示 function 循環被轉換為無限循環,為什么?

節點結構

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

我所做的唯一更改是在此 function 中,更改后它也運行良好。

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

我做了一個 static 節點“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;
}

這是顯示function,這里的改動導致的問題

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

為什么會這樣,雖然當我動態分配 memory 時該程序運行良好,但是在將 static 節點作為新節點后,正在創建無限循環???

主要問題不在您的顯示 function 中,而是在您創建鏈接列表時。

在 function 中聲明的變量 static 保留其 state 所以基本上它的地址將始終相同。

在您的情況下,您的 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 的第二次迭代中保留它的舊地址,然后再次臨時保存相同的地址。 這次我們 go 到 else 部分,p 將有頭的地址,即 x 的地址。 現在 p->next 將指向 temp 的地址,它也是 x 的地址。

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

所以 x 的地址在 temp, head, head->next 中,這是您創建的 static 節點的問題,因為您認為它每次都會創建新實例。 您指向創建的節點是自己的地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM