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
    Thomas

    Hier 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.


Anmelden zum Antworten