Ein Datenelement aus einer (Zeiger->Zeiger) LISTE löschen
-
Hallo,
(Ein Datenelement aus einer (Zeiger->Zeiger) LISTE löschen "WICHTIG")
muss bis Donnerstag diese Aufgabe fertig stellen, bei dem löschen einer KontoNr aus der Liste bekomme ich immer Fehler beim wieder auslesen.
Schaut es euch einfach mal an. Vielen Dank!
Ich glaube das irgendein Zeiger auf freien nicht zugewiesenen Speicher zeigt...
Der Aufruf des Löschvorganges ist als Fett markiert(darunter steht der Code)Vielen Dank
ThomasHier das Programm (C++BuiderX):
/*Blatt 2; Aufgabe 4 Schreiben Sie eine kleine Kontenverwaltung für eine Bank. Diese besteht aus dem Anfang der Liste und folgenden Funktionen: - Einfügen am Ende der Liste - Entfernen eines durch die Kontonummer gekennzeichneten Kontos aus der Liste - Löschen der gesamten Liste Gruppe: Thomas Schäfer und Volker Stoffel Anmerkung: Wir haben uns mit dieser Aufgabe ein ganzes Wochenende beschäftigt und bekommen das löschen eines Eintrages aus der Liste nicht hin! Die Schleife des Löschvorganges läuft einwandfrei, nur beim erneuten auslesen stößt die Schleife auf einen falschen Zeiger, warum? Keine Ahnung! Wir hoffen jetzt einfach mal auf Ihre Bonuspunkte :-) */ #include <iostream> #include <stdio.h> //#include <conio.h> //#include <stdlib.h> //#include <process.h> using namespace std; class cKonto { private: int KontoNummer; float KontoStand; cKonto *AnderesKonto; public: cKonto(void);//Konstruktor void Setze(int KtoNr, float KtoStd); int HoleKontoNr(void); float HoleKontoStd(void); cKonto *HoleNaechste(void); void ZeigeAufNaechste(cKonto *ZeigeDahin); }; cKonto::cKonto(void)//Konstruktor { KontoNummer = 0; AnderesKonto = NULL; } // Diese Methode setzt die Größe der Box auf die Parameter void cKonto::Setze(int KtoNr, float KtoStd) { KontoNummer = KtoNr; KontoStand = KtoStd; } // Diese Methode gibt die KontoNr zurück int cKonto::HoleKontoNr(void) { return (KontoNummer); } // Diese Methode gibt den Kontostand zurück float cKonto::HoleKontoStd(void) { return (KontoStand); } // Diese Methode lässt den Zeiger auf den Parameter zeigen void cKonto::ZeigeAufNaechste(cKonto *ZeigeDahin) { AnderesKonto = ZeigeDahin; } // Diese Methode gibt die Box, auf die die momentane zeigt, zurück cKonto *cKonto::HoleNaechste(void) { return AnderesKonto; } int main() { cKonto *Start = NULL; // Zeigt immer auf den Beginn der Liste cKonto *Temp; // Arbeitstier cKonto *KontoZeiger; // Für das Erzeugen cKonto *ZW; int zaehler; int KontoNr; int Aktion; // Erzeuge die Liste for (int Index = 0 ; Index < 4 ; Index++) { KontoZeiger = new cKonto; KontoZeiger->Setze(Index, (150.05 + (Index + 8))); if (Start == NULL) { Start = KontoZeiger; // Erstes Element in der Liste } else { Temp->ZeigeAufNaechste(KontoZeiger); // Zusätzliches Element } Temp = KontoZeiger; }//Ende Erzeugen Liste do{ // system("CLS"); //geht leider nicht if (Start!=NULL) { // Gib die Liste aus Temp = Start; do { cout << "KontoNr: " << Temp->HoleKontoNr() << "\t"; cout << "KontoStand: " << Temp->HoleKontoStd() << "\n"; Temp = Temp->HoleNaechste(); } while (Temp != NULL); }//ende if cout<<"\nNeues Konto am Ende der Liste einfügen? | 0 |\n"; cout<<"Entfernen eines Kontos durch Konto Nr? | 1 |\n"; cout<<"Löschen der gesamten Liste? | 2 |\n"; cin>>Aktion; switch (Aktion) { case 0: Temp = KontoZeiger; zaehler = Temp->HoleKontoNr(); zaehler++; KontoZeiger = new cKonto; KontoZeiger->Setze(zaehler, (zaehler+88.5)); if (Start == NULL) { Start = KontoZeiger; // Erstes Element in der Liste } else { Temp->ZeigeAufNaechste(KontoZeiger); // Zusätzliches Element } Temp = KontoZeiger; break; [b]case 1: // Entfernen eines Kontos durch Konto Nummmer[/b] //clrscr(); cout<<"Entfernen eines Kontos:\n\n"; cout<<"Bitte die Kontonummer angeben die gelöscht werden soll:\n"; cin>>KontoNr; Temp = Start; while (Temp != NULL) { if ((Temp->HoleKontoNr())==KontoNr) { ZW=Temp->HoleNaechste(); delete Temp; Temp =ZW; }else { Temp = Temp->HoleNaechste(); } } break; case 2: // Löschen der gesamten Liste cout<<"\nListe gelöscht\n"; Temp = Start; do { Temp = Temp->HoleNaechste(); delete Start; Start = Temp; } while (Temp != NULL); break; } }while((Aktion==0)||(Aktion==1)||(Aktion==2)); // Lösche die Liste um sicher zu gehen Temp = Start; do { Temp = Temp->HoleNaechste(); delete Start; Start = Temp; } while (Temp != NULL); return 0; }
-
sowas wird normalerweise so gemacht:
this->prev->next = this->next; // this->next->pre = this->prev; // bei doppelt verlinkten listen delete this;randfaelle (prev/next == NULL oder this als einziges element) sind dabei noch gesondert zu behandeln.
-
Danke schonmal für die promte Antwort, allerdings komme ich mit deinem Beispiel noch nicht ganz klar,
wie genau müsste das dann in meinem Beispiel aussehen?
-
mal dir mal die liste auf. benenne die einzelnen zeiger in den objekten.
dann hole ein element raus und schau dir an, wie du die zeiger umlegen musst.vergiss nicht, das rausgelöste, wie crackwitz es zeigt, zu löschen.
blatt papier ist hier notwendig :xmas2:
-
Dieser Thread wurde von Moderator/in Jansen aus dem Forum VCL/CLX (Borland C++ Builder) in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.