problem mit dem versuch eine linked list zu entwerfen...



  • irgendwie scheint es probleme mit dem indexing zu geb, denn ich bekomme imer speicherzugrifffehler. aber auch macht die liste einen inkonsistenten eindruck (ist ja noch nicht ferttig, aber ich würde gerne wissen wie man die grundlegend besser machen könnte.

    #include <iostream>
    #include <math.h>
    
    using namespace std;
    
    template <class T>
    class vector
    {
    private:
    	T *data;
    
    public:
    	//! eigentlich priv
    	int index;
    	vector *next;
    	vector *before;
    	vector *first;
    	vector *last;
    
    	//!konstruktor
    	vector();
    	vector(T &v);
    	vector(vector &v);
    	~vector();
    
    	//! setter
    	bool push_back(T data);
    
    	//! cleaner
    	void delete_at(int i);
    	void clear();
    
    	//! getter
    	T get_last();
    	T get_first();
    	T get_at(int index);
    }; 
    
    //! konstrukoren & destruktoren
    template <class T>
    vector<T>::vector() {
    	index = 0;
    
    	data = new T;
    	data = NULL;
    
    	first = this;
    
    	last = NULL;
    	next = NULL;
    	before = NULL;
    }
    
    template <class T>
    vector<T>::~vector()
    {
    
    }
    
    //! daten-settups
    template <class T>
    bool vector<T>::push_back(T data) {
    	next = new vector;
    	if(data != NULL) {
    		//daten setzen
    		next->data = &data;
    		//linken
    		next->before = this;
    		next->first = first;
    		next->last = next;
    		//indexing
    		next->index = index++;
    
    		return true;
    	}
    	else {
    		cout<<"can't set data - NULLPOINTER"<<endl;
    
    		return false;
    	}
    }
    
    //! getter
    template <class T>
    T vector<T>::get_last()
    {
    // 	if(data != NULL)
    		return *next->data;
    // 	else cout<<"can't get data - NULLPOINTER"<<endl;
    }
    
    //! getter
    template <class T>
    T vector<T>::get_at(int ind)
    {
    	vector *pos = first;
    cout<<"index: "<<pos->index<<endl;
    cout<<"index: "<<pos->next->index<<endl;
    cout<<"index: "<<pos->next->next->index<<endl;
    cout<<"index: "<<pos->next->next->next->index<<endl;
    cout<<"index: "<<pos->next->next->next->next->index<<endl;
    	while(true) {
    		pos = pos->next;
    		if(pos->index == ind) {
    			return *pos->data;
    		}
    		if(pos == last) {
    			return NULL;
    		}
    	}
    }
    
    template <class T>
    T vector<T>::get_first()
    {
    // 	if(data != NULL)
    		return *first->data;
    // 	else cout<<"can't get data - NULLPOINTER"<<endl;
    }
    
    int main()
    {
    	vector<int> v;
    	v.push_back(1);
    	v.push_back(2);
    	v.push_back(3);
    	v.push_back(4);
    	v.push_back(5);
    
    	cout<<v.get_at(0);
    // 	cout<<v.get_last()<<endl;
    // 	cout<<v.get_first()<<endl;
    
    	return 0;
    }
    


  • Warum so ein Aufwand?
    Das was du vorhast ist schon in der STL

    #include<vector> 
    ... 
    vector MeinVektor<int>;
    

    Nutz doch das was fertig ist 🙄



  • ich denke mal, dass man dadurch etwas lernen möchte...



  • ich habe mal die liste besser gemacht, leider noch mit nem klitzkleinem problem bei dem aufinden des ersten elementes:

    #include <iostream>
    #include <math.h>
    
    using namespace std;
    
    template <class T>
    class vector
    {
    private:
    	T *data;
    
    public:
    	//! eigentlich priv
    	int index;
    	vector *next;
    	vector *prev;
    
    	//!konstruktor
    	vector();
    	vector(T &v);
    	vector(vector &v);
    	~vector();
    
    	//! setter
    	bool push_back(T data);
    	//! cleaner
    	void delete_at(int i);
    	void clear();
    	//! getter
    	T get_last();
    	T get_first();
    	T get_at(int index);
    }; 
    
    //! konstrukoren & destruktoren
    template <class T>
    vector<T>::vector() {
    	next = NULL;
    	prev = NULL;
    
    	data = NULL;
    	index = 0;
    }
    
    template <class T>
    vector<T>::~vector()
    {
    
    }
    
    //! daten-settups
    template <class T>
    bool vector<T>::push_back(T data) {
    	vector *new_node = new vector;
    	new_node->data = &data;
    	new_node->next = NULL;
    
    	//verknüpfung zum alten beim neuen element
    	new_node->prev = this->next;
    cout<<"new_node->prev: "<<new_node->prev<<endl;
    	//verknüpfung zum neuen beim alten element
    	this->next = new_node;
    cout<<"this->next: "<<this->next<<endl;
    
    	new_node->index = index;
    	index++;
    }
    
    //! getter
    template <class T>
    T vector<T>::get_last()
    {
    // 	if(data != NULL)
    cout<<"THIS: "<<next<<endl;
    		return *next->data;
    // 	else cout<<"can't get data - NULLPOINTER"<<endl;
    }
    
    template <class T>
    T vector<T>::get_first()
    {
    	while(true) {
    		cout<<"index: "<<next<<" data: "<<*next->data<<endl;
    		if(next->index == 0) {
    			return *next->data;
    		}
    		else {
    			next = next->prev;
    		}
    	}
    }
    
    //! getter
    template <class T>
    T vector<T>::get_at(int ind)
    {
    	vector *pos;
    	while(pos != NULL) {
    		pos = this->prev;
    		if(pos->index == ind) {
    			return *pos->data;
    		}
    	}
    }
    
    int main()
    {
    	vector<int> v;
    	v.push_back(1);
    	v.push_back(2);
    	v.push_back(3);
    	v.push_back(4);
    	v.push_back(5);
    
    // 	cout<<v.get_at(5);
    	cout<<v.get_last()<<endl;
    	cout<<v.get_first()<<endl;
    
    	return 0;
    }
    

    lasst mal durchlaufen und schaut was ich für ne ausgabe bekomme:

    qfya:~/devel> ./a.out
    new_node->prev: 0
    this->next: 0x804b008
    new_node->prev: 0x804b008
    this->next: 0x804b020
    new_node->prev: 0x804b020
    this->next: 0x804b038
    new_node->prev: 0x804b038
    this->next: 0x804b050
    new_node->prev: 0x804b050
    this->next: 0x804b068
    THIS: 0x804b068
    5
    index: 0x804b068 data: 134514616
    index: 0x804b050 data: 134514616
    index: 0x804b038 data: 134514616
    index: 0x804b020 data: 134514616
    index: 0x804b008 data: 134514616
    134514616
    

    also man sieht:
    -ein cout<<v.get_last()<<endl; liefert korrekterweise:

    THIS: 0x804b068
    5
    

    die adresse stimmt mit den erzeugten obejkten überein...

    dann der versuch die liste zu durchlaufen:
    cout<<v.get_first()<<endl;
    der aufruf liefert ein paar wunderbare adressen:
    index: 0x804b068 data: 134514616
    index: 0x804b050 data: 134514616
    index: 0x804b038 data: 134514616
    index: 0x804b020 data: 134514616
    index: 0x804b008 data: 134514616

    aber warum keine daten 🙄 denn die adresse bsp-weise: 0x804b068 enthält die 5 und wurde ja auch schon ausgegeben. was soll das????

    achso... und wegen dem grund... natürlich weils mich interessiert, ich wollte einfach nur wissen wie ich ne liste implementiere. da man allzu leicht bei der benutzung von sachen wie qt verlernt mit zeigern zu arbeiten, wie man sieht.



  • die get_at habe ich noch nicht korrigiert, weils - ich weiß dass die noch müll ist- es geht erstmal drum den fehler in der get_first zu finden, oder evtl im konstr... ich denke die fkt. ist sauber ):



  • Deine Daten sind kaputt, weil du die Adresse der Daten speicherst (bei dem Aufruf von z.B. push_back(1) übergibt du eine temporäre Variable).
    Also speicher die Daten direkt, nicht als Zeiger:

    private:
        T data;
    

Anmelden zum Antworten