Verkette Liste
-
Hey Leute,
ich hab heute aus übungszwecken ( da ich das mit den verketteten listen noch nicht wirklich verstehe^^) aus einem beispielscript ( doppeltverkette liste) eine einfachverkettete liste nachzuprogrammieren. Naja dabei sind wie mans sich denken konnte aber fehler aufgetreten
26 C:\Users\Fredi\Desktop\Projekte\Datenbank\main.cpp new types may not be defined in a return type
und
26 C:\Users\Fredi\Desktop\Projekte\Datenbank\main.cpp return type specification for constructor invalid
Und dann hier noch mein code:
#include <cstdlib> #include <iostream> #include <fstream.h> #include <string> #include <stdlib.h> using namespace std; class Knoten { public: Knoten(void); Knoten (int Alter); ~Knoten(); //Methoden void SetzteAlter(int Alter); void SetzteNachfolger(Knoten* Nachfolger); Knoten* HoleNachfolger(void); void Ausgabe(void); private: int m_Alter; Knoten* m_Nachfolger; } Knoten::Knoten(void) { m_Nachfolger = NULL; m_Alter = 0; } Knoten::Knoten(int Alter) { m_Nachfolger = NULL; m_Alter = Alter; } Knoten::~Knoten() { } void Knoten::SetzteAlter(int Alter) { m_Alter = Alter; } void Knoten::SetzteNachfolger(Knoten* Nachfolger) { m_Nachfolger=Nachfolger; } Knoten* Knoten::HoleNachfolger(void) { return m_Nachfolger; } void Knoten::Ausgabe(void) { cout<< m_Alter << endl; } class Liste { public: Liste(void); //Konstruktor ~Liste(void); //Destruktor void Hinzufuegen(Knoten* NeuerKnoten); void Ausgeben(void); void Loeschen(void); private: Knoten* ListenAnfang; Knoten* ListenEnde; }; //Die Zeiger ListenAnfang und ListenEnde mit NULL initialisieren Liste::Liste(void) { ListenEnde=ListenAnfang=NULL; } //Alle Knoten der Liste löschen, wenn die Liste gelöscht wird //Knoten in die Liste einfügen void Liste::Hinzufuegen(Knoten* NeuerKnoten) { if(ListenAnfang==NULL) { ListenAnfang=NeuerKnoten; ListenEnde=NeuerKnoten; } else { ListenEnde -> SetzteNachfolger(NeuerKnoten); ListenEnde = NeuerKnoten; } } void Liste::Ausgeben() { Knoten* p=ListenAnfang; //solange p nicht NULL ist while(p) { //Ausgeben der Attribute p -> Ausgabe(); //und p wird auf den NachfolgeKoten von p gesetzt p = p -> HoleNachfolger(); } } //Demostration der Listenfunktionalität int main(void) { Liste DieListe; //Liste instanzieren //einen neunen Knoten erzeugen Knoten* k = new Knoten(12); //den Knoten einfügen DieListe.Hinzufuegen(k); //Noch einen Knoten erzeugen, diesmal noch ohne Inhalt k = new Knoten(); //den Knoten Werte zuweisen k->SetzteAlter(32); //ebenfalls einfügen DieListe.Hinzufuegen(k); //das Eingegebene ausgeben DieListe.Ausgeben(); return 0; }Könnte mir da vll jemand sagen wo der fehler liegt vll. besser noch den Fehler etwas erklären ?

mfg friedrich
-
Es fehlt ein Semikolon am Ende der Definition von Knoten.
-
Da feht ein Semikolon bei der Klasse Knoten und der Destruktor fehlt, müsste noch sowas rein:
Liste::~Liste(void) { }Das void lässt man in C++ als Parameter normalerweise weg.
-
mmh wenn ich nach
class Knotendas semikolon setze kommt nur
10 C:\Users\Fredi\Desktop\Projekte\Datenbank\main.cpp expected unqualified-id before '{' token
noch dazu
-
class Knoten { public: Knoten(void); Knoten (int Alter); ~Knoten(); //Methoden void SetzteAlter(int Alter); void SetzteNachfolger(Knoten* Nachfolger); Knoten* HoleNachfolger(void); void Ausgabe(void); private: int m_Alter; Knoten* m_Nachfolger; }; // Hier kommt das Semikolon hin
-
ahh vielen dank euch hat geklappt

hab ich mich am ende auch noch doof angestellt und das semikolon falsch gesetzt

-
Wenn ich dir mal ein paar Ratschläge geben darf:
1.) Diese Liste ist ziemlich "C-like", heißt, der Benutzer muss mit vielen Zeigern + mit new hantieren. Mach doch Funktionen, mit denen man die Daten direkt einfügen kann, als dass man sich zuerst Knoten erzeugen muss.
2.) An deiner Stelle würde ich die Daten (Alter) vom Knoten trennen. Mach jeweils eine eigene Klasse, dann kannst du auch Listen von anderen Typen machen.
3.) Für das Ausgeben würde ich den Stream-Operator überladen. Dann kannst du die Daten auch problemlos in z.B. Dateien schreiben.Du kannst dir ja mal std::list ansehen und versuchen, dich ein bisschen daran zu orientieren. Muss ja nicht gleich ein Template mit Allokator und Iteratoren sein.
-
Wozu bindest du <cstdlib> UND das (nicht standardkonforme) <stdlib.h> ein? Eins von beiden reicht.