Lista jednokierunkowa w C

0

Witam
Mam pytanie odnośnie pewnego kodu w C

Lista * ListaWstaw(Lista* head, int a);

int main()
{
    Lista *tmp;
    Lista *head;
    Lista *element=malloc(sizeof(Lista));
    element->a=1;
    element->next=NULL;
    head=element;
    head = ListaWstaw(head,2);
    head = ListaWstaw(head,3);
    head = ListaWstaw(head,4);
    head = ListaWstaw(head,5);
    head = ListaWstaw(head,6);
    for(tmp=head;tmp!=NULL;tmp=tmp->next)
        printf("%d ",tmp->a);

    getch();
    return 0;
}

Lista * ListaWstaw(Lista *head, int a)
{
    Lista *temp=(Lista*)malloc(sizeof(Lista));
    if(temp==NULL)
    {
        printf("Nie mozna przydzielic pamieci\n");
        return 1;
    }
    temp->a=a;
    temp->next=head;
    head=temp;
    return head;
}

ten kod jest w porządku w funkcji main mogę wylistować elementy listy
wcześniej próbowałem robić to tak:

int ListaWstaw(Lista* head, int a);

int main()
{
    Lista *tmp;
    Lista *head;
    Lista *element=malloc(sizeof(Lista));
    element->a=1;
    element->next=NULL;
    head=element;
    ListaWstaw(head,2);
    ListaWstaw(head,3);
    ListaWstaw(head,4);
    ListaWstaw(head,5);
    ListaWstaw(head,6);
    for(tmp=head;tmp!=NULL;tmp=tmp->next)
        printf("%d ",tmp->a);

    getch();
    return 0;
}

int ListaWstaw(Lista *head, int a)
{
    Lista *temp=(Lista*)malloc(sizeof(Lista));
    if(temp==NULL)
    {
        printf("Nie mozna przydzielic pamieci\n");
        return 1;
    }
    temp->a=a;
    temp->next=head;
    head=temp;
    return 0;
}

w tej wersji nie mogłem wylistować wartości elementów listy. Wskaźnik head po wyjściu z funkcji ListaWstaw zawsze wskazywał na pierwszy element.
Myślałem, że w przypadku przekazywania wskaźnika do funkcji ListaWstaw head zawsze będzie wskazywał na kolejno wstawiany element. Dlaczego do funkcji ListaWstaw muszę przekazywać wksaźnik head, dlaczego muszę zwracać wskaźnik head z funkcji ListaWstaw i przypisywać go do head w funkcji main()

0

Powinieneś przekazywać wskaźnik na wskaźnik.

int ListaWstaw(struct Lista **head, int a)
{
    struct Lista *temp=(struct Lista*)malloc(sizeof(struct Lista));
    temp->a=a;
    temp->next= *head;
    *head = temp;
    return 0;
}

i w mainie wywołanie:

ListaWstaw(&head,2);

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0