Связанный список не работает, если я не объявил вспомогательную переменную как глобальную - PullRequest
0 голосов
/ 06 марта 2020

Я пишу программу для создания односвязного списка. Я использую две переменные-указатели, одна из которых называется «start», которая указывает на первый узел списка, а другая переменная-указатель, которую я использую, называется «t». Я использую этот указатель как вспомогательную переменную, которая помогает в обходе списка, не мешая запуску.
Программа успешно компилируется, но проблема, с которой я сталкиваюсь, заключается в том, что во время выполнения она позволяет мне добавить только один узел к списку. После этого, если я попытаюсь добавить другой узел, выполнение будет остановлено после ввода данных узла.
Я попробовал пару вещей, но сработала только одна из них. Если я объявлю «переменную-указатель помощника» глобальной, программа начнет нормально работать.
Почему это вообще происходит?
Я использую только переменную-указатель помощника «t» в функции для обхода списка, и это даже не общаясь с другой функцией в программе.

Может кто-нибудь объяснить, почему он работает только с глобальным объявлением?

Это код функции ->

void insert()
{

    struct node *newnode;
    struct node *t; //<------this is the helper variable if I declare this locally
                            //then the problem occurs in the run time.                                  
    newnode = create();
    printf("Enter data ");
    scanf("%d",&newnode->info); 
    //printf("Node info = %d",newnode->info);
    if(start==NULL) 
    {
        start=newnode;  <------ this is that start variable which is declared above globally
        start->next=NULL;
        t=newnode;
    }
    else
    {
        t->next=newnode;
        t=newnode;
        t->next=NULL;       
    }   
    printf("%d successfully added to the list.",newnode->info);
}

1 Ответ

0 голосов
/ 06 марта 2020

Переменная t в начале функции является висячим указателем, т.е. на нее нельзя ссылаться. Попробуйте поместить это в блок else до t->next=newnode;

t = start;
while(t->next)
    t = t->next;

Когда вы объявляете его как глобальный (или работает stati c), вы заставляете его вспомнить последнее значение, которое было сохранено в нем, таким образом каждый время не инициируется с висящим указателем.

...