Template für lineare Liste von Knoten



  • Die schließende Klammer der anzeigen-Methode fehlt.



  • Das hätte ich eigentlich sehen müssen. 😉
    Nur habe ich jetzt einige neue Fehler mit denen ich nichts anfangen kann:

    --------------------Konfiguration: test2 - Win32 Debug--------------------
    Kompilierung läuft...
    1.cpp
    C:\Programme\Microsoft Visual Studio\MSDev98\MyProjects\test2\1.cpp(17) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'first'
    C:\Programme\Microsoft Visual Studio\MSDev98\MyProjects\test2\1.cpp(43) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'Liste<T>'
    C:\Programme\Microsoft Visual Studio\MSDev98\MyProjects\test2\1.cpp(17) : error C2501: 'Nodepointer' : Fehlende Speicherklasse oder Typbezeichner
    C:\Programme\Microsoft Visual Studio\MSDev98\MyProjects\test2\1.cpp(43) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'Liste<T>'
    C:\Programme\Microsoft Visual Studio\MSDev98\MyProjects\test2\1.cpp(17) : error C2501: 'first' : Fehlende Speicherklasse oder Typbezeichner
    C:\Programme\Microsoft Visual Studio\MSDev98\MyProjects\test2\1.cpp(43) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'Liste<T>'
    C:\Programme\Microsoft Visual Studio\MSDev98\MyProjects\test2\1.cpp(17) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'first'
    C:\Programme\Microsoft Visual Studio\MSDev98\MyProjects\test2\1.cpp(48) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'Liste<float>'
    C:\Programme\Microsoft Visual Studio\MSDev98\MyProjects\test2\1.cpp(17) : error C2501: 'Nodepointer' : Fehlende Speicherklasse oder Typbezeichner
    C:\Programme\Microsoft Visual Studio\MSDev98\MyProjects\test2\1.cpp(48) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'Liste<float>'
    C:\Programme\Microsoft Visual Studio\MSDev98\MyProjects\test2\1.cpp(17) : error C2501: 'first' : Fehlende Speicherklasse oder Typbezeichner
    C:\Programme\Microsoft Visual Studio\MSDev98\MyProjects\test2\1.cpp(48) : Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'Liste<float>'
    C:\Programme\Microsoft Visual Studio\MSDev98\MyProjects\test2\1.cpp(50) : warning C4305: 'argument' : Verkuerzung von 'const double' in 'const float'
    C:\Programme\Microsoft Visual Studio\MSDev98\MyProjects\test2\1.cpp(51) : warning C4305: 'argument' : Verkuerzung von 'const double' in 'const float'
    Fehler beim Ausführen von cl.exe.

    test2.exe - 6 Fehler, 2 Warnung(en)



  • Nodepointer first;
    

    sollte

    NodePointer first;
    

    sein
    Kurt



  • Die Warnungen kommen daher, dass ein 0.0 Literal double ist, für float musst du ein f dahinter schreiben (0.0f).

    Ich bin mir nicht sicher, ob es was ausmacht, aber ich würde

    typedef NodeType* NodePointer;
    

    schreiben.

    Dann solltest du noch Node entweder zu einem struct machen oder mit der Liste anfreunden:

    template <typename T>
    struct Node
    {/*...*/};
    
    // oder
    
    template <typename T>
    class Liste;
    
    template <typename T>
    class Node
    {
        friend class Liste<T>;
        // ...
    };
    

    Ein weiterer Fehler:

    NodePointer n = new NodePointer; // ist Quatsch
    NodePointer n = new NodeType; // so ist's richtiger
    


  • Habe Node zu einem struct gemacht und die Fehleranzahl hat sich auf eine einzige verringert. Ich denke es wird eine Flasche Sekt aufgemacht, wenn ich das Ding zum laufen bringe (selbstverständlich durch eure Hilfe 😉 ).

    C:\Programme\Microsoft Visual Studio\MSDev98\MyProjects\test2\1.cpp(29) : error C2440: 'initializing' : 'struct Node<float> *' kann nicht in 'struct Node<float> ** ' konvertiert werden



  • Jaha, dann lies noch mal den letzten Teil meines Posts!



  • Deine Hinweise habe ich eigentlich beachtet.
    Habe

    NodePointer n = new NodePointer;

    in

    NodePointer n = new NodeType;

    abgeändert und die main sieht nun so aus:

    int main()
    {
        Liste<float> lst;
    	lst.einfuegen(1.5f);
    	lst.einfuegen(4.3f);
    	lst.einfuegen(3.1f);
    	lst.anzeigen();
    
        lst.loeschen();
    	lst.anzeigen();
    
        return 0;
    };
    


  • temp und current in irgendwelchen Methoden sind als NodePointer* ausgewiesen, sollten aber NodePointer sein. Aber das hatten wir schon n paar mal 🙄



  • Es funktioniert jetzt alles, ausser in der anzeigen()-methode.
    es gibt eine access violation in:

    cout << current->data <<endl;
    


  • template <class T>
    struct Node
    {
        Node () : next (0) {}
        // Rest wie gehabt
    

    Ansonsten hat next nirgendwo den Wert NULL bzw. 0 (wie der C++ler tut).



  • Also ich habe keine Ahnung, wo das Zeigerproblem liegt. Werde ich mich mit dem zufrieden geben, was ich jetzt habe. Trotzdem danke nochmal .filmor für die Hilfe.



  • Hab's mir überlegt und gebe mich nicht zufrieden, so kurz vor dem Ziel aufzugeben 😮 . Bin also für jegliche Hilfe, die zur Lösung beihilft, sehr dankbar.
    Zur Übersicht gebe ich nochmal den gesamten Quelltext an:

    #include <iostream.h>
    #include <conio.h>
    #include <string.h>
    
    template <typename T> struct Node
    {
    	Node() : next (0) {};
    	T data;
        Node* next;
    };
    
    template <typename T> class Liste
    {
    	public:
    		typedef T Type;
    		typedef Node<Type> NodeType;
    		typedef NodeType* NodePointer;
            NodePointer first;
    
        void einfuegen(const T& wert)
    	{
    		NodePointer n = new NodeType;
    		n->data = wert;
    		n->next = first;
    		first = n;
    	}
    
    	void loeschen()
    	{
    		NodePointer temp = first;
    		first= first->next;
    		delete temp;
    	}
    
    	void anzeigen()
    	{
    		NodePointer current = first;
    		while(current != NULL)
    		{
    			cout << current->data <<endl;
    			current = current->next;
    		}
    	}
    };
    
    int main()
    {
        Liste<float> lst;
    	lst.einfuegen(1.5f);
    	lst.einfuegen(4.3f);
    	lst.einfuegen(3.1f);
    	lst.anzeigen();
    
        lst.loeschen();
    	lst.anzeigen();
    
        return 0;
    	getch();
    };
    


  • Die Klasse List braucht auch einen constructor denn sonst ist first nicht initialisiert. Nach dem einfügen des ersten nodes zeigt dann sein next pointer ins Nirvana.

    Kurt



  • Meinst du so?

    //...
    	Liste()
    	{
    	    first=NULL;
    	}
             //...
    


  • Jo
    oder so

    Liste():first(0) {
    }
    

    Kurt



  • Konstruktor initialisiert nun first. Nur die Fehlermeldungen werden immer kryptischer. Hat das immernoch was mit dem Zeiger zu tun?

    "ntdll.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
    "C:\WINDOWS\system32\kernel32.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
    "C:\WINDOWS\system32\user32.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
    "C:\WINDOWS\system32\gdi32.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
    "C:\WINDOWS\system32\uxtheme.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
    "C:\WINDOWS\system32\msvcrt.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
    "C:\WINDOWS\system32\advapi32.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
    "C:\WINDOWS\system32\rpcrt4.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
    "C:\WINDOWS\system32\msctf.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
    "C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.2180_x-ww_a84f1ff9\comctl32.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
    "C:\WINDOWS\system32\shlwapi.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
    "C:\WINDOWS\system32\oleaut32.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
    "C:\WINDOWS\system32\ole32.dll" wurde geladen. Es wurden keine entsprechenden Symbolinformationen gefunden.
    Thread 0x11C wurde mit Code 0 (0x0) beendet.
    Das Programm "C:\Programme\Microsoft Visual Studio\MSDev98\MyProjects\test3\Debug\2.exe" wurde mit Code 0 (0x0) beendet.



  • Wo siehst du da eine Fehlermeldung ?
    K.



  • Das sind keine Fehlermeldungen, sondern die üblichen Debug-Ausgaben der eingebundenen Bibliotheken - eigentlich sollte sich parallel zu diesen Ausgaben dein Konsolenfenster geöffnet haben und ein paar Ausgaben ausspucken.

    PS: Ich würde ja noch den Node-Konstruktor etwas erweitern:

    template<typename T>
    struct Node
    {
      Node(const T& wert,Node* n=0):data(wert),next(n){}
      //Rest wie bisher
    };
    
    template<typename T>
    class Liste
    {
    public:
      void einfuegen(const T& wert)
      {
        NodePointer temp=new NodeType(wert,first);
        first=temp;
      }
      //Rest wie bisher
    };
    

Anmelden zum Antworten