Kleine Sektflaschen Hochzeit
Dafür muss man die Kette allerdings wieder zusammensetzen: Der Vorgänger der zu entfernenden Node muss auf den Nachfolger der zu entfernenden Node zeigen. void DeleteNode ( struct AddressNode * prevNode, struct AddressNode * toBeRemoved) prevNode - > Next = toBeRemoved - > Next; free ( toBeRemoved);} Indizierung Hierfür muss das vorherige Element bekannt sein. Dies kann man zum Beispiel herausfinden, wenn man sich den Kopf der Liste merkt und zunächst einmal den eigenen Index in der Liste herausfindet. Dafür muss die Liste durchlaufen werden, bis das gesuchte Element gefunden ist. Dynamische Datenstrukturen — Grundkurs C 0.2.0d Dokumentation. int GetIndex ( struct AddressNode * head, struct AddressNode * element) int index = 0; while ( head! = element && element! = NULL) index ++; element = elemnt - > Next;} /* index zurückgeben, wenn gefunden */ if ( head == element) return index; /* Falls nicht gefunden, Fehler zurückgeben */ return - 1;} Da der Zeiger element beim Aufruf der Funktion kopiert wird, die Variable element also für diese Funktion extra angelegt wird, können wir diese Variable auch ändern, da wir den ursprünglichen Wert im Verlauf der Funktion nicht mehr benötigen.
= NULL) { vorheriges_buch -> naechstes = neues_buch;} //Erstes Buch initialisieren if( erstes_buch == NULL) { erstes_buch = neues_buch;} //Datensatz einlesen eingabe ( neues_buch); vorheriges_buch = neues_buch; break;} //Suche aufrufen case 2: suche ( erstes_buch); break; //Alle Buecher ausgeben case 3: ausgabeAlle ( erstes_buch); break; //Ein Buch loeschen case 4: erstes_buch = loeschen ( erstes_buch);}} while ( wahl!
Verkettete Listen (Zeiger in Strukturen) Nächste Seite: Aufgaben Aufwärts: Pointer Vorherige Seite: Vektoren von Zeigern Inhalt Bevor wir in das Thema der dynamischen Datenstrukturen einsteigen, hier noch etwas neue C-Syntax: Gegeben sei struct note { int tonhoehe; double dauer;... }; Dann gibt es natuerlich auch: struct note * np; Wenden wir die bisher bekannten Syntagmen an, müßten wir, um an das Feld tonhoehe des Objektes zu kommen, auf das np zeigt, schreiben: (*np). tonhoehe Dafür gibt es in C eine Abkürzung: np -> tonhoehe Allgemein: p -> f bedeutet: Das Feld f der Struktur, auf die p zeigt. Kombinieren wur einiges, was wir bisher wissen, dann kommen wir zu ganz interessanten Datenstrukturen: Eine Zeigervariable kann ein Feld innerhalb einer Struktur sein. Eine Zeigervariable kann auf Strukturen zeigen. Proggen.org - Einfach verkettete Listen - Raum für Ideen. Eine Zeigervariable als Feld einer Struktur kann auf eine Struktur gleichen Typs zeigen Strukturen können dynamisch alloziert werden. Damit können wir also deklarieren: struct item { struct item * next; int daten;}; struct list { struct item * start; struct item * end;}; und damit Datenstrukturen wie in Abb.
= 1) { vorheriges_buch = vorheriges_buch -> naechstes;}} return erstes_buch;}
Einführung Stellen wir uns vor, wir schreiben ein Programm, welches eine Filmsammlung verwalten soll. Einfachheitshalber werden nur Merkmale wie Titel, Erscheinungsjahr und Genre erfasst. Diese Daten werden in einer Datenstruktur zusammengefasst. struct Film { std::string titel; unsigned int jahr; int genre;}; Jetzt stellt sich die Frage wie die Filme in unserem Programm intern dargestellt werden. Man könnte ein Array mit Filmen anlegen. const int filmAnzahl = 100; Film filme[filmAnzahl]; So weit so gut. Wir programmieren das Programm fertig und verschicken es an alle unseren Bekannte und Freunde. Es dauert nicht lange bis sich einer von ihren beschwert, dass das Programm nicht mehr als 100 Filme verwalten kann. Es bleib uns nichts anderes übrig als den Quellecode des Programms abzuändern um die Filmenanzahl anzupassen. Einfach verkettete listen java. Nicht gerade optimal. Man könnte auch gleich ein Array für 10000 Filme anlegen, damit auch der größte Filmfreak zufrieden ist, aber dann nimmt man in Kauf, dass das Programm den Arbeitsspeicher unnötig blockiert, wenn vielleicht nur 200 Filme verwaltet werden.
* Geordnetes einfügen * Erhält einen Zeiger auf root, damit root über die parameterliste * aktualisiert werden kann. * 0 falls nichts eingefügt wurde. * 1 falls vor root eingefügt wurde (und es somit eine neue wurzel gibt) * 2 falls ein echtes insert stattfindet * 3 falls am ende angehängt wird int insert(node** pRoot, int data) if (pRoot == null || *pRoot == NULL) return 0; // "einhängen" vor pRoot if ( data < (*pRoot)->data) node *newroot = malloc(sizeof(node)); if (newroot! = NULL) newroot->next = *pRoot; newroot->prev = NULL; (*pRoot)->prev = newroot;->prev = newroot; newroot->data = data; return 1; // 1 = neue pRoot} /* Beginnend mit root wird geprüft, ob man zwischen * root und und root->next einhängen kann. Einfach verkettete listen c'est. falls * diese prüfung posotiv ausfällt wird eingehängt * und mit return beendet. falls nicht, kommt man ans ende der liste * (curr->next == null) und die schleife wird normal beendet. * in diesem fall wird am ende angehängt. node* curr = *pRoot; for (; curr->next! = null; curr = curr->next) if ( curr->data < data && data <= curr->next->data) //printf("insert nach curr\n"); node *newnode = malloc(sizeof(node)); if (newnode!