Бесконечный цикл при создании связанного списка - PullRequest
0 голосов
/ 01 октября 2019

Для создания связанного списка я сделал новый узел статическим, а не динамическим, и теперь мой цикл функции отображения преобразован в бесконечный цикл. Почему?

Структура узла

#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 голосов
/ 02 октября 2019

Основная проблема не в вашей функции отображения, а в том, что вы создаете список ссылок.

Переменная, объявленная как статическая в функции, сохраняет свое состояние, поэтому в основном ее адрес всегда будет одинаковым.

В вашем случае ваш x инициализируется только один раз и всегда сохраняет один и тот же адрес.
В первой итерации цикла temp будет иметь тот же адрес x, голова будет иметьтот же адрес 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 сохраняет свой старый адрес, затем temp снова тот же адрес. На этот раз мы перейдем к другой части, у 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, и это проблема с созданным вами статическим узлом. потому что вы думали, что он будет создавать новый экземпляр каждый раз. Указанный вами узел указывает на собственный адрес.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...