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 ...
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