Anzeige:
Ergebnis 1 bis 6 von 6

Thema: Liste aus Objekten durchlaufen. Wie?

  1. #1
    Registrierter Benutzer Avatar von 24dan
    Registriert seit
    07.07.2005
    Beiträge
    76

    Liste aus Objekten durchlaufen. Wie?

    Hallo ich habe mir ein kleines Objekt angelegt:
    Code:
    class OBJEKT
    {	
    	public:
    		OBJEKT *next;		//	naechstes Element 
    	int zahl;
    }
    jetzt möchte ich meine Objekte miteinander über den Pointer *next verknüpfen.

    Code:
    						OBJEKT *kette = new OBJEKT;
                                                    kette->next = NULL;
    						OBJEKT *zahl = new OBJEKT;
    
    
    //    Wenn ich noch keine Zahl in meiner Kette habe...
    
    						if( kette->next == NULL)
    						{
    							kette->next = zahl;
    						}
    						else
    						{
    //     Wenn ich schon eine Zahl in der Kette habe ??? Was dann??? 
    						};
    ...der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott. (Werner Heisenberg 1901-1976, Nobelpreisträger für Physik)
    debian on acer travelmate c300: http://adweb.desy.de/~kaemtner/

  2. #2
    Registrierter Benutzer Avatar von jeebee
    Registriert seit
    01.01.2005
    Ort
    Bern || Zürich
    Beiträge
    540
    zb mit
    Code:
    while(kette->next != NULL) {
        kette = kette->next;
    }
    bis zum letzten Objekt gehen, dann mit
    Code:
    kette->next = zahl
    das neue Objekt anhängen.

    //edit: bin nicht sicher obs gerade so kompiliert und funktioniert, programmiere eigentlich nur C, sollte aber etwa so gehen.

  3. #3
    Registrierter Benutzer Avatar von 24dan
    Registriert seit
    07.07.2005
    Beiträge
    76
    Hallo danke dass klappt erstmal:
    ich habe jetzt das Problem, dass ich die letzte Zahl nicht zu fassen bekomme.
    Code:
    OBJEKT *kette = new OBJEKT;	
    Schleife in der jedesmal eine Zahl erstellt und gesetzt wird
    {
       OBJEKT *zahl = new OBJEKT;	// Buchstabe fuer jedes Zeichen erzeugen
    
       Der Integer im Objekt Zahl wird mit einer Zahl gefüllt.
    
       if( kette->next == NULL)
       {
    	kette->next = zahl;
    	zahl->next = NULL;
       }
       else
       {
            OBJEKT *temp = kette;
    	while(temp->next != NULL){ 
    		temp = temp->next; // Durchlaufe die Liste bis zum Schluss 
    	}
            temp->next = zahl; // haenge dann das neue Objekt dran
    	zahl->next = NULL;
       };
    };
    Ich habe bei 5 eingegeben Zahlen dann nur noch 4 bei der Ausgabe ?!?

    Also war meine Fehler habe die while schleife für die Ausgabe falsch gebaut.
    So ist es richtig:
    Code:
    OBJEKT *temp = kette;
    while(temp->next != NULL){ 
    	temp = temp->next; // Durchlaufe die Liste bis zum Schluss 
            outfile << temp->zahl << " ";
    }
    Geändert von 24dan (03-01-2007 um 19:47 Uhr)
    ...der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott. (Werner Heisenberg 1901-1976, Nobelpreisträger für Physik)
    debian on acer travelmate c300: http://adweb.desy.de/~kaemtner/

  4. #4
    Registrierter Benutzer
    Registriert seit
    18.03.2005
    Beiträge
    211
    Prinzipiell:

    DU verwendest C++ um C zu programmieren !

    Du solltest prinzipiell objectorientierter arbeiten ....

    Ne "kette" lose in den speicher zu legen und ueber den zeiger auf das erste object zu verwalten im nutzcode ist ganz schechtes C++

    besser, den nen conteiner (Kette/Liste) fuers verwalten erstellen, dem erst mal alle noetigen methoden verpassen ....

    Dann funktionen fuers iterieren hinzu so dass im Nutzcode ziemlich einfach arbeiten kannst , z.b. nach dem Prinzip:

    for(Myclass * p = cont.begin(); p ; p = cont.next(p))
    {

    }

    Wenn schon C++ dann richtig !

    Mittels public anderen Objecten zugriff auf die eigenen variablen geben -> schlecht ! (besser getter und setter schreiben)

    NutzKlassen und Verwaltungsklassen besser trennen ! Nen Schwein was nen zeiger auf das Nachfolgende Schwein hat, ist unnatuerlich ! ALso lieber die Zeiger fuer die Kette in eigene node klassen auslagern .... das geht auch schon ohne templates nutzen zu muessen.

    Ciao ...

  5. #5
    Registrierter Benutzer Avatar von 24dan
    Registriert seit
    07.07.2005
    Beiträge
    76

    Thumbs up

    Hallo und vielen Dank für die Kritik.

    Ich bin froh wenn ich es besser machen kann.

    Ich habe jetzt folgendes verstanden:
    1. eine klasse als conteiner erstellen und darin alle Objekte verwalten
    Code:
    class Verwaltungsconteiner
    {
       ??? conteiner??? Wie wird das in der Klasse mit deklariert?
    
       conteiner begin();
       conteiner next();
    };
    2. eine Klasse für die Objekte die im Conteiner gelagert werden.
    Code:
    class Nutzklasse
    {
       variable_1
       variable_2
    
       int getVar1(return variable_1);
       void setVar1(int wert) {variable_1 = wert;};
       ...
     }
    3. Die Objekte dann zur Laufzeit im Conteiner ablegen:
    Code:
        Verwaltungsconteiner *cont = new Verwaltungsconteiner;
        Nutzklasse *eins = new Nutzklasse;
        eins.setVar1(5);
        
        // ab in den Conteiner:
        cont.putIn(eins);
    
        // raus aus dem Conteiner:
       for(Verwaltungsconteiner * p = cont.begin(); p ; p = cont.next(p))
       {
            outfile << cont.display(p);
       }
    Wie sieht das den anhand eines kleinen nutzbaren Quelltextes aus?
    Ich habe jetzt nur eine Skizze abgegeben um grundsätzlich mein Verständnis darzulegen.
    Beim direkten Umsetzten haperts aber...
    ...der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott. (Werner Heisenberg 1901-1976, Nobelpreisträger für Physik)
    debian on acer travelmate c300: http://adweb.desy.de/~kaemtner/

  6. #6
    Registrierter Benutzer
    Registriert seit
    18.03.2005
    Beiträge
    211
    Nen Brauchbaren container zu schreiben iss ja auch ned trivial ...
    ohne templates tut man sich eh schwer (nen container auf einem bestimmten typ ist eh bloedsinn)
    Denk mal das soll eh ne uebung nur sein, in der Praxis wirst dafuer eh die STL nutzen ....

    Dein container ist fast immer Holder der Nutzklassen... deswegen sollt der die per copy selber "in den Speicher werfen"
    deine Nutzklasse sollt dafuer dann nen copy operator haben.
    erspart dir das new und delete per hand ...

    Um das zu umgehen, spaeter mal wenn das ding Typunabhaengig als template gebaut hasst, kannst immer noch zeiger als Typ nehmen, dann bist natuerlich fuers reservieren und freigeben selber zustaendig ....

    Damit spaeter die typunabhaengigkeit besser implementieren kannst, nimm gleich ertsmal typdefs und so wenig wie moeglich abhaengigkeiten von der Nutzdatenklasse in deinen container ....

    der header der Verwaltungsklasse koennte dann so aussehen ca.

    Code:
    class DataClass; // forwarder reicht hier ... definieren braucht man die eh erst in der Impl .... 
    
    class Verwaltungscontainer
    {
    public:
        Verwaltungscontainer();
        Verwaltungscontainer(const Verwaltungscontainer & rx);
        ~Verwaltungscontainer(); // mit absicht ned virtuell 
    
        void Add( const DataClass & rx);
        void clear();
        size_t Count() const; 
    
        const DataClass * getFirst() const;
        DataClass * getFirst();
        const DataClass * getNext(const DataClass * pdata) const;
        DataClass * getNext(const DataClass * pdata);
    };
    di iteration mittels pointer wird dir sicher an einigen stellen sorgen machen, bzw wirst da viel performance verlieren ...

    Besser gleich das iterator prinzip anschauen und richtige iteratoren schreiben ...

    Obige version bietet sich aber eigentlich nur bei combinierten containern an, wo die iteration ned so direkt erfolgen kann, sondern es "sonderfaelle" gibt ....

    das Implementieren ueberlass ich dir, macht man im leben soweiso nur einmal zur uebung, ab dann nimmt man fertiges zeugs ^^

    Ciao ...

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •