Ćwiczenie 8 - struktury, operacje na napisach, listy jednokierunkowe

Polecane strony manuala:

  1. strcpy(3)
  2. strcmp(3)

Przykłady pomocnicze:

  1. structure1.c - przykładowa prosta struktura.
  2. string.c - operacje na ciągach znaków - kopiowanie i porównywanie.
  3. structure2.c - struktura, oraz przykład użycia wskaźnika do struktury.
  4. types.c - kilka przykładowych definicji typów.
  5. list.c - przykład prostej listy jednokierunkowej.
  6. list2.c - powyższy przykład, przerobiony tak, by działał w sposób bardziej ogólny, tzn. dla dowolnej długości listy.

Operacje na napisach

W języku C napisy reprezentowane są przez tablice znaków (tablice typu char), każdy napis jest zakończony przez znak '\0':

napis

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:

Listy jednokierunkowe

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:

lista jednokierunkowa

Zaletą takiej listy jest dogodność z jaką możemy wstawić w jej środek dodatkowy element:

wstawianie elementu do listy

Więcej na temat list:

Zadanie:

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:


Opracował Mikołaj Sitarz <sitarz@gmail.com>