Erstellung einer simlen LinkedList



  • Hallo Zusammen

    Ich versuche schon seit langer zeit eine LinkedList zu erstellen. habe auch schon nach diesen LinkedLists gesucht, jedoch komme ich einfach nie auf einen grünen Zweig.

    Ich denke dass irgendwo ein kleiner Fehler liegt... Könntet ihr mir da weiterhelfen?

    Aufgabe0303.cpp

    #include <iostream>
    #include "Aufgabe0303.h"
    using namespace std;
    
    template <typename Object>
    Queue<Object>::Queue() {
    	Node node;
    	front = node;
    }
    
    template <typename Object>
    void Queue<Object>::insert(Object const &value) {
    	node.element = value;
    	Node x;
    	node.next = &x;
    }
    
    template <typename Object>
    void Queue<Object>::print() {
    	cout << front.element << "\n";
    
    }
    
    int main()
    {
    	Queue<int> q;
    	q.insert(1);
    	q.insert(22);
    	q.insert(13);
    	q.insert(9);
    
    	cout<<"Before removing data"<<endl;
    	q.print();
    
    	//q.remove();
    	//q.remove();
    	cout<<"After removing data"<<endl;
    	//q.print();
    	return 0;
    }
    

    Aufgabe0303.h

    template <typename Object>
    class Queue {
    	protected:
    		struct Node {
    			Object element;  	// element
    			Node*  next; 		// next pointer
    		};
    		typedef Node* NodePtr;  // pointer type to node
    		Node node;
    	private:
    		Node front; 			// pointer to the front of queue
    	public:
    		Queue();
    		//~Queue();
    		void insert(Object const &);
    		void remove();
    		void print(); 			// print queue elements
    };
    

    Das Programm läuft zwar reibungslos, nur ist die Ausgabe von 2293580 falsch. ich denke, dass hier irgendwo auf einen falschen Ort im Speicher gezeigt wird...

    mfg
    joethe



  • Object verfügt in dem Fall über keinen operator der std::ostream zurückgibt.. deswegen wird die Adresse ausgegeben.
    Beispiel ohne Wert:

    #include <iostream>
    #include <string>
    #include <ostream>
    
    class Object
    {
    public:
        Object() {}
        ~Object() {}
    };
    
    std::ostream& operator <<(std::ostream& o, Object& obj)
    {
        o << "Ich bin ein Objekt!";
        return o;
    }
    
    int main()
    {
        Object obj;
        std::cout << obj << std::endl;
        return 0;
    }
    

    rya.



  • Danke für die schnelle Antwort. Doch wie genau muss ich das jetzt lösen??
    Denn ich denke nicht, dass die explitize Adresse ausgegeben wird. Ich denke eher dass mein Pointer front.element auf eine falsche Adresse im Speicher zeigt....



  • Ich hab was überlesen. Object ist in dem Fall vom Typ int, daher muss das richtig ausgegeben werden. Mea culpa. Meine Antwort wäre richtig, wenn es eine beliebige Klasse ausser string wäre ^^.
    rya.



  • Es ist ja auch so, dass Node x immer auf dieselbe Adresse im Speicher zeigt. Aber das sollte ja so nicht sein... denn jetzt entsteh ja keine LinkedList...soein scheiss ist das doch...



  • Scorcher24 schrieb:

    Ich hab was überlesen. Object ist in dem Fall vom Typ int, daher muss das richtig ausgegeben werden. Mea culpa. Meine Antwort wäre richtig, wenn es eine beliebige Klasse ausser string wäre ^^.
    rya.

    Aber das ist doch irrelevant für die Ausgabe....???? Obs jetzt ein string, char, int oder was auch immer ist, mit cout wird doch alles ausgegeben...



  • Ich glaube, ich hab das Problem:

    template <typename Object>
    void Queue<Object>::insert(Object const &value) {
        node.element = value;
        Node *x = new Node;
        node.next = x;
    }
    

    Du hast Node erzeugt, aber keinen Zeiger sondern ein temporäres Objekt. Das wird nach dem verlassen von insert zerstört. Du musst hier den Speicherbereich allokieren mit new() und natürlich im Destruktor dann mit delete wieder freigeben. Daher kommt auch dein Fehler.

    Aber das ist doch irrelevant für die Ausgabe....???? Obs jetzt ein string, char, int oder was auch immer ist, mit cout wird doch alles ausgegeben...

    Falsch! Integrierte Typen wie int float etc, können ausgegeben werden und natürlich std::string. Hast du eine Klasse selbst erstellt, woher soll std::cout bitteschön wissen was von der Klasse er ausgeben soll?
    rya.



  • hmmmm leider zeigt der pointer bei jedem node immer ncoh auf die gleiche adresse. ich versuche jetzt mal eine ganz simpe integer linked list zu erstellen....



  • joethe schrieb:

    hmmmm leider zeigt der pointer bei jedem node immer ncoh auf die gleiche adresse. ich versuche jetzt mal eine ganz simpe integer linked list zu erstellen....

    Lies deinen Code 😡 .
    In Queue() hast du den selben Fehler.
    rya.



  • Scorcher24 schrieb:

    joethe schrieb:

    hmmmm leider zeigt der pointer bei jedem node immer ncoh auf die gleiche adresse. ich versuche jetzt mal eine ganz simpe integer linked list zu erstellen....

    Lies deinen Code 😡 .
    In Queue() hast du den selben Fehler.
    rya.

    hmmm Queue() habe ich aus der Aufgabenstellung kopiert....

    Was gibts denn da für einen Fehler??



  • omg ich habe doch keine ahnung von der sache. kann mir nicht jemand das programm ein wenig umschreiben, damit ich weiss wie es ginge???



  • habs jetzt doch noch herausgefunden. werde aber mein werk hier nicht reinstellen 😃 😃 😃 😃


Log in to reply