[C] Lista jednokierunkowa

0

Witam,

nie cierpię załatwiać podobnych spraw w ten sposób ("co jest źle w moim kodzie?"), ale niestety czas mnie nagli.
Poniższy kod pisałem posługując się różnymi źródłami, ale pomimo tego, coś dalej jest nie tak.
Od 2ch godzin nie mogę znaleźć sposobu na poprawne działanie mojej listy.

W poniższym "stanie" ( po walce z różnymi *, & itp. ) funkcja wypisująca listę ciągle mówi, że lista jest pusta ( oczywiście po dodaniu elementów).

Gdyby komuś chciało się zerknąć i powiedzieć co jest nie tak, będę bardzo zobowiązany...

#include<stdio.h>
#include<conio.h>

typedef struct rekord {
       char imie[20];
       char nazwisko[20];
       int rok_ur;
      
       struct rekord* next;
       } rekord;

void dodaj_na_poczatek(rekord *head)
{
     rekord *nowy = NULL;
     
     nowy = malloc(sizeof(rekord));
     if( nowy == NULL )
     {
         printf("NIE UDALO SIE PRZYDZIELANIE PAMIECI !!!");
         system("pause");
         return;
     }
     
     printf("Podaj imie : ");
     fgets(nowy->imie, 20, stdin);
     printf("Podaj nazwisko : ");
     fgets(nowy->nazwisko, 20, stdin);
     printf("Podaj rok urodzenia : ");
     scanf("%d", &(nowy->rok_ur));
     fflush(stdin);
     
     nowy->next = head;
     head = nowy;
}

void dodaj_na_koniec(rekord *head)
{
     rekord *wsk = head, *nowy = NULL;
     
     if( head != NULL ) while( wsk->next != NULL ) wsk = wsk->next;
     
     nowy = malloc(sizeof(rekord));
     if( nowy == NULL )
     {
         printf("NIE UDALO SIE PRZYDZIELANIE PAMIECI !!!");
         system("pause");
         return;
     }
     
     printf("Podaj imie : ");
     fgets(nowy->imie, 20, stdin);
     printf("Podaj nazwisko : ");
     fgets(nowy->nazwisko, 20, stdin);
     printf("Podaj rok urodzenia : ");
     scanf("%d", &(nowy->rok_ur));
     fflush(stdin);
     
     nowy->next = NULL;
     
     if ( head != NULL ) wsk->next = nowy;
     else head = nowy;
}
     

void wypisz_liste(rekord *head)
{
     rekord *wsk = head;
     
     if( wsk == NULL )
     {
         printf("Lista jest pusta...\n");
         system("pause");
         return;
     }
     
     while(wsk != NULL);
     {
         fputs(wsk->imie, stdout);
         fputs(wsk->imie, stdout);
         printf("%d\n", wsk->rok_ur);
         
         wsk = wsk->next;
     }
     
     system("pause");
}

int main()
{
      char akcja = ' ';
     
      rekord *head = NULL;
     
      while( akcja != 'Q' && akcja != 'q' )
      {
             system("cls");
            
             printf("Co robic?\n");
             printf("1) Wyswietl liste\n");
             printf("2) Dodaj element na paczatek listy\n");
             printf("3) Dodaj element na koniec listy\n\n");
             printf("Q) Zakoncz\n\n");
                         
             akcja = getch();
            
             if( akcja == '1' ) wypisz_liste(head);
             if( akcja == '2' ) dodaj_na_poczatek(head);
             if( akcja == '3' ) dodaj_na_koniec(head);
      }
         
      return 0;
}
0

Witam!
Robiac cos takiego:

 
function(rekord* head)
{
   rekord* foo = new rekord;
   head = foo;
}

Robisz cos analogicznego do np. tego:

function(int a)
{
int b = 2;
a = b;
}


Nie zmieniasz wartosci przekazanego parametru. Head jest jedynie kopia przekazanego wskaznika i po zakonczeniu funkcji przestanie istniec. Musisz uzyc tutaj referencji lub wskaznika (w tym wypadku wskaznika na wskaznik).

Przykladowo:

```cpp
 
function(rekord* &head)
{
   rekord* foo = new rekord;
   head = foo;
}

Powinno dzialac tak jak chcesz

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