Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Fehler beim löschen eines Listenelements

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
06.12.2004, 01:47 Uhr
enrico



Hallo, ich habe folgendes Problem, ich habe eine Funktion geschrieben die ein Element einer Liste entfernen soll. Dies geht auch ganz gut, wenn es sich um das letzte Element der Liste handelt, sonst gibts aber jedesmal nen Fehler.


C++:
void MList::mpop(string name){
    Mitarbeiter* mit = front();
    Mitarbeiter* tmp;
    Mitarbeiter* pop;
    
    while(mit != NULL){
        if (mit->getnextm()->getmname() == name){
            pop = mit->getnextm();
            tmp = pop->getnextm();
            mit->setnextm(tmp);
        }
        mit = mit->getnextm();
    }



Hier vielleicht nochmal kurz die Klassendeklaration:


C++:
class MList{                    // Definition der Mitarbeiter Listenklasse

private:

    Mitarbeiter* firstm;        // Anfang der List
    Mitarbeiter* lastm;            // Ende der List

public:

    MList(){firstm=lastm=NULL;}     // Konstruktor
    ~MList(void){}            // Destruktor

    Mitarbeiter* front() const{return firstm;}    // Gibt das erste Element zurück
    
    void mpush(string name, string vorname, string rolle);    // Mitarbeiter einfügen
    void mpop(string mit);                // Mitarbeiter löschen
    void display();            // Liste der Mitarbeiter ausgeben
    
    friend class Aktivitaet;
};

#endif

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.12.2004, 02:24 Uhr
typecast
aka loddab
(Operator)


So der erste Tipp waere: Nimm ne std::list. Die kann alles was du brauchst.

Aber wenn es zu Uebungszwecken ist...

Das naechste waere: Wenn du ein Element aus der Liste loeschst, dann solltest du auch den Speicher dafuer frei geben.

Auf den Hauptfehler hat mich Windalf gerade hingewiesen:

Wo bekommt denn das getnextm() das naechste Element her? Du speicherst ja gerade nur den Anfang und das Ende der Liste ab.
Sieht der Code fuer das getnextm() vielleicht so aus:

C++:
return lastm;



Dann wird das wohl der Fehler sein.

Ausserdem waere noch anzumerken, dass du gar kein Feedback darueber bekommst, ob ein Element jetzt tatsaechlich geloescht wurde oder nicht.
Ein Rueckgabewert waere da vielleicht nicht schlecht.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.12.2004, 02:35 Uhr
enrico



Also erstmal danke das ich so spät noch Hilfe bbekomme, ich hab vergessen die Mitarbeiterklasse mit reinzustellen, also hier


C++:
class Mitarbeiter{                // Definition der Mitarbeiter Klasse

private:

    string name;                 // Mitarbeiterbezeichnung
    string vorname;
    string rolle;
    Mitarbeiter* nextm;             // Zeiger auf nächsten Mitarbeiter

public:

    Mitarbeiter(string n= "X", Mitarbeiter* ptr = NULL):name(n), nextm(ptr    ~Mitarbeiter(void){}            // Destruktor
    Mitarbeiter* getnextm(){return nextm;}// Liefert die Adresse des nächsten Mitarbeiters

    string getmname(){return name;}    // Liefert Mitarbeiternamen zurück
    string getvorname(){return vorname;}    // Liefert den Mitarbeitervornamen
    string getrolle(){return rolle;}
    
    void setnextm(Mitarbeiter* n){nextm = n;}
    void setname(string n, string vn){name = n; vorname = vn;}// Zugriffmethoden auf priv. Element name
    void setrolle(string r){rolle = r;}
    void display();                // Ausgabe des Mitarbeites

    friend class MList;
};

#endif    



Daher das getnextm(), liefert also den next-Zeiger eines Listenelements. Den Speicher wollte ich danach wieder mit delete(pop) freiräumen. Ich hab ne kleine Testmethode geschrieben, die mir die Liste nach dem Löschen eines Elements anzeigt und enn ich das letzte Element lösche gehts ja wie gesagt, ich weiß halt nur nicht wieso nicht bei den anderen.

Zu der Rückgabe, meinst du das so, dass ich das quasi als bool-Methode schreibe? Ich hab nämlich ne bool-Suchfunktion, die vor der Lösch-Methode aufgerufen wird um zu prüfen ob der MA überhaupt vorhanden ist und dann müsste es ja reichen nach dem Löschen vielleicht noch ne kleine Meldung oder so auszugeben, dachte ich mir.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: