Problem bei deque



  • Also ich habe ne Dequeklasse bebastelt, aber es tritt ein fehler auf den ich mir nicht erkären kann:

    #pragma once
    #include <algorithm>
    
    template<class T>
    class MyDeque
    {
    private:
    	class DequeElement
    	{
    	public:
    		T data;
    		DequeElement *next;
    		DequeElement *prev;
    		DequeElement(const T& t):data(t),next(NULL),prev(NULL) {}
    	};
    	class EmptyDequeException : public std::exception 
    	{
    		virtual const char* what() throw() {return "Deque is empty";}
    	};
    	DequeElement *first;
    	DequeElement *last;
    	unsigned int anz_elem;
    public:
    	MyDeque();
    	MyDeque(const MyDeque& other);
    	~MyDeque();
    	void push(const T& v);
    	void put(const T& v);
    	T pop();
    	T get();
    	T get_first();
    	T get_last();
    	unsigned int getAnzahlElemente();
    	bool is_empty();
    	void clear();
    	void swap(MyDeque& other);
    	MyDeque<T>& operator=(const MyDeque& other);
    };
    

    ist die klasse, der fehler tritt bei der push methode auf:

    template<class T>void MyDeque<T>::push(const T& v)
    {
    	DequeElement *temp = new DequeElement(v);
    	if(!this->first)
    		this->last = temp;
    	temp->next = this->first;
    	temp->prev = NULL;
    	this->first->prev = temp; <-- hier tritt der Fehler auf
    	this->first = temp;
    	++anz_elem;
    }
    

    Wenn ich next anstelle von prev schreibe, kommt kein fehler nur wenn ich prev schreibe kommt der fehler...

    Unhandled exception at 0x0040105e in container.exe: 0xC0000005: Access violation writing location 0x00000008.

    ist die fehlermeldung

    Danke im Voraus



  • Beim pushen des ersten Elements ist this->first == NULL und wird nicht initialisiert. Du versuchst aber auf this->first->prev zuzugreifen, was natürlich fehlschlägt.
    Vorschlag:

    template<class T>
    void MyDeque<T>::push(const T& v)
    {
        DequeElement *temp = new DequeElement(v);
        if(!this->first)
            this->first = this->last = temp; // first und last zeigen auf das selbe Element
        else
        {
            temp->next = this->first;
            //temp->prev = NULL; durch Ctor gewährleistet
            this->first->prev = temp; // first wurde bereits gesetzt
            this->first = temp;
        }
        ++anz_elem;
    }
    


  • iup das leuchtet mir ein^^

    danke für die schnelle antwort


Anmelden zum Antworten