Lista to struktura dynamiczna zawierająca składowe zdefiniowane tak samo jak lista (rekurencyjnie) i wskazujące na inne elementy listy (jeden element wskazuje na inny).
Listy możemy podzielić na:
• jednokierunkowe,
• dwukierunkowe,
• wielokierunkowe.
Przykład takiej listy:
struct LISTA { struct LISTA *next;
Do definicji pól dowolnego elementu takiej struktury używana jest definicja pojedynczego jej elementu. To znaczy, że obiekt LISTA zawiera pola, które definiowane są tak samo, jak LISTA, rekurencyjnie. Nie ma jednak obawy o pozorną nieskończoność takiej struktury. Definicja pola next oznacza, że jest to wskaźnik, a nie sama struktura Zatem, w momencie definicji, wskaźnik ten istnieje, ale nie istnieje żaden obiekt przez niego wskazywany. Dopiero w przyszłości będzie on pokazywał na takie same elementy typu LISTA, wewnątrz jakiego sam się znajduje. W praktyce do struktury tego typu wprowadza się jeszcze jakieś pola przechowujące informacje, np.
struct TNode {
TNode *next; int nrdl;
Właściwością tej struktury jest zdolność do przechowywania liczb całkowitych (w polu o nazwie nrdl).
Inna lista jednokierunkowa:
struct TListNode {
TListNode *nastepny; void *dane;
posiada zdolność do przechowywania wskaźników na obiekty dowolnego typu. Można w ten sposób przechowywać wskaźniki do liczb, napisów', tablic, funkcji i wszystkiego, co posiada adres. Oczywiście obsługa tak przechowywanych adresów wymaga potem umiejętnej oceny, czym jest akurat przechowywany wskaźnik, ale to już problemy innej natury.
Gdy do pojedynczego elementu typu na przykład LISTA dopiszemy następny, wstawiając w polu next adres nowego elementu, otrzymamy "połączenie" pomiędzy' elementami - z pierwszego można trafić do drugiego za pomocą wskaźnika. Odwrotnie już nie - drugi
Strona 3 z 41