[C] Dziwnie zachowująca się funkcja dodająca do listy

0

Dostałem zadanie, aby stworzyć funkcję tworzącą skorowidz na podstawie pliku tekstowego, czyli np. jeśli plik zawiera "qq abc qq ala ma kota abc abc", program powinien wyświetlić:
abc: 3
ala: 1
kota: 1
ma: 1
qq: 2

Napisałem funkcję, jednak, jeżeli używam jej do odczytywania z pliku to wyświetla jedynie ostatni wyraz i liczbę wszystkich słów. Jeżeli dodaje słowa nie z pliku to jest wszystko ok. Ktoś wie, czemu tak różnie się zachowuje ta funkcja? Czy możliwe, że pobieranie słowa z pliku jest tutaj niepoprawne? Poniżej program, który odczytuje z pliku, a tutaj druga wersja "działająca": http://pastebin.com/KG0H5Vu1

#include <stdio.h>
#include <malloc.h>
#include <string.h>

typedef struct l
{
    int ilosc;
    char *wyraz;
    struct l *next;
} ll;

void dodaj(ll **head, char *s);
void wyswietl(ll *head);

int main(int argc, char *argv[])
{
    FILE *wp;
    wp = fopen(argv[1], "r");
    char slowo[50];

    ll *head = NULL;

    while(!feof(wp))
    {
        fscanf(wp, "%s", &slowo);
        dodaj(&head, slowo);
    }
    wyswietl(head);

    return 0;
}

void wyswietl(ll *head)
{
    while(head)
    {
        printf("%s: %d\n", head->wyraz, head->ilosc);
        head = head->next;
    }
    putchar('\n');
}

void dodaj(ll **head, char *s)
{
    ll *walker = *head, *new, *prev;
    new = (ll *)malloc(sizeof(ll));
    new->next = NULL;
    new->wyraz = s;
    new->ilosc = 1;

    if(*head == NULL) *head = new;
    else if(strcmp(s,walker->wyraz) < 0)
    {
        new->next = *head;
        *head = new;
    }
    else
    {
        while(walker && strcmp(s,walker->wyraz) > 0)
        {
            prev = walker;
            walker = walker->next;
        }
        if(walker && strcmp(s,walker->wyraz))
        {
            new->next = prev->next;
            prev->next = new;
        }
        else if(!walker)
        {
            new->next = prev->next;
            prev->next = new;
        }
        else if(!strcmp(s,walker->wyraz)) (walker->ilosc)++;
    }
}
1

Przy odczycie w pętle wszystkie wskaźniki ll::wyraz wskazują na char slowo[50]; z funkcji main.
Użyj strdup().

0

Dzięki wielkie, działa, do zamknięcia.

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