|
Nun wollen wir unser Programm vom Kapitel zuvor mit einigen Funktionen erweitern. Zuerst schreiben wir eine Funktion zum löschen einer Ganzen Liste auf einmal. Die Funktion bietet eigentlich nicht viel neues...
Zuallererst überprüfen wir wieder ob überhaupt ein Liste zum Löschen vorhanden ist. Anschließend bekommt unser Zeiger zeiger die Adresse vom 2.Element (anfang->next)...
Nun übergeben wir mittels....
...die Adresse des übernächsten von dem Zeiger anfang (In unserem Fall das 3.Element). Sie sehen es ist auch möglich mit next, da ja struct angestellt *next in jeder einzelnen Struktur vorhanden ist, mehrere Adressen zu überspringen. Natürlich könnten sie auch verwenden zeiger=anfang->next->next->next, aber dann wird zu 100% ihr Programm abstürzen oder zumindest ein undefiniertes Verhalten ans Licht bringen, da unser Zeiger zeiger irgendwann auf eine nicht bekannte Adresse zeigen würde die gar nicht vorhanden ist. Bildlich hätten wir somit folgendes...
Nun übergeben wir mit....
...unserem 1.Element als next - Zeiger die Adresse auf die zeiger1 zeigt...
Man könnte somit wieder sagen das wir das Element auf das der Zeiger zeiger zeigt ausgehängt haben. Nun geben wir den Speicher mittels....
...frei. Zuerst "hängen" wir noch den next Zeiger vom Element auf das zeiger1 zeigt aus (müsste jetzt noch nicht sein aber wir wollen es uns gleich so angewöhnen). Anschließend geben wir mit free(zeiger) den Speicher auf den zeiger zeigt frei. Jetzt bekommt nur noch unser Zeiger zeiger die Adresse von zeiger1. Somit sieht es jetzt folgendermaßen aus...
Nun geht es wieder von neuem mit der while - Schleife los wie bildlich ohne Kommentare folgt ...
Somit hätten wir die Abbruchbedienung für unsere while - Schleife. Unser Zeiger zeiger zeigt jetzt auf NULL. Jetzt brauchen wir nur noch den Anfang löschen...
Zur Sicherheit übergeben wir unserem Zeiger auf das 1.Element noch den NULL - Zeiger, da selbst wenn wir den Speicher freigeben, zeigt unser Zeiger anfang immer noch auf die Ursprüngliche Stelle. Dabei kann es leicht zu Programmierfehler kommen.
Die letzte Möglichkeit ist gleichzeitig die schwierigste. Das Element muss irgendwo in der Mitte eingefügt werden.
Diese 4 Möglichkeiten müssen wir nun in einer Funktion durchprüfen und dementsprechende Maßnamen ausführen. Zuerst wieder unser Funktionskopf...
Nun wollen wir unseren 1.Fall überprüfen, nämlich ob überhaupt ein Element in der Liste vorhanden ist...
Falls noch kein Element in der Liste vorhanden ist wird unsere Funktion anhaengen() ausgeführt. Nachdem es schon mindestens ein Element in der Liste gibt wollen wir nun unser neues Element vergleichen.....
Wir durchlaufen nun die ganze Kette so lange bis wir ans Ende gekommen sind (zeiger == NULL) oder bis unser neuer Name größer oder gleich mit dem Namen ist auf dem zeiger->name zeigt. Die erst Möglichkeit die wir nun überprüfen ist ob unser Zeiger zeiger auf NULL zeigt und somit auf das Ende der Kette...
Falls ja brauchen wir wieder nur die Funktion anhaengen, aufrufen und unser neues Element, das ja nun das "größte" ist ans Ende der Liste hängen. Die nächste Möglichkeit die wir haben ist das unser Element das kleinste ist und ganz an den Anfang gehört....
Dies nun bildlich folgendermaßen aus :
Nun haben wir noch ein letzte Möglichkeit. Wir müssen das Element irgendwo dazwischen reinschieben....
Nehmen wir mal an wir müssten zwischen dem 2. und 3. Element eine neues einfügen...
Unser Zeiger zeiger zeigt somit auf das 3. Element. Jetzt benötigen wir mittels...
...die Adresse ein Element vor dem auf das unser Zeiger zeiger zeigt und übergeben diese Adresse an zeiger1...
Nun benötigen wir mittels....
...neuen Speicherplatz für unser neues Element...
Nach der Eingabe unseres neuen Elementes bekommt der next - Zeiger des neuen Elementes die Adresse auf die auch unser next - Zeiger von zeiger1 zeigt...
Somit ergibt sich folgendes Bild.....
Jetzt müssen wir nur noch den next - Zeiger von zeiger1 auf die Adresse zeigen lassen auf die unser Zeiger zeiger zeigt (zeiger1->next=zeiger;)....
Somit hätten wir die Funktion sortiert_eingeben fertig. Hier noch mal die komplette Funktion...
Unser Programm werden wir in den nächsten Kapiteln weiterverwenden und verbessern. Hier und da könnten wir unser Programm jetzt zwar noch ein wenig verbessern, aber das ist jetzt nicht so wichtig. Wichtig ist mir nur das sie die Grundlage von verketteter Listen verstanden haben. Denn Quellcode des Programms können sie hier downloaden : (kette3.c) |