es geht um die Verkettete listen
-
Hallo alle zusammen Ich habe eines kleines Probelem : und zwar dass ich zwei Funktionen schreiben sollte eine FKT die so void entfernen_vorn()// die FKT soll von der Liste das erste Element löschen void entfernen_Hintern()// die FKT soll die letzte element löschen #include<iostream.h> struct listenelement { int Element; listenelement *weiter; }; struct liste { private: listenelement *kopf,*Fuss; public: void init(); void einfuegen_hinten(int); int anzahl(); void entfernen_vorn(); void entfernen_hinten(); int letztes(); void ausgabe_vorw(); // void ausgabe_rueckw(); }; void liste::init() { kopf=NULL; Fuss=NULL; }; void liste::einfuegen_hinten(int a) { listenelement *k= new listenelement; k->Element=a; k->weiter=NULL; if(kopf==NULL) { kopf=k;kopf->weiter=Fuss; } else if(Fuss==NULL) { kopf->weiter=k; Fuss=k; } else { Fuss->weiter=k; Fuss=k; } }; int liste::anzahl() { int a=1; if (kopf==NULL){ cout << " Liste leer " << endl; return 0; } else{ listenelement *k=kopf; while(k->weiter!=NULL) { a++; k=k->weiter; } return a; } }; void liste::entfernen_vorn() { if (kopf==Fuss){ cout << "Liste leer,entfernung unmoeglich ! " << endl; } else{ cout << kopf<<" ist entfernt " << endl; kopf=kopf->weiter; } } void liste::entfernen_hinten() { if(kopf==Fuss){ cout << "Liste leer,entfernung unmoeglich ! " << endl; } else {while(kopf->weiter!=Fuss){ kopf=kopf->weiter; } Fuss=kopf; } }; int liste::letztes() { if (Fuss!=NULL) return kopf->Element; else return 0; }; void liste::ausgabe_vorw() { if (kopf!=NULL) { cout << kopf->Element << endl; kopf=kopf->weiter; ausgabe_vorw(); } else cout << "liste ist leer" << endl; };
In dieses Programm denke ich dass der Fehler ist bei der beiden Entfernen ?
aber wie weiss es nicht
-
sorry, aber ich kann beim besten willen nicht verstehen, was du uns sagen willst
-
Er hat eine verkettete Liste implementiert und sollte nun Funktionen zum Löschen des ersten oder des letzten Elements dieser Liste entwickeln. Das funktioniert aber (warum auch immer) nicht.
-
geh mit dem debugger durch, dann findest du den fehler sicher...
mir sind da einige Sachen suspekt - aber was konkretes sehe ich beim überfliegen nicht...
-
also da is nich nur ein Fehler drin..
der gröbste der mir beim Entfernen auffällt ist, daß du beim entfernen_hinten den Kopfzeiger durch die Liste bewegst(was natürlich nich sein darf)->nimm ne Kopie davon
-
Shady schrieb:
also da is nich nur ein Fehler drin..
der gröbste der mir beim Entfernen auffällt ist, daß du beim entfernen_hinten den Kopfzeiger durch die Liste bewegst(was natürlich nich sein darf)->nimm ne Kopie davon
wie meinst du dass ich eine Kopie davon nehme
danke
-
nach entferne_hinten() ist Fuss == kopf
Dieses Problem hast du in mehreren Methodenbtw: du weisst aber schon, dass du nie ein Element löscht -> du also massenweise Speicherlecks produzierst, oder?
btw: da es ja eine einfach verkettete Liste ist, warum brauchst du dann einen Zeiger auf das letzte Element? So wie ich das sehe, versuchst du einen Ring zu bauen... Lass es doch lieber bei ner simplen einfach verketteten Liste.
Da kann man das Ende schön mit eleml->next==NULL kennzeichnen...
-
wie meinst du dass ich eine Kopie davon nehme
listenelement*travel= kopf;
und damit die liste durchlaufen
wobei ich so eine ineffiziente Funktion, die erstmal die ganze liste aufmischt nur um das vorletzte Element zu finden, in der form gar nicht einbauen würd, aber das is ne andere Geschichte