Template für lineare Liste von Knoten
-
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.
HabeNodePointer 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 gehabtAnsonsten 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 soListe():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 };