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_HDie 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?