Problem bei Programm



  • Ich soll ein Programm entwerfen, welches mit einer verketteten Liste arbeitet.
    Habe ein Problem, weil das Programm nicht laufen will.

    #include <stdlib.h> 
    #include<iostream>
    
    using namespace std;
    
    #ifndef LISTENCONTAINERSORT_H 
    #define LISTENCONTAINERSORT_H 
    
    template <typename T> 
    class ListenContainer { 
    
    protected: 
    
        // gekapselte innere Klasse 
        class Knoten { 
        public: 
            T data;         // Eintrag = Datenobjekt 
            Knoten* next;   // Verweis auf Nachfolger 
    
            // Konstruktor 
            Knoten(const T& data, Knoten* next) : data(data), next(next) {} 
        }; 
    
        Knoten* first;      // Verweis auf ersten Knoten 
    
    public: 
    
        //Konstruktor 
        ListenContainer(): first(NULL) {}; 
    
    	//(8b) Destruktor
    	~ListenContainer() { delete[] first; }
    
        //neuen Eintrag am Anfang der Liste einfuegen 
        void insertFirst(const T& obj)
        { 
            first = new Knoten(obj, first); 
        } 
    
        //Eintrag am Anfang der Liste loeschen 
        void removeFirst() 
        { 
            if ( first != NULL) 
            { 
                Knoten* temp = first; 
                first = first->next; 
                delete temp; 
            } 
        } 
    
        //(d) Ausgabe 
        void ausgabe() 
        { 
            Knoten* knoten = first; 
            cout << endl; 
    		if (knoten == NULL)
    			cout << "Die Liste ist leer." << endl;
            while(knoten != NULL) 
            { 
                cout << knoten->data << endl; 
                knoten = knoten->next; 
            } 
            cout << endl; 
        } 
    
        //(e) Wieviele Eintraege enthaelt der Container? 
        int size() 
        { 
            int m=0; 
            Knoten* lauf = first; 
            while (lauf != NULL) 
            { 
                m++;                //Zaehle Eintraege 
                lauf = lauf->next; 
            } 
            return m; 
        } 
    
    	//(f) leere den Container 
        void clear() 
        { 
            first = NULL; 
            delete first; 
    		cout << "Liste wurde geleert.";
        } 
    
    	//(g) Ist der Container leer? 
        bool empty() 
        { 
            return first == NULL; 
        } 
    
        //(8e) Suche k und gebe aus, ob k gefunden wurde (true) oder nicht (false) 
        bool find(int k) 
        { 
            Knoten* lauf = first; 
            while (lauf != NULL) 
            { 
                if (lauf->data == k) 
                    //return lauf->data;	//k wurde gefunden 
                    if (lauf->data > 0) 
                        return true;        //k wurde gefunden 
                lauf = lauf->next; 
            } 
            return false;                   //k wurde nicht gefunden 
        } 
    
        //(8g) Loesche Eintrag mit Schluesselwert k aus Container, falls enthalten 
        int remove(int k) 
        { 
            //Nichts zu tun 
            if (empty()) 
                return 0; 
    
            //1.Fall: Eintrag steht am Anfang 
            if (first->data == k) 
            { 
                first = first->next; 
                delete first;                   //Loesche Eintrag bei first               
                return 0; 
            } 
    
            //2. Fall: Eintrag muss gesucht werden 
            Knoten* pred = first; 
            Knoten* lauf = first->next;          //Beginne beim zweiten Eintrag 
            while (lauf != NULL) 
            { 
                if (lauf->data == k) 
                { 
                    pred->next = lauf->next; 
                    delete lauf;                //Loesche Eintrag bei lauf 
                    return 0; 
                } 
                pred = lauf; 
                lauf = lauf->next; 
            } 
            return 0; 
        } 
    
    }; // class ListenContainer 
    
    template <typename T> 
    class ListenContainerSort : public ListenContainer<T> { 
    
    public: 
    
    	//(h) Destruktor
        ~ListenContainerSort() 
        { /*
            while(ListenContainerSort->next != NULL) 
            { 
                ListenContainerSort<T> *next = ListenContainerSort->next; 
                delete ListenContainerSort<T>(); 
                ListenContainerSort<T>()= next; 
            } 
            delete ListenContainerSort<T>();*/ 
        } 
    
        //(c) Hilfsmethode fuer das sortierte Einfuegen von Objekten 
        ListenContainerSort* findPreview(const T& obj) 
        {
    
    		Knoten<T> *knoten = ListenContainer<T>::first;
            while (knoten != NULL)
            {
                if (knoten->obj == obj)
                    return knoten;
                else
                    knoten = knoten->next;
            }
            return NULL;
        }
    
        //(c) Sortiertes Einfuegen von Objekten in den Container 
        void insertionSort(const T& obj) 
        { 
            Knoten** p; 
            for( p = &first; *p != 0; p = &((*p)->next) ){ 
                if ((*p)->data >= obj) 
                    break; 
            } 
            *p = new Knoten(obj,*p); 
        } 
    
        /*
    
    }; // class ListenContainerSort 
    
    //globale Template-Funktion 
    template <typename T> 
    void sort(T* arr, int size) 
    { 
    	ListenContainerSort<T> liste;
        //Eintraege aus dem Array in die Liste einsortieren
        for (int i=0; i<=size; i++)
        { 
            ListenContainerSort<T>* erg = liste.findPreview(arr[i]); 
            if (erg) 
                liste.insertionSort(arr[i]); 
            else
                cout << "Liste zu Ende." << endl; 
        } 
        //Liste zurueck in das Array schreiben 
        for (int j=0; j<size; j++) 
        { 
            arr[j]=liste.insertFirst(j); // Hier zeigt er error C2440 '=' kann void        
                                            nicht in int konvertieren
        } 
    } 
    
    #endif //LISTENCONTAINERSORT_H
    

    Die main.cpp dazu lautet:

    #include "ListenContainerSort.h" 
    
    #include <iostream> 
    #include <time.h> 
    using namespace std; 
    
    int main(void) 
    { 
        srand(unsigned(time(NULL)));    //Zufallsgenerator generieren 
    
    	//Testen der Methoden aus d, e, f, g
    	int n; 
        cout << "Eine positive ganze Zahl eingeben: "; 
        cin >> n; 
    
    	ListenContainer<int> liste; 
    
    	//Neue Einträge am Anfang der Liste einfuegen (Einträge sind Zufallszahlen)
        for (int i = 1; i <= n ; i++ )
    		liste.insertFirst(rand()%100);
            //liste.insertFirst(i); 
    
    	//(d) Inhalt des Containers ausgeben 
        liste.ausgabe(); 
    
        //(e) Wieviele Einträge enthält der Container? 
        cout << "size(): " << liste.size() << endl << endl; 
    
        //(f) leere den Container 
        liste.clear(); 
        liste.ausgabe(); 
    
        //(g) Ist der Container leer? 
        cout << "empty(): " << liste.empty() << endl << endl; 
    
    	//Testen von sort()
    
        int groesse; 
        cout << endl << "Welche Groesse soll das Array von Pseudozufallszahlen haben: "; 
        cin >> groesse; 
    
        int *arr = new int[groesse];    //das Array erstellen 
    	cout << endl;
    	if (groesse == 0)
    		cout << "Das Array ist leer." << endl;
        else
    	{
    		for(int i=0; i<groesse; i++) 
    		{
    			arr[i] = rand()%100;        //mit Zufallszahlen füllen
    			cout << arr[i] << endl;		//und ausgeben
    		}
    	}
    	cout << endl;
    
        //(i),(j) Zufallszahlen-Array in Liste einsortierung 
        //und in Array zurückschreiben 
        //(beinhaltet Test von insertionSort() ) 
        sort(arr,groesse); 
    
        return 0;
    }
    

    Alles funktioniert bis ich auch sort(arr,groesse) aufrufe.
    Wie kann ich den Fehler beheben.



  • insertFirst gibt nix zurück (-> void), was willst du da in en Array stecken?!



  • Heißt das, dass der Fehler bei bei insertFirst liegt? Es soll bei InsertFirst ein neuer Eintrag an den Anfang eingefügt werden.



  • Habe es versucht zu ändern.

    int insertFirst(const T& obj)
        { 
            first = new Knoten(obj, first);
    
    		return obj;
        }
    

    Jetzt gibt es Probleme bei findPreview.

    ListenContainerSort* findPreview(const T& obj) 
        {
    
            Knoten<T> *knoten = ListenContainer<T>::first; //error C2143: 
                                                             Syntaxfehler: Es fehlt 
                                                             ';' vor '<'
            while (knoten != NULL)
            {
                if (knoten->obj == obj)
                    return knoten;
                else
                    knoten = knoten->next;
            }
            return NULL;
        }
    

    Was soll ich jetzt tun?



  • Erstmal deine Beiträge nicht nachträglich verändern. Jedenfalls nicht wichtige Dinge später rein oder rausschreiben. Die main-Funktion stand da vorhin noch nicht drin.
    Zweitens Syntax-Highlighting anmachen hier im Forum: Statt nur die C++ Buttons stehen unter dem Eingabefenster neben dem Code Button.

    Und so wie du sprichst, glaube ich nicht, dass du einen Plan hast, was du da geschrieben/kopiert hast. Ich glaube eher, das ist eine Aufgabe für die Schule/Uni, die obligatorisch ist und du hast dir was zusammen gekopiert und es geht nicht (wie zu erwarten ist).

    Erklär doch mal, was dein Programm machen soll und was es macht. Und ja es dürfen ruhig mehr als 2 oder 3 Sätze sein, denn wieso sollen wir Zeit und Arbeit investieren, wenn dud as selbst nicht machst?!



  • Ich habe einen sortierten Listen-Container. Das ist ein Container, der seine Elemente in einer geordneten Liste verwaltet. Die Elemente sind Objekte vom Datentyp Knoten und sollen geordnet gespeichert werden. Dafür sollen die Objekte schon beim Einfügen an den Richtigen Platz gesetzt werden. Die Knoten müssen manchmal dynamisch erzeugt werden bzw. der Speicher muss explizit wieder frei gegeben werden.

    Die Klasse Knoten und Teile von Listen Container waren gegeben. Den Rest von Klasse ListenContainer habe ich noch selbst hinbekommen. Wo ich mir "Hilfe" geholt habe war bei insertionSort(const T& obj) und bei der Hilfsfunktion findPreview().
    insertionSort soll dafür sorgen, dass ein Element an die Richtige der Liste eingefügt werden soll. findPreview soll mir die Adressen der Knoten zurückgeben.



  • Ich würde die Funktion insertionsort(const T& obj) gerne anders schreiben.

    void insertionSort(const T& obj) {
       // obj ist Feld/Liste mit Elemente s[t]1[/t]...s[t]i[/t]
       for(n=2;n<i;i++) {
            obj=obj[n];
            j=n;
            while (j > 1 ∧ obj.key < obj[j-1].key){
                     obj[j] = obj[j–1]  //verschieben der Elemente i. rechts
                     j = j – 1
            }
            obj[j] = obj  //Einfügen
    
       } 
    }
    

    1. Frage wie komme ich an die Länge? Dachte mir mit size().
    2. Wie muss ich mit obj umgehen? Muss ich es als Liste initialisieren?


Anmelden zum Antworten