2016-02-15 4 views
-1

В чем проблема при передаче главы списка в качестве параметра в функции?Связанный список, не работает при передаче главы списка в качестве аргумента в функции

#include <stdio.h> 
#include <stdlib.h> 

typedef struct node 
{ 
    int value; 
    struct node* next; 

}node; 
node* h1 = NULL; 

void ubaci(int x, node *head) 
{ 
    node *novi = (node*)malloc(sizeof(node)); 
    novi->value = x; 
    novi->next = head; 
    head = novi; 
} 

void ispisi(node *head) 
{ 
    node *temp = head; 

    while(temp != NULL) 
    { 
     printf("%d -> ",temp->value); 
     temp = temp->next; 
    } 
} 

int main() 
{ 
    int x = 0; 

    while(x<10) 
    { 
     x++; 
     ubaci(x,h1); 
    } 
    ispisi(h1); 

    return 0; 
} 

Это не работает, я не могу понять почему. Но когда я пытаюсь использовать эти функции, не передавая головку списка в качестве аргумента и используя глобальную переменную, он работает отлично. Пример:

void ubaci(int x) 
{ 
    node *novi = (node*)malloc(sizeof(node)); 
    novi->value = x; 
    novi->next = h1; 
    h1 = novi; 
} 

void ispisi() 
{ 
    node *temp = h1; 

    while(temp != NULL) 
    { 
     printf("%d -> ",temp->value); 
     temp = temp->next; 
    } 
} 
+0

Около половины тысяч связного списка вопросов, которые задают на SO есть именно этот вопрос - изменение голова на месте и не возвращает его , –

+0

http://stackoverflow.com/questions/35350749/creating-linked-list-not-passing-back-to-main –

ответ

0

Функциональные параметры являются его локальными переменными. Любое изменение локальной переменной не влияет на исходный аргумент.

Вы должны передать аргументы по ссылке, если хотите изменить их в функции.

Например

void ubaci(int x, node **head) 
{ 
    node *novi = (node*)malloc(sizeof(node)); 
    novi->value = x; 
    novi->next = *head; 
    *head = novi; 
} 

Вызов функции может выглядеть