001
16.12.2005, 17:58 Uhr
Aconcagua
|
Ziemliches Chaos.
Erst mal fehlen bei den Methoden die Rückgabewerte; die entfallen NUR bei Konstruktoren.
Dann sind einige Variablen, die in den Methoden verwendet werden, gar nicht in der Klasse deklariert, so z. B. first, Anzahl, count, ...
Die Methoden sind als 'struct' deklariert, was (pardon, dass ich so direkt bin) völliger Blödsinn ist. structs sind nicht viel anders als classes, nur dass implizit alle member public sind.
Pascal-Erfahrung? Soweit ist rein funktional programmiert, C++ unterstützt Objektorientierung. Das könnte man in der Kurzfassung so beschreiben, dass Klassen selbst arbeiten können:
Liste erzeugen, an ihr Methoden aufrufen:
C++: |
// Liste wird erzeugt List* list = new List(); // liste führt methode xyz aus list->xyz();
|
In diesem zusammenhang unpraktisch, wenn auch nicht falsch, ist, dass die Methoden sämtlichst die Liste übergeben bekommen - dann könnte man sie auch 'static' deklarieren, da sie das eigene Objekt gar nicht benötigen, besser aber ist es in diesem Fall, die Übergebene Liste wegzulassen und stattdessen die Methode "am eigenen Objekt" aufzurufen (falls nicht klar ist, was ich hiermit meine, bitte in Büchern den Unterschied zwischen Klassenmethoden einerseits und Objekt- bzw. Instanzmethoden andererseits nachlesen).
Hab' mir mal die Mühe gemacht, das selbst zu implementieren, die main() ist ein kleines Anwendungsbeispiel, ich hoffe, das hilft weiter.
C++: |
#include <iostream>
class List { private: // innere ElementKlasse zum Speichern der ListenElemente class Element { public: Element() {next = 0;} ~Element() {} // zeiger auf NachfolgeElement Element* next; // int*, um Daten zu simulieren. Stattdessen Pointer // auf entsprechendes Datenobjekt, das gespeichert werden soll. int* data; }; // ListenKopf Element* head; public: List() {head = 0;} ~List() { // löscht alle Elemente in der Liste while(head != 0) { Element* hd = head; head = head->next; delete hd; } } void insert(int* wo, int* in); // Bequemlichkeitsmethode void insert(int* in) {insert(0, in);} int* remove(int* data); int* find(int pos); };
void List::insert(int* wo, int* in) { Element* elem = new Element(); elem->data = in; Element* e = head; if(wo) { // falls ListenElement da und data != wo // überspringe while(e && e->data != wo) e = e->next; // falls wo gefunden // dahinter einfügen if(e) { elem->next = e->next; e->next = elem; return; } } // hierher gelangt man, falls wo == 0 // oder falls wo nicht in Liste gefunden // in am ListenAnfang einfügen elem->next = head; head = elem; }
int* List::remove(int* data) { Element* e = head; // zeiger auf vorheriges Element Element* eAlt = 0; if(data) { while(e && e->data != data) { eAlt = e; e = e->next; } if(e) { if(eAlt) eAlt->next = e->next; else // eAlt nie gesetzt -> while-Schleife nie betreten // -> gesuchtes Element ist Listenkopf head = head->next; int* data = e->data; delete e; return data; } } else { // kein data angegeben, lösche ListenKopf if(head) { head = head->next; // e zeigt noch auf den alten head int* data = e->data; delete e; return data; } } // nichts zu löschen return 0; }
int* List::find(int pos) { int p = 0; Element* e = head; while(p < pos && e) { e = e->next; p++; } if(e) return e->data; else return 0; }
int main() { List* list = new List(); int num[] = {1, 2, 3, 4, 5, 6}; list->insert(&(num[0])); list->insert(&(num[3])); std::cout << *(list->remove(0)); std::cout << *(list->find(0)); }
|
Dieser Post wurde am 16.12.2005 um 18:01 Uhr von Aconcagua editiert. |