Liste, Pointer problem



  • Hallo,

    hab ein Pointerproblem 😃

    Ich wollte selbst eine Liste schreiben, die jeweils das nächste Element beinhaltet und halt einen Integer Wert.

    Im Hauptprogramm sollte es 2 Zeiger geben, die auf das erste und letzte element zeigen. Der Zeiger für das letzte Element soll halt ermöglichen, dass ich schnell elemente einfügen kann.

    Also ich hab mein erstes Element, und füge dann 5 neue Elemente ans ende. Der Pointer letztes wird immer upgedated, dass halt das nächste Element ganz hinten dran kommt.

    Dann will ich die Werte der Listenelemente ausgeben. Bekomm aber nicht das gewünschte ergebnis.

    #include <iostream>
    
    using namespace std;
    
    typedef struct mystr mystr;  
    struct mystr
    {
    	mystr* next;		// next element
    	int a;			// value
    };
    
    int main() {
    
    	mystr* erstes;
    	mystr* letztes;
    
    	mystr a;
    	a.a = 0;
    
    	erstes = &a;
    	letztes = &a;
    
    	for(int i=0; i<5; i++)
    	{
    		mystr c;
    		c.a = i;
    		letztes->next = &c;
    		letztes = &c;
    	}
    
    	for(int i=0; i<5; i++)
    	{
    		printf("%d\n", erstes->a);
    		erstes = erstes->next;
    	}
    
        return 0;
    }
    

    meine ausgabe:

    0
    4
    4
    4
    4

    sieht so aus als wird da im kreis gezeigert. Hat jmd. ne idee wie ich das richtig hin bieg?

    gruß
    eurohasi



  • Könntest du deinen code mal ein bisschen kommentieren ?



  • du kommst wohl aus C:

    Das typedef ist absolut überflüssig. Setz dich mit Klassen auseinander!!! Das was in deinem main steht übernehmen Member-Funktionen. Tutorials gibts doch genügend



  • hm, ist er nicht verständlich?

    okay ich versuchs:

    #include <iostream>
    
    using namespace std;
    
    typedef struct mystr mystr;  
    struct mystr
    {
        mystr* next;        // next element
        int a;            // value
    };
    
    int main() {
    
        mystr* erstes;     // points at first element
        mystr* letztes;    // points at last element
    
        mystr a;            // first element
        a.a = 0;            // gets some value
    
        erstes = &a;        // erstes points at a
        letztes = &a;       // letztes points at a
    
        for(int i=0; i<5; i++) // do 5 times
        {
            mystr c;         // create a new c
            c.a = i;         // give it some value
            letztes->next = &c; // set the pointer in the element onto the created element
            letztes = &c; // let letztes point at just created element
        }
    
        for(int i=0; i<5; i++) // do 5 times
        {
            printf("%d\n", erstes->a); // print value of the element, erstes points at
            erstes = erstes->next; // erstes points at the next element
        }
    
        return 0;  // end
    }
    

    Die3? schrieb:

    du kommst wohl aus C:

    Das typedef ist absolut überflüssig. Setz dich mit Klassen auseinander!!! Das was in deinem main steht übernehmen Member-Funktionen. Tutorials gibts doch genügend

    mir ist klar dass ich einfach ne Liste aus der STL verwenden könnte, bin vor kurzem von java nach c++ gewechselt, und wollte das pointer zeugs verstehn. Darum ist es mir wichtig zu verstehen warum das beispiel nicht funktioniert.

    gruß
    eurohasi



  • Kommentare auf Denglish das is ja richtig Geil

    Was is eigentlich dieses

    erstes->a
    


  • naja, erstes zeigt doch aufn element, also is erstes->a, der wert a von dem element, !?



  • Deklaration:

    int *ptr;
    

    Initialisierung

    ptr = &var;
    

  • Mod

    Das in Zeile 25 erzeugte Objekt wird am Ende des Blocks (Zeile 29) automatisch zerstört und freigegeben - jeder Zeiger, der auf dieses Objekt zeigte, ist damit automatisch ungültig.



  • camper schrieb:

    Das in Zeile 25 erzeugte Objekt wird am Ende des Blocks (Zeile 29) automatisch zerstört und freigegeben - jeder Zeiger, der auf dieses Objekt zeigte, ist damit automatisch ungültig.

    okay, ich verstehe, klar^^.

    wie kann ich das umgehn?



  • Erzeuge das Objekt außerhalb des Blocks zB oben mit a



  • okay, habs geschafft, danke, es war wirklich der fehler dass das object c ja nur daseinsberechtigung hat in seinem Block,

    hab das problem mal so gelöst. Es leistet das gewünschte.

    #include <iostream>
    
    using namespace std;
    
    class myclass
    {
    public:
    	myclass* next;		// next element
    	int a;			// value
    
    	myclass(int val)
    	{
    		a = val;
    	}
    
    	void add(int val)
    	{
    		next = new myclass(val);
    	}
    };
    
    int main() {
    
    	myclass *erstes;
    	myclass *letztes;
    
    	myclass* a = new myclass(0);	
    
    	erstes = a;
    	letztes = a;
    
    	for(int i=0; i<5; i++)
    	{
    		letztes->add(i);
    		letztes = letztes->next;
    	}
    
    	for(int i=0; i<5; i++)
    	{
    		printf("%d\n", erstes->a);
    		erstes = erstes->next;
    	}
    
    	int lo;
    	cin >> lo;
    
        return 0;
    }
    

    danke gary für die hilfe 🙂

    gruß
    eurohasi



  • ich würd aber noch im ctor den "next" zeiger auf null setzen, um das ende der liste zu markieren.

    da wir die länge der liste meist nicht vorher kennen (sonst würde man ein array verwenden) kann man die null als abbruchbedingung benutzen

    while (erstes)
    {
        printf("%d\n", erstes->a);
        erstes = erstes->next;
    }
    


  • anstatt

    int lo;
    cin >> lo;
    

    kannst du

    fflush(stdin);
    getchar();
    

    verwenden



  • gary1195 schrieb:

    anstatt

    int lo;
    cin >> lo;
    

    kannst du besser

    fflush(stdin);
    getchar();
    

    verwenden

    LOL



  • @ gary1195:
    Wir sind immer noch im C++-Forum. Von daher wäre es vielleicht vorteilhaft, den Threadersteller nicht zusätzlich zu verunsichern... 🙄
    (Im Übrigen hat auch printf() hier nichts zu suchen.)

    @ eurohasi:
    Hier gibts einen Artikel über Zeiger. Es lohnt sich sicher, den durchzulesen, Zeiger werden dort sehr gut erläutert.


Anmelden zum Antworten