Wert in eine doppelt verkette Liste einfügen
-
hey, ich möchte einen wert (wert_neu) vor einen wert, welcher schon ggf in der liste enthalten ist (vor_wert), einfügen.
Die werte werden vom benutzer bestimmt.
Bei der Liste handelt es sich um eine doppelt verkettete!meine funktion
void einfuegen(TListenKnoten* &anker, int wert_neu, int vor_wert) { TListenKnoten *neuer_eintrag = new TListenKnoten; //speicherplatz für neuen eintrag wird reserviert neuer_eintrag->data = wert_neu; //wert soll in die daten gehaengt werden neuer_eintrag->next = 0; //next-pointer wird zurnächst mit null initialisiert neuer_eintrag->prev = 0; //prev-pointer wird zunächst mit null initialisiert TListenKnoten *vor_eintrag = 0; //hierbei stürtzt das programm ab! vor_eintrag->data = vor_wert; //der zeiger "vor_eintrag" soll mit dem wert von "vor_wert" initialisiert werden TListenKnoten *ptr = anker; //ptr wird auf anfang der liste gesetzt if (anker == vor_eintrag) //der vor_wert entspricht dem anker { ptr->prev = neuer_eintrag; //vor_eintrag soll vor liste gesetzt werden anker = neuer_eintrag; // anker wird auf den neuen wert gesetzt neuer_eintrag->prev = nullptr; //previous-pointer des neuen eintrags/ankers entspricht dem nullptr neuer_eintrag->next = ptr; //Liste wird an den neuen eintrag gehängt } else{ while (ptr->next!= nullptr) //bis das ende der liste erreicht ist { ptr = ptr->next; //... soll durch die liste gelaufen werden if (ptr == vor_eintrag) //wenn der eintrag auf den der pointer ptr zeigt dem vor_wert entspricht { ptr->prev = neuer_eintrag; //...soll vor den wert der neue wert in die liste eingefügt werden neuer_eintrag->next = ptr; } } if (ptr->next == nullptr) //es wurde bis zum ende der liste gelaufen und der vor_wert nicht gefunden { ptr->next = neuer_eintrag; //der neue eintrag wird an die liste gehängt bzw. an das letzte element (auf das der pointer immoment zeigt) neuer_eintrag->prev = ptr; } } }
meine Liste:
struct TListenKnoten { int data; //liste besteht aus "int"-werten TListenKnoten *next; //next-pointer TListenKnoten *prev; //previous-pointer };
Mein Programm stürzt immer wieder an der stelle ab.
mir kommt aber keine andere idee wie ich das einfuegen bewerkstelligen kann.
hat einer eine idee, einen tipp?bitte idee-/tipp-/problemerklärungen für laien (aka ich) verständlich formulieren!
vielen dank im voraus!
grüße
-
In Zeile 8 setzt du den Zeiger auf 0 und in Zeile 9 dann 'vor_eintrag->data = vor_wert'?
Passt offenbar nicht.
-
Jockelx schrieb:
In Zeile 8 setzt du den Zeiger auf 0 und in Zeile 9 dann 'vor_eintrag->data = vor_wert'?
Passt offenbar nicht.hatte es so probiert:
TListenKnoten *vor_eintrag; vor_eintrag->data = vor_wert;
aber dann melder der compiler, dass vor_eintrag initialisiert werden muss!
und hatte auch noch so probiert:
TListenKnoten *vor_eintrag = vor_wert;
aber dann wurde nur gemeldet dass eine initialisierung mit einem int-wert nicht geht
dann ist mir nicht außer "=0" setzen eingefallen...
ist dieser ausgangspunkt also einen pointer *vor-eintrag mit dem vor_wert initialisieren generell ein falscher anfangspunkt?
-
Zeile 8 und 9 sind vollkommener Unsinn.
Wo kommt denn der Parameter VorWert her? Es wäre sinnvoller nicht den Wert sondern den Zeiger auf den entsprechenden Eintrag der Funktion mitzugeben.
So musst Du jetzt erstmal den *voreintrag in der Liste Suchen.Wenn deine while-Schleife diese Suche sein soll dann hast du aus der anderen Aufgabe mit der einfach verketteten Liste nichts gelernt.
Das Einhängen selber ist auch noch falsch und zwar wieder der gleiche Fehler wie bei der einfach verkettetn Liste auch. Der Zeiger next des Eintrags auf den voreintrag->prev zeigt muss auf deinen neuen Eintrag zeigen.
... ptr->prev->next = neuer_eintrag; //!!!! auch da muss der neue Wert eingehängt werden ptr->prev = neuer_eintrag; //...soll vor den wert der neue wert in die liste eingefügt werden neuer_eintrag->next = ptr; ...
-
MichelRT schrieb:
Wo kommt denn der Parameter VorWert her? Es wäre sinnvoller nicht den Wert sondern den Zeiger auf den entsprechenden Eintrag der Funktion mitzugeben.
So musst Du jetzt erstmal den *voreintrag in der Liste Suchen.vor_wert soll vom benutzer eingegeben werden.
der wert soll angeben vor welchen wert der einzufügende wert eingefügt werden soll.
also wenn die liste aussieht [2, 3, 9, 8, 5 ,6 ]
und der benutzer als vor_wert zb den wert "8", und als einzufügende wert den wert "7" eingibt, soll die liste am ende so aussehen:
[2, 3, 9, 7, 8, 5 , 6 ]MichelRT schrieb:
Wenn deine while-Schleife diese Suche sein soll dann hast du aus der anderen Aufgabe mit der einfach verketteten Liste nichts gelernt.
hatte in der anderen aufgabe auch n suche per while
-
Dangling schrieb:
hatte in der anderen aufgabe auch n suche per while
Und da auch schon die falschen Bedingungen.
In Zeile 13 musst Du Anker->data mit vor_wert vergleichen und in Zeile 26 ptr->data mit vor_wert.
-
programm sieht nun so aus:
void einfuegen(TListenKnoten* &anker, int wert_neu, int vor_wert) { TListenKnoten *neuer_eintrag = new TListenKnoten; //speicherplatz für neuen eintrag wird reserviert neuer_eintrag->data = wert_neu; //wert soll in die daten gehaengt werden neuer_eintrag->next = 0; //next-pointer wird zurnächst mit null initialisiert neuer_eintrag->prev = 0; //prev-pointer wird zunächst mit null initialisiert TListenKnoten *ptr = anker; //ptr wird auf anfang der liste gesetzt if (anker->data == vor_wert) //der vor_wert entspricht dem anker { ptr->prev = neuer_eintrag; //vor_eintrag soll vor liste gesetzt werden anker = neuer_eintrag; // anker wird auf den neuen wert gesetzt neuer_eintrag->prev = nullptr; //previous-pointer des neuen eintrags/ankers entspricht dem nullptr neuer_eintrag->next = ptr; //Liste wird an den neuen eintrag gehängt } else{ while (ptr->next!= nullptr) //bis das ende der liste erreicht ist {ptr = ptr->next; //... soll durch die liste gelaufen if (ptr->data == vor_wert) //wenn der eintrag auf den der pointer ptr zeigt dem vor_wert entspricht { ptr->prev->next = neuer_eintrag; //...soll vor den wert der neue wert in die liste eingefügt werden werden ptr->prev = neuer_eintrag; neuer_eintrag->next = ptr; break; } } if (ptr->next == nullptr) //es wurde bis zum ende der liste gelaufen und der vor_wert nicht gefunden { ptr->next = neuer_eintrag; //der neue eintrag wird an die liste gehängt bzw. an das letzte element (auf das der pointer immoment zeigt) neuer_eintrag->prev = ptr; } } }
funktioniert!
dankeschön!
-
Noch was. Wenn Du die Liste immer schon mit einem festen Anfangs- und Endelement vorbelegst dann sparst Du Dir die ganzen Sonderfälle. Das gilt auch für die einfach verkettete Liste von letzter Woche.
-
MichelRT schrieb:
Noch was. Wenn Du die Liste immer schon mit einem festen Anfangs- und Endelement vorbelegst dann sparst Du Dir die ganzen Sonderfälle. Das gilt auch für die einfach verkettete Liste von letzter Woche.
bei der aufgabe waren noch andere funktionen dabei, die mit zum gesamtem programm gehörten, inklusive eine hinten-anfuegen-funktion bei der erst alle werte gesetzt wurden, also vorher war liste noch komplett leer
-
void einfuegen(TListenKnoten* &anker, int wert_neu, int vor_wert)
Was macht das & vor anker?
-
MichelRT schrieb:
Was macht das & vor anker?
anker = neuer_eintrag; // anker wird auf den neuen wert gesetzt