2015-02-28 2 views
0

что не так с этим кодом? Это просто создание списка ссылок и его печать.Ошибка в списке ссылок, указатель

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

struct node{ 
    struct node *next; 
    int data; 
}; 

void printLinklist(struct node *head) 
{ 
    struct node *temp = head; 
    while(temp != NULL) 
    { 
     printf("%d\t",temp->data); 
     temp = temp->next; 
    } 
    printf("\n"); 
} 

void pushData(struct node *head, int val) 
{ 
    struct node *temp = malloc(sizeof (struct node)); 
    temp->next = head; 
    temp->data = val; 
    head = temp; 
} 

int main() 
{ 
    struct node *head = NULL; 
    pushData(head, 1); 
    pushData(head, 2); 
    pushData(head, 3); 
    pushData(head, 4); 
    pushData(head, 5); 

    printLinklist(head); 
} 

Я знаю правильный способ сделать это. Для этого нам придется пройти & голову в функции pushData() и определить аргумент этой функции в виде двойного указателя (заменить голову на * голову в pushData() функции и проходящей & голову в качестве аргумента)

я не могу понять проблему в этом коде.

+1

Что делает правильный путь правильным? Интересно, что вы знаете «как», но не «почему». –

ответ

3

Аргументы всегда passed by value. При вызове pushData() значение head, то есть адрес, хранящийся в переменной указателя, копируется в локальную переменную head функции. Изменение этого параметра не изменит значение переменной head в функции main().

Если вам это нужно, вы должны пройти &head, а затем назначить значение путем разыменования его в функции pushData().

+1

Хорошее объяснение ... это бьет мою ... –

+0

@arjun Спасибо, Ушла идея .. –

1

Проблема заключается в том, что вы назначаете NULL к head в main(), и что никогда не chagnes, он может работать как этот

struct node *pushData(struct node *head, int val) 
{ 
    struct node *temp = malloc(sizeof (struct node)); 
    if (temp == NULL) 
     return NULL; 
    temp->next = head; 
    temp->data = val; 

    return temp; 
} 

и в главном

int main() 
{ 
    struct node *head; 

    head = pushData(head, 1); 
    head = pushData(head, 2); 
    head = pushData(head, 3); 
    head = pushData(head, 4); 
    head = pushData(head, 5); 

    printLinklist(head); 
} 

передавая указатель только изменяет данные указатель указывает на, но не на указатель.

Так что в вашем pushData() функции, вы делаете это

head = temp; 

который изменяет локальный указатель, и делает это указатель на темп, но когда функция возвращает изменение теряется.

Когда вы передаете адрес head как &head, а затем вы можете изменить указатель, потому что ваш head указатель будет указывать на сам указатель вместо данных указатель указывает.

+0

спасибо, хорошая работа вокруг проблемы. –

Смежные вопросы