[C] struktura dynamiczna listy jednokierunkowej, petla

0
    FILE *plik;
    int znaki=0,i=0, pom;
    char a;
    char wyraz[255];
    
    struct slowa lista;
    struct slowa *head, *current;
    
    head=NULL;
    
    plik=fopen(name, "r");
    
    while((a=fscanf(plik, "%s", &wyraz))!= EOF)
    {
                          pom=0;
                          current=head;
    
                          //sprawdzenie czy dane slowo juz sie znajduje na liscie
                          do
                          { printf("%s", wyraz);
                                       if((strcmp(wyraz,lista.slowo))==0)
                                       {
                                                                       ++(lista.wystap);
                                                                       pom=1;
                                                                       break;
                                       }
                                       current=lista.nast;
                          } while(current!=NULL);

Siedze juz nad tym jakis czas i nie mam pojecia czemu petla do while nigdy nie moze sie skonczyc. wynika z tego ze current nigdy nie osiaga wartosci NULL czyl tak jakby lista sie nie konczyla, a przeciez musi. Jakies pomysly?

0

Jak wygląda struktura slowa ?? Z tego co widze to pole lista.nast niegdzie się nie zmienia wiec tak jak wspomniałeś current nigdy nie osiągnie NULL...

0

Otóż tak, struct slowa lista jest alokowana, ale nie zainicjalizowana, co znaczy, że sa w niej smiecie. Podstawiając pod current wartość niezaalokowanej lista.nast, podstawiasz tam w rzeczywistości losowe dane. current jako wskaźnik interpretuje te śmiecie jako adres w pamięci, i tam zaczyna wskazywać, więc dopóki losowe dane się magicznie nie wyzerują (NULL), pętla nigdy nie przestanie działać.

0

a w jaki sposob moge te pamiec zainicjowac? dodam jeszcze ze po zmianie na current=current->nast; z current=lista.nast wyskakuje mi seg fault.

0

Primo - na przyszłość pamiętaj, że wszystko musisz inicjalizować, podobnie jak piszesz int i; to wcale nie spodziewasz sie, że będzie z miejsca równy zero, zwykle robisz to sam.
Secundo - na Twoim miejscu przerobiłbym struct slowo lista na wskaźnik, nie wiem, jaki jest sens robienia listy, w której jeden element będzie zmienną, a reszta tworzona przez wskaźniki.
Tertio - to, co powinno Ci pomóc, to wpisanie:
lista.nast=NULL;
lista.slowo="";
lista.wystap=0;

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