Doubly linked list - elemente kopieren



  • Also, für die Uni sollen wir ne Linked List bauen. Die wird Teil eines größeren Projekts. aber irgendwie haut das bei mir nicht ganz hin.

    In meinem Test hierfür habe ich eine LinkedList von Streams gehabt.

    Ich kann Sachen hinzufügen, aber bei der get funktion crasht das programm(...Access violation reading location...) und der debugger(MS-VS2005) verweist mich auf zeile 85 in "ios". Wenn ich schritt für schritt durch den code gehe passiert das beim nach dem Zurückgeben des Stream objekts und beim benutzen des selbigen.

    Habe mal die Benutzung der vector Klasse der STL auskommentiert, aber im Prinzip soll diese Funktionalität implementiert werden. (Gewrappt funktioniert alles)

    template <class T> class LinkedList;
    
    template <class TYPE> class ListEntry{
    	friend class LinkedList<TYPE>;
    private:
    	ListEntry* next;
    	TYPE* data;
    	ListEntry* previous;
    	ListEntry<TYPE>(TYPE& entrydata, ListEntry* ptrPrevious, ListEntry* ptrNext){
    		this->data = &entrydata;
    		this->next = ptrNext;
    		this->previous = ptrPrevious;
    	}
    };
    
    template <class T>
    class LinkedList{
    private:
    	//std::vector<T> list;
    
    	ListEntry<T>* head;
    	ListEntry<T>* tail;
    	unsigned int numEntries;
    protected:
    public:
    	LinkedList(){
    		head = NULL;
    		tail = NULL;
    		numEntries = 0;
    	}
    
    	~LinkedList(){
    		ListEntry<T>* temp;
    		while(NULL != head){
    			temp = head;
    			head = head->next;
    			delete temp;
    		}
    	}
    
    	void add(const T& val){
    		ListEntry<T>* newElt = new ListEntry<T>(T(val), tail, NULL);
    		if(NULL == head){
    			head = newElt;
    			tail = newElt;
    		}
    		else{
    			tail->next = newElt;
    			tail = tail->next;
    		}
    		numEntries++;
    		//list.push_back(val);
    	}
    
    	void erase(unsigned int id){
    
    		if(id>=0 && id < numEntries){
    			ListEntry<T>* iterator = head;
    			for(int step = 0; step<id; step++){
    				iterator = iterator->next;
    			}
    			iterator->previous->next = iterator->next;
    			iterator->next->previous = iterator->previous;
    			iterator->previous = NULL;
    			iterator->next = NULL;
    			delete iterator;
    			numEntries--;
    		}
    		else{
    			throw "Index out of Bounds";
    		}
    
    		//list.erase(list.begin()+id);
    	}
    
    	bool isEmpty() const{
    		//return numEntries==0;
    		return list.size()<=0;
    	} 
    
    	T& get(int id){
    
    		if(id>=0 && id < numEntries){
    			ListEntry<T>* iterator = head;
    			for(int step = 0; step<id; step++){
    				iterator = iterator->next;
    			}
    			return *(iterator->data);
    		}
    		else{
    			throw "Index out of Bounds";
    		}
    
    		//return this->list[id];
    	}
    
    	const T& getReadOnly(int id) const{	
    
    		if(id>=0 && id < numEntries){
    			ListEntry<T>* iterator = head;
    			for(int step = 0; step<id; step++){
    				iterator = iterator->next;
    			}
    			return *(iterator->data);
    		}
    		else{
    			throw "Index out of Bounds";
    		}
    
    		// return this->list[id];
    	}
    
    	size_t size(void) const{
    		//return list.size();
    		return numEntries;
    	}
    };
    

    So, wäre dankbar wenn mit jemand sagen könnte was ich falsch gemacht habe.

    Danke,
    CStarter



  • Sache hat sich habs gerade gelöst. hab jetzt einen pointer für die neuen elemente benutzt statt ein objekt. das funktioniert dann.


Anmelden zum Antworten