Pointer-Frage



  • #include <iostream>
    
    struct node
    {
    	int x;
    	node* next;
    };
    
    class littleList
    {
    public:
    	littleList(int x)
    	{
    		std::cout << "Objekt erstellt..." << std::endl;
    		root = new node;
    		root->x = x;
    		root->next = 0;
    	}
    	void print()
    	{
    		std::cout << "Objekt wird gedruckt..." << std::endl;
    		node* tmp = root;
    		while(tmp->next)
    			std::cout << tmp->x << std::endl;
    	}
    	node* insert(int x)
    	{
    		std::cout << "Objekt wird geändert..." << std::endl;
    		node* tmp = root;
    		while(tmp->next)
    			tmp = tmp->next;
    		tmp = tmp->next;
    		tmp = new node;
    		tmp->x = x;
    		tmp->next = 0;
    		return tmp;
    	}
    private:
    	node* root;
    };
    
    int main()
    {
    	littleList objList(1);
    
    	objList.insert(2);
    	objList.insert(3);
    	objList.insert(4);
    	objList.insert(5);
    
    	objList.print();
    }
    

    Wieso wird root nicht geändert?
    Ich dachte dass pointer adressen enthalten.

    also sollte doch bei insert das tmp root verändern

    liege ich da falsch?



  • Gulliver schrieb:

    Wieso wird root nicht geändert?

    Weil du es nirgends änderst

    Gulliver schrieb:

    Ich dachte dass pointer adressen enthalten.

    Richtig. Die Adresse des Objekts, auf das sie zeigen.

    Gulliver schrieb:

    also sollte doch bei insert das tmp root verändern

    In deinem Fall nicht, weil du den Pointer solange auf tmp->next weiterschiebst, bis dieser 0 ist und somit auf kein Objekt mehr zeigt.

    // jetzt zeigt tmp auf root
    node* tmp = root;
    // wenn tmp->next true (also ungleich 0) dann soll tmp auf das nächste Objekt zeigen
    while(tmp->next)
        tmp = tmp->next;
    // wenn tmp->next nun == 0, dann soll tmp = 0 werden.
    tmp = tmp->next;
    // tmp zeigt nun auf die Adresse des neuen Objekts
    tmp = new node;
    

    Im Destruktor solltest du deinen Speicher mit delete wieder freigeben um Speicherleaks zu vermeiden.

    In deiner print-Funktion gibst du immer nur root aus.
    nach der Ausgabe solltest du auch hier dein tmp auf das nächste Objekt verweisen lassen, damit du alles ausgeben kannst. (sieht derzeit nach einer Endlosschleife aus)

    // edit: Außerdem soltest du den root-zeiger noch auf das neue Objekt setzen.

    // diese beiden Zeilen sind so besser ( nach der while-Schleife)
    tmp->next = new node;
    tmp = tmp->next;
    [cpp]
    


  • hallo bedeutet das dass ich wenn ich mit tmp durchgehe auch root verändere?



  • Gulliver schrieb:

    hallo bedeutet das dass ich wenn ich mit tmp durchgehe auch root verändere?

    Nun, root änderst du im Constructor, in dem du root auf die Adresse des neuen Objekts zeigen lässt.

    Das Objekt, auf welches root zeigt wird dann noch einmal beim 1. Insert geändert,
    wenn du "next" auf das neue Objekt (nachfolgendes) zeigen lässt.


Anmelden zum Antworten