Übersicht
-
Hi
ist das normal, dass man als anfänger bei solchen Quellcodes schnell die Überischt verliert ? Mein Problem ist, dass ich den code zwar verstehe aber ca. nach der hälfte durcheinander bin und verpeile es irgentwie.Ich will nur wissen ob das so ist ^^ weil bestimmt gleich welche schreiben das
#include <iostream.h> veraltet ist ^^thx für Antworten
PS. Ich weiss nicht ob ich den Code aus "Jetzt lerne ich c++" von Markt und Technik posten darf ^^.
// *********************************************** // Datei: Listing 19.1 // // Zweck: Demonstriert verkettete Liste // Hinweise: // // COPYRIGHT: Copyright (C) 1997 Liberty Associates, Inc. // All Rights Reserved // // Zeigt objektorientierte Lösung für verkettete Listen. // Die Liste delegiert die eigentliche Arbeit an die // Knoten. Die Knoten sind abstrakte Datentypen. Es gibt // drei Knotentypen: Kopfknoten, Endeknoten und interne // Knoten. Nur die internen Knoten nehmen Daten auf. // // Die Klasse Data dient als Objekt, das in der // verketteten Liste gespeichert wird. // // *********************************************** #include <iostream.h> enum { kIsSmaller, kIsLarger, kIsSame}; // Data-Klasse für die Speicherung in der Liste // Jede Klasse in dieser verketteten Liste muß zwei Methoden unterstützen: // Show (zeigt den Wert an) und Compare (gibt relative Position zurück) class Data { public: Data(int val):myValue(val){} ~Data(){} int Compare(const Data &); void Show() { cout << myValue << endl; } private: int myValue; }; // Compare entscheidet, wohin ein bestimmtes Objekt // in der Liste gehört. int Data::Compare(const Data & theOtherData) { if (myValue < theOtherData.myValue) return kIsSmaller; if (myValue > theOtherData.myValue) return kIsLarger; else return kIsSame; } // Vorwärtsdeklarationen class Node; class HeadNode; class TailNode; class InternalNode; // ADT, der das Knotenobjekt in der Liste darstellt // Alle abgeleiteten Klassen müssen Insert und Show redefinieren class Node { public: Node(){} virtual ~Node(){} virtual Node * Insert(Data * theData)=0; virtual void Show() = 0; private: }; // Dieser Knoten nimmt das eigentliche Objekt auf. // Hier hat das Objekt den Typ Data. // Bei der Behandlung von Templates wird eine // Verallgemeinerung vorgestellt. class InternalNode: public Node { public: InternalNode(Data * theData, Node * next); ~InternalNode(){ delete myNext; delete myData; } virtual Node * Insert(Data * theData); virtual void Show() { myData->Show(); myNext->Show(); } // delegieren! private: Data * myData; // Die Daten selbst Node * myNext; // Zeigt auf nächsten Knoten in der verketteten Liste }; // Der Konstruktor führt nur Initialisierungen aus. InternalNode::InternalNode(Data * theData, Node * next): myData(theData),myNext(next) { } // Der Kern der Listenkonstruktion. Stellt man ein // neues Objekt in die Liste, wird es an den Knoten // weitergereicht. Dieser ermittelt, wohin das Objekt // gehört, und fügt es in die Liste ein. Node * InternalNode::Insert(Data * theData) { // Ist das neue größer oder kleiner als ich? int result = myData->Compare(*theData); switch(result) { // Ist das neue gleich groß, kommt es per Konvention vor das aktuelle. case kIsSame: // Gleich zum nächsten case-Zweig case kIsLarger: // Neue Daten vor mir einordnen { InternalNode * dataNode = new InternalNode(theData, this); return dataNode; } // Größer als ich, also an nächsten Knoten // weiterreichen. ER soll sich drum kümmern. case kIsSmaller: myNext = myNext->Insert(theData); return this; } return this; // Tribut an MSC } // Endeknoten ist einfach eine Markierung class TailNode : public Node { public: TailNode(){} ~TailNode(){} virtual Node * Insert(Data * theData); virtual void Show() { } private: }; // Wenn Daten zu mir kommen, müssen sie vor mir eingefügt werden, // da ich der Endeknoten bin und NICHTS nach mir kommt. Node * TailNode::Insert(Data * theData) { InternalNode * dataNode = new InternalNode(theData, this); return dataNode; } // Kopfknoten hat keine Daten, sondern zeigt einfach // auf den Beginn der Liste. class HeadNode : public Node { public: HeadNode(); ~HeadNode() { delete myNext; } virtual Node * Insert(Data * theData); virtual void Show() { myNext->Show(); } private: Node * myNext; }; // Nach Erzeugen des Kopfknotens erzeugt dieser // sofort den Endeknoten. HeadNode::HeadNode() { myNext = new TailNode; } // Vor dem Kopf kommt nichts, also die Daten einfach // an den nächsten Knoten weiterreichen Node * HeadNode::Insert(Data * theData) { myNext = myNext->Insert(theData); return this; } // Ich stehe im Mittelpunkt, mache aber gar nichts. class LinkedList { public: LinkedList(); ~LinkedList() { delete myHead; } void Insert(Data * theData); void ShowAll() { myHead->Show(); } private: HeadNode * myHead; }; // Bei Geburt erzeuge ich den Kopfknoten. // Er erzeugt den Endeknoten. // Eine leere Liste zeigt damit auf den Kopf, dieser // zeigt auf das Ende, dazwischen ist nichts. LinkedList::LinkedList() { myHead = new HeadNode; } // Delegieren, delegieren, delegieren void LinkedList::Insert(Data * pData) { myHead->Insert(pData); } // Rahmenprogramm zum Testen int main() { Data * pData; int val; LinkedList ll; // Benutzer zum Erzeugen von Werten auffordern. // Diese Werte in die Liste stellen. for (;;) { cout << "Welcher Wert? (0 zum Beenden): "; cin >> val; if (!val) break; pData = new Data(val); ll.Insert(pData); } // Jetzt Liste durchlaufen und Daten zeigen. ll.ShowAll(); return 0; // ll verliert Gültigkeitsbereich und wird abgebaut! }
-
Coda schrieb:
Hi
ist das normal, dass man als anfänger bei solchen Quellcodes schnell die Überischt verliert ? Mein Problem ist, dass ich den code zwar verstehe aber ca. nach der hälfte durcheinander bin und verpeile es irgentwie.Ja
Btw: die Liste find ich persönlich scheiße, da sie kein löschen von einzelelementen zulässt.