W języku C napisy reprezentowane są przez tablice znaków (tablice typu
char
), każdy napis jest zakończony przez znak
'\0'
:
Gdy kopiujemy lub konstruujemy napis - ważne jest by zwrócić uwagę na to czy
nie przekraczamy zadeklarowanej długości napisu (i powodujemy przez to
nadpisanie innego obszaru pamięci), oraz czy funkcje których używamy - terminują
go znakiem '\0'
. Napis nie posiadający takiego terminatora - może
być również źródłem kłopotów - gdyż standardowe funkcje operujące na napisach
przeszukują je aż do wystąpienia '\0'
...
Więcej informacji na temat napisów:
Lista jednokierunkowa to ciąg struktur (czyli obszarów pamięci reprezentowanych
w języku C przez zmienne typu struct
) takich, że każda struktura
zawiera oprócz odpowiednich danych wskaźnik do następnej struktury. Struktura
kończąca listę - zawiera wskaźnik do NULL
. Strukturę na samym
początku takiej listy nazywamy korzeniem. Listę taką, można schematycznie
przedstawić, jak na poniższym rysunku:
Zaletą takiej listy jest dogodność z jaką możemy wstawić w jej środek dodatkowy element:
Więcej na temat list:
Proszę dokładnie przejrzeć, skompilować i uruchomić podane przykłady
pomocnicze.
Następnie proszę napisać program, który tworzy skorowidz na podstawie pliku
tekstowego podanego jako argument wywołania, przy użyciu listy jednokierunkowej.
Skorowidz powinien zawierać alfabetyczną listę wystąpień wszystkich słów w danym
tekście, wraz z liczbą wystąpień danego słowa (przez słowo rozumiemy każdy ciąg
znaków niezawierający znaków "białych" tzn. spacji, tabulatora, znaku nowej
linii itd. czyli tak jak wczytuje je funkcja scanf
). Zatem dla
tekstu:
qq abc qq ala ma kota abc abc
,
program powinien wyświetlić:
abc: 3
ala: 1
kota: 1
ma: 1
qq: 2
Struktura w zadaniu powinna zawierać trzy pola:
Listę w naszym przykładzie najlepiej tworzyć - od razu ją sortując, tzn. każde
nowo wczytane słowo (element struktury) jest porównywane z kolejnymi z listy
(przy użyciu funkcji strcmp
), a następnie
cała struktura umieszczana jest w odpowiednim miejscu w liście.
Jeśli w liście wystąpiło już takie słowo (wystąpiło już wcześniej we wczytanym
tekście), wówczas tylko zwiększamy licznik w odpowiadającej mu
strukturze o 1.
W celu ułatwienia zadania, można posłużyć się przygotowanym "szablonem":
index.c. Zawiera on już drobne, pomocnicze fragmenty
programu.
Program proszę przetestować na pliku:
example.txt i porównać wynik z rozwiązaniem:
solution.txt.
*
Zadanie dodatkowe (nieobowiązkowe):
Proszę tak zmodyfikować powyższy program, aby:
isalpha(3)
- isdigit(3)
;
locale
(czyli np.
potrafił sortować poprawnie z użyciem polskich znaków). Patrz strony
manuala: locale(7), setlocale(3), strcoll(3)
;
tolower(3)
;