Verkettete Liste / Zeiger auf Objekte einer Klasse



  • Hallo,

    ich hoffe ihr könnt mir helfen.

    ich habe die Klasse Ort. Ein Ort wird durch seinen Namen, X und Y Koordinaten repräsentiert:

    class Ort 
    {
    	private:
    		string name;
    		int x_koordinate,
    		int y_koordinate;    
    
    	public:
    		  Ort(string eingabe_name, int eingabe_x = 0, int eingabe_y = 0)   // Default: Nullpunkt
    		  : name(eingabe_name), x_koordinate(eingabe_x), y_koordinate(eingabe_y) {
    
    		  }
    
    		  int X() const { return x_koordinate;}
    		  int Y() const { return y_koordinate;}  
    };
    

    Nun habe ich eine weiter Klasse in der die verkettet Liste erstellt wird, und die Methoden dafür stehen. Bisher habe ich im Hauptmenü nur den Namen des Ortes eingegeben. Dieser wurde dann in der Liste gespeichert.
    Nun soll die Klasse Ort verwendet werden.
    Das heißt, in der Liste soll nun ein Zeiger auf ein Objekt der Klasse Ort gespeichert sein.

    Hier die Einfüge Methode der Liste aus der Klasse "liste":

    class liste{
    
    private:
    
    	struct knoten {
    	  string info;
    	  struct knoten *next;
    	};
    
    	struct knoten *pos;      // Positionszeiger
    	struct knoten *pre_pos;  // Vorgänger des Positionszeigers
    	struct knoten *anfang;   // Zeiger auf den Anfang  der Liste
    
    public:
    
    	liste() {
    		pos = pre_pos = anfang = NULL; // Leere Liste 
    		read_from_binary_file(); //vorhande Daten aus binäer Datei in die Liste laden.
    	}
    
    	~liste(){
    		write_to_binary_file(); //vorhanden Einträge aus der Liste in Binär datei schreiben.
    	}
    
    ...........
    
    void ins(string x, int x_ko, int y_ko) {
    			struct knoten *p = new knoten;  // erzeuge neuen knoten
    			p->info = x;        // Infowert wird x
    			p->next = pos;      // next wird initialisiert mit alten P.-Zeiger
    								// es wird also VOR dem aktuellen Element eingefügt
    			if (anfang == NULL)     // Leere Liste
    					anfang = p;
    			if (pre_pos != NULL)            // Positionszeiger hat einen Vorgänger
    					pre_pos->next = p;
    			else                            // neues Element steht am Anfang
    					anfang = p;
    			pos = p;              // Positionszeiger zeigt nun auf das neue Element
    	}
    
    ........
    };
    

    Wie erstellt ich nun in der Einfügen Methoden die Zeiger auf ein Objekt der Klasse Ort und speichere diesen in der Liste ab.

    Gruß

    Martin



  • Aus string info wird DeineKlasse info



  • Sorry versteh ich nicht so ganz.
    Wozu brauch ich denn jetzt noch ein Klasse info?



  • Warum nicht um einen Schritt einfacher?

    class ListeKnoten{
    
    private:
    
        sting   info;
    
        // ggf. mehr Dateb
    
        ListeKnoten   *next,
                      *pre_pos,  // Vorgänger des Positionszeigers
                      *anfang;   // Zeiger auf den Anfang  der Liste
    
    public:
    


  • Danke hartmut für deinen Verbesserungsvorschlag.
    Werde ich einmal umsetzten, sobald das eigentliche Problem mit dem Zeiger auf die Objekte Klasse Ort gelöst ist.
    DA stehe ich nach wie vor auf dem Schlauch.



  • Tobias Gerg schrieb:

    Aus string info wird DeineKlasse info

    Sorry versteh ich nicht so ganz.
    Wozu brauch ich denn jetzt noch ein Klasse info?

    statt:

    struct knoten {
          string info;
          struct knoten *next;
        };
    
    struct knoten {
          Ort info;
          struct knoten *next;
        };
    


  • MartinO schrieb:

    Danke hartmut für deinen Verbesserungsvorschlag.
    Werde ich einmal umsetzten, sobald das eigentliche Problem mit dem Zeiger auf die Objekte Klasse Ort gelöst ist.
    DA stehe ich nach wie vor auf dem Schlauch.

    Der Header:

    class ListeKnoten{
    
    private:
    
        sting   info;
    
        // ggf. mehr Dateb
    
        ListeKnoten   *next,
                      *pre_pos,  // Vorgänger des Positionszeigers
                      *anfang;   // Zeiger auf den Anfang  der Liste
    
    public:
    
        ListeKnoten (const string   Data
                     ListeKnoten   *next    = NULL,
                     ListeKnoten   *pre_pos = NULL,
                     ListeKnoten   *anfang  = NULL);
    
        NewElement *Insert (const string  Data);
    

    Soweit der Header - nun der Body der Class:

    ListeKnoten::ListeKnoten (const string   Data,
                              ListeKnoten   *next,
                              ListeKnoten   *pre_pos,
                              ListeKnoten   *anfang)
    {
        info    = Data;
    
        next    = next_loc;
        pre_pos = pre_pos_loc;
        anfang  = anfang_loc;
    }
    
    NewElement *ListeKnoten::Insert (string  Data)
    {
        ListeKnoten    *NewElement;
    
        NewElement = new ListeKnoten (Data, next, this, anfang);
    
        next = NewElement;
    
        return next;
    }
    

    Edit:

    1. return-Value vergessen
    2. Wozu dient eigentlich dieser anfang-Pointer?


  • So kannst du neue Orte anlegen (info : Orte *NeuOrt)

    void ins(string i, int x, int y) {
    			struct knoten *p = new knoten;
    			p->next = pos;
    			p->NeuOrt = new Orte(i,x,y);
    
    			if (anfang == NULL) 
    				anfang = p;
    			if (pre_pos != NULL) 
    				pre_pos->next = p;
    			else 
    				anfang = p;
    			pos = p;
    			anzahl++; 
    
    		}
    ...
    };
    

Log in to reply