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)++;
}
}