21.11.2013 Aufrufe

Eine Einführung in die Programmiersprache C und die Grundlagen ...

Eine Einführung in die Programmiersprache C und die Grundlagen ...

Eine Einführung in die Programmiersprache C und die Grundlagen ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

<strong>E<strong>in</strong>e</strong> <strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>die</strong> Informatik <strong>und</strong> <strong>die</strong> <strong>Programmiersprache</strong> C<br />

27 Listen<br />

Arrays s<strong>in</strong>d <strong>die</strong> e<strong>in</strong>fachste Form, um e<strong>in</strong>e Menge von Daten zu verwalten. Sobald aber <strong>die</strong> e<strong>in</strong>zelnen<br />

Datenelemente e<strong>in</strong>e gewisse Grösse erreichen oder häufig Daten zwischen bestehenden Elementen<br />

e<strong>in</strong>gefügt oder entfernt werden sollen, wird sehr viel Zeit mit kopieren von Daten verbracht.<br />

<strong>E<strong>in</strong>e</strong> Lösung für <strong>die</strong>ses Problem bietet <strong>die</strong> Verwendung von Listen. <strong>E<strong>in</strong>e</strong> Liste kann man sich wie<br />

e<strong>in</strong>e Kette vorstellen, jeder Datensatz ist wie e<strong>in</strong> Kettenglied jeweils mit se<strong>in</strong>en direkten Nachbarn<br />

verb<strong>und</strong>en. Wenn man nun e<strong>in</strong>en Datensatz e<strong>in</strong>fügen oder entfernen will, muss dazu nicht <strong>die</strong> ganze<br />

Liste geändert werden, es betrifft nur <strong>die</strong> direkten Nachbarn.<br />

Diese Verb<strong>in</strong>dungen der Nachbarn untere<strong>in</strong>ander werden <strong>in</strong> C normalerweise mit Zeigern realisiert.<br />

27.1 E<strong>in</strong>fach verkettete Liste<br />

Bei e<strong>in</strong>er e<strong>in</strong>fach verketteten Liste hat jedes Datenelement e<strong>in</strong>en Zeiger, der auf se<strong>in</strong>en Nachfolger<br />

zeigt. Der Zeiger des letzten Elements zeigt auf NULL.<br />

Im e<strong>in</strong>fachsten Fall hat <strong>die</strong> Liste noch e<strong>in</strong>en Zeiger (Head) der auf den Anfang der Liste zeigt.<br />

Head Element 1 Element 2 Element 3 Element 4 Element 5<br />

Wenn man häufig auf Elemente am Listenende zugreifen will (Queue) empfiehlt sich der E<strong>in</strong>satz<br />

e<strong>in</strong>es weiteren Zeigers, der ständig auf das letzte Element der Liste zeigt.<br />

Head Element 1 Element 2 Element 3 Element 4 Element 5<br />

Tail<br />

E<strong>in</strong> Datenelement e<strong>in</strong>er Liste weist <strong>in</strong> C üblicherweise folgende Struktur auf:<br />

struct Listenelement {<br />

/* Hier kommen <strong>die</strong> Daten <strong>die</strong> gespeichert werden sollen */<br />

/* (Z.B. struct Student Daten; oder wie hier e<strong>in</strong> simpler <strong>in</strong>t */<br />

<strong>in</strong>t Wert;<br />

}<br />

/* Und hier das wichtigste: <strong>E<strong>in</strong>e</strong>n Zeiger auf den Nachfolger */<br />

struct Listenelement *Next;<br />

Und nun <strong>die</strong> 'Verankerung' der Liste: M<strong>in</strong>destens der Zeiger auf den Anfang ist unverzichtbar, sonst<br />

weiss man ja nicht wo <strong>die</strong> Liste beg<strong>in</strong>nt.<br />

struct Listenelement * Head; /* Zeiger auf den Listenanfang */<br />

struct Listenelement * Tail; /* Zeiger auf das Listenende */<br />

Die beiden Zeiger müssen bei e<strong>in</strong>er leeren Liste auf NULL gesetzt werden.<br />

Neue Listenelemente werden bei bedarf mit malloc() erzeugt <strong>und</strong> mit free() wieder freigegeben<br />

(Mit e<strong>in</strong>em typedef könnte man sich e<strong>in</strong>ige Schreibarbeit ersparen):<br />

struct Listenelement * Neues; /* Zeiger auf neues Element*/<br />

Neues = (struct Listenelement *) malloc(sizeof(struct Listenelement ));<br />

....<br />

free(Neues);<br />

Gedruckt am 10.09.2009 14:23:00 Letzte Änderung am: 10. September 2009 Version 2.4.1, I. Oesch 102/147

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!