Kann den Fehler nicht finden...



  • Hallo!
    Könnte mir jemand Helfen stehe auf dem Schlauch :(.

    Wie es aussieht überschreibe ich irgendwie alle Knoten mit dem Letzten Wert. 😞
    Vielleicht habt ihr nen Tipp für mich.

    #ifndef LISTELEMENT
    #define LISTELEMENT
    
    #include <iostream>
    
    template <class T>
    class ListElement {
    
    private:
    	ListElement* next;
    	T			value;
    
    public:
    	/** standardkonstruktor */
    	ListElement(T data, ListElement* nextE){
    		this->value = data;
    		this->next  = nextE;
    	}
    	~ListElement(){
    		delete this->next;
    		delete this->value;
    	}
    
    	/** get-Methode */
    	T getValue(){
    		return this->value;
    	}
    
    	ListElement<T>* getNext(){
    		return this->next;
    	}
    
    	void setNext(ListElement<T>* nextE){
    		this->next = nextE;
    	}
    };
    
    #endif
    
    #ifndef LIST
    #define LIST
    #include "ListElement.h"
    #include <iostream>
    
    template <typename T>
    class List {
    
    private:
    	ListElement<T>* start;
    	int count;
    
    public:
    
    	void push_back(T value) {
    		ListElement<T>* temp = new ListElement<T>(value, NULL);
    		ListElement<T>* temp2;
    
    		if (this->start == NULL){
    			this->start = temp;
    			this->count++;
    		} else {
    			temp2 = this->start;
    			while( temp2->getNext() != NULL){
    				temp2 = temp2->getNext();
    			}
    			temp2->setNext(temp);
    			this->count++;
    		}
    
    	}
    
    	/** StandardKonstruktor. */
    	List() {
    		this->start = NULL;
    		this->count = -1;
    	}
    
    	T getValue(int index){
    		ListElement<T>* temp = this->start;
    
    		for(int i = 0; i < this->count; i++){
    
    			temp = temp->getNext();
    		}
    		return temp->getValue();
    	}
    
    };
    
    #endif
    
    #include "List.h"
    #include "ListElement.h"
    #include <iostream>
    
    int main(){
    	List<int>* l = new List<int>();
    	l->push_back(22);
    	l->push_back(44);
    	std::cout << l->getValue(0)<< std::endl;
    	std::cout << l->getValue(1)<< std::endl;
    
    	return 0;
    }
    

    AUSGABE:
    44
    44

    Danke schon mal.



  • for(int i = 0; i < this->count; i++){
    

    Es müsste heißen:

    for(int i = 0; i < index; i++)
    

    Außerdem:

    ~ListElement(){
            delete this->next;
            delete this->value;
        }
    

    - this->value ist kein Pointer.
    - Sicher, dass du das nächste Element auch gleich löschen willst?



  • Ein weiterer Fehler ist die Initialisierung deiner count.
    Anfangs -1 Elemente, beim ersten angehangenen Wert hat man dann 0 Werte in der Liste. Aha...

    Und prüf mal bitte auch, ob der index bei getValue() nicht größer als count ist, und wirf notfall ne out_of_range-Exception.ungeprüft gibt dir das ziemlich sicher bald den ersten Segfault 😉


  • Mod

    Ich werde es jetzt nicht debuggen (Das wäre etwas, was DU machen solltest, aber ein paar Fehler sind mir aufgefallen. Der gesuchte ist auch dabei:

    #ifndef LISTELEMENT
    #define LISTELEMENT
    
    #include <iostream>
    
    template <class T>
    class ListElement {
    
    private:
    	ListElement* next;
    	T			value;
    
    public:
    	/** standardkonstruktor */
    	ListElement(T data, ListElement* nextE){
    		this->value = data;       // Du weißt aber schon, dass das this vom Compiler implizit gesetzt wird?
    		this->next  = nextE;
    	}
    	~ListElement(){
    		delete this->next;         // Aua, aua. Das nächste Element soll gelöscht werden, wenn dieses Objekt zerastört wird.
    		delete this->value;        // Noch größeres Aua. value wird automatisch zerstört, wenn das Objekt zerstört wird.
                                               // Das sind zwei ganz schlimme Fehler, guck dir unbedingt nochmal dynamsiche Speicherverwaltung an.
    	}
    
    	/** get-Methode */
    	T getValue(){
    		return this->value;       
    	}
    
    	ListElement<T>* getNext(){
    		return this->next;
    	}
    
    	void setNext(ListElement<T>* nextE){
    		this->next = nextE;
    	}
    };
    
    #endif
    
    #ifndef LIST
    #define LIST
    #include "ListElement.h"
    #include <iostream>
    
    template <typename T>
    class List {
    
    private:
    	ListElement<T>* start;
    	int count;
    
    public:
    
    	void push_back(T value) {
    		ListElement<T>* temp = new ListElement<T>(value, NULL);
    		ListElement<T>* temp2;
    
    		if (this->start == NULL){
    			this->start = temp;
    			this->count++;
    		} else {
    			temp2 = this->start;
    			while( temp2->getNext() != NULL){
    				temp2 = temp2->getNext();
    			}
    			temp2->setNext(temp);
    			this->count++;
    		}
    
    	}
    
    	/** StandardKonstruktor. */
    	List() {
    		this->start = NULL;
    		this->count = -1;   // Soso, eine leere Liste enthält also -1 Elemente. Dafür haben die Mathematiker eigentlich die Null erfunden. Sehr praktisch. Musst du dir unbedingt mal ansehen.
    	}
    
    	T getValue(int index){
    		ListElement<T>* temp = this->start; // Und wenn die Liste leer ist?
    
    		for(int i = 0; i < this->count; i++){ // Und wo kommt der Index in's Spiel? Du gehst die Liste bis zum Ende durch, nicht bis zum gesuchten Element
    
    			temp = temp->getNext();
    		}
    		return temp->getValue();
    	}
    
    };
    
    #endif
    
    #include "List.h"
    #include "ListElement.h"
    #include <iostream>
    
    int main(){
    	List<int>* l = new List<int>();
    	l->push_back(22);
    	l->push_back(44);
    	std::cout << l->getValue(0)<< std::endl;
    	std::cout << l->getValue(1)<< std::endl;
    
    	return 0;
    }
    


  • ach... blöder Fehler...
    Danke dir!

    Achso klar wenn ich das nächste Element lösche dann kann ich eigentlich nur das erste Element enfernen... hm wie mache ich das besser ? einfach ListObjekt löschen ?



  • Ja. Und natürlich den Pointer des Vorgängers auf den Nachfolger setzen.
    Und für count wäre vlt. size ein besserer Name und 0 ein besserer Startwert.



  • Dit_ schrieb:

    ach... blöder Fehler...
    Danke dir!

    Achso klar wenn ich das nächste Element lösche dann kann ich eigentlich nur das erste Element enfernen... hm wie mache ich das besser ? einfach ListObjekt löschen ?

    Momentan enthält deine List-Klasse noch nicht die nötige Funktionalität, um einzelne Elemente zu löschen.
    Im Prinzip musst du dann einen temporären Zeiger auf das zu entfernende Objekt anlegen und geschickt den Zeiger des vorangehenden Elementes auf das Folgende setzen (kleiner Nachteil an single-linked-lists, du hast keinen Zeiger "prev" :p). Dann kannst du es löschen.
    Dass du das next löschst ist gaaanz böse, denn das löscht dann selbstverfreilich alle folgenden Elemente.


Anmelden zum Antworten