Klitze kleines Problem mit verketteter Liste



  • Hi Leute 🙂 ,

    ich hab mich in letzter Zeit mit verketteten Listen Bäumen etc auseinandergesetzt.
    Soweit funktioniert eigentlich alles 😉 .
    Aber eine Frage hab ich, ich hab hier ein kleines Beispielprg. geschrieben, das soweit funktioniert.
    Nur wenn ich in dem Teil *** Neues beliebiges Objekt einfügen ***
    das erste cout ein- und das zweite cout auskommentiere bekomm ich die Fehlermeldung:Die Anweisung in XXX verweist auf den Speicher in XXX, der Vorgang read konnte nicht ausgeführt werden ... . 😕 😞 😞
    Ich müsste aber doch mit previous = prev genauso nach oben wie mit next nach unten duch die Liste gehen können.
    Wisst ihr was ich falsch mach und vorallen wie es richtig geht ?
    Hier mal mein code:

    #include<iostream>
    
    using namespace std;
    
    struct mvListe
    {
    	int data;
    
    	mvListe *prev;
    	mvListe *next;
    };
    
    mvListe *neu	= NULL;
    mvListe *head	= NULL;
    mvListe *current= NULL;
    
    void showList(mvListe *head, char const headline[]);
    
    void main()
    {
    
    	int i = 0;
    	for (i = 0; i < 10 ; i++)
    	{
    		neu = new mvListe;
    		neu->next = head;
    		head = neu;
    		neu->data = i;
    	}
    		showList(head,"Neue Liste");
    
    //****************************** Neues erstes Objekt einfügen **********************************
    
    		neu = new mvListe;
    
    		neu->prev = head;
    		neu->next = neu->prev;
    		head = neu;
    
    		neu->data = 1024;
    
    		showList(head,"Neues erstes Element");
    
    //****************************** Neues letztes Objekt einfügen ***********************************
    
    		neu = new mvListe;
    
    		current = head;
    
    		while (current->next!= NULL)
    		{
    			current = current->next;
    		}
    	 	neu->prev = current;
    		current->next = neu;
    		neu->next = NULL;
    
    		neu->data = 2048;
    
    		showList(head,"Neues letztes Element");
    
    //****************************** Neues beliebiges Objekt einfügen *********************************
    
    		neu = new mvListe;
    
    		int j = 0;
    		int index = 5;
    		current = head;
    
    		while (j < index)
    		{
    			current = current->next;
    			j++;
    		}
    
    		neu->next = current->next;
    		current->next = neu;
    
    		neu->prev = current;
    
    		neu->data = 3072;
    
    		showList(head,"Neues beliebiges Element");
    
      	// cout << neu->prev->prev->prev->data << endl << endl; :confused: 
    
    	  cout << neu->next->next->next->data << endl << endl;
    
    }
    
    void showList(mvListe *head, char const headline[])
    {
    	cout << headline << endl << endl;
    	current = head;
    	while (current != NULL)
    	{
    		cout << current->data << endl;
    		current = current->next;
    	}
    	cout << endl << endl;
    }
    

    vielen Dank schon mal für eure Mühe

    ShadowEater



  • Sorry, das mag nun gemein klingen, aber der Code ist leider nicht so ganz das wahre, da blickt man gar nichts. Auf eine verkettete Liste kann man super OOP anwenden! Kennst du schon Klassen?



  • Hi 😉

    Ja klar kenn ich Klassen,
    ich weiss auch was OOP ist usw.
    bin zwar Anfänger aber nicht mehr ganz so blutig. 😉 🙂

    Aber wieso ist der Code undurchsichtig ?

    SE



  • don't feed the trolls..

    Es ist allerdings wirklich einfacher, wenn du aus mvListe eine Klasse machst die einige Funktionen (anhängen, löschen, etc.) schon mitbringt..

    Damit sieht ein addElement() beispielsweise so aus:

    class cListe {
        private:
           int data;
           cListe *prev, *next;
        public:
           cListe () {
               data = 0;
               prev = NULL;
               next = NULL;
           }
           ...
    
           void addElement (cListe *e) {
              if (this->next != NULL)
                  next->addElement(e);
              else 
                  this->next = e;
           }
    }
    

    Macht's doch einfacher, oder?



  • Hi DocJunioR 😉 ,

    stimmt ist einfacher, aber mir gehts nur um das Previous Problem, weisst Du was da falsch läuft ?

    Danke 🙂
    SE



  • Nachtrag,

    mit prv kann ich genau ein Element nach vorne mehr (wie mit next) nicht !

    Bye
    SE



  • Am Anfang legst Du 10 Elemente der Liste an und da bleibt prev einfach uninitialisiert. Ob die Zuweisung bei den anderen Einfügungen stimmen, hab ich jetzt nicht kontrolliert. Machs Dir einfacher, und bastel Dir eine eigene Funktion "Element einfügen". So wie von Alphabet und DocJunioR vorgeschlagen. Wenn die einmal richtig funktioniert, kann Dir so ein Fehler nicht mehr passieren.

    DJohn

    EDIT: Die Rechtschreibung


Anmelden zum Antworten