Problem mit Verkettete Liste
-
Hallo
Ich muss zum ersten mal eine Verkettete Liste durch Dynamische Instanzierung programmieren (mit Zeigern) und hab da so meine Startschwierigkeiten.
Also ich weiß nicht genau wie ich anfangen soll
Hier die Aufgabe: http://i.imgur.com/IZkPjiS.pngKann mir jemand helfen bzw ein paar Tipps dazu geben?
-
Überlege dir welche Objekte es gibt. Es gibt Krankheiten, Medikamente und Menus. Eine Krankheit hat einen Namen und eine Liste von wirkungsvollen Medikamenten. Einer Krankheit kann man ein Medikament hinzufügen, Medikamente auflisten, Medikamente löschen und komplett löschen. Medikamente haben einen Namen und eine Liste (?) aus Paaren aus Krankheit und Wirkungsgrad (Wirkungsgrad fehlt oben bei der Liste der Objekte).
Das Ganze kannst du für alle Objekte tun, die in deinem Programm eine Rolle spielen. Vielleicht hilft es dir es auf einem Blatt Papier aufzumalen, inklusive Pfeile für die Zeiger. Damit kannst du dir bestimmt vorstellen, was eine Funktion "Krankheit_Hinzufuegen" alles an Parametern braucht und tun muss. Pass auf, dass man nie auf nicht existierende Objekte zugreifen kann.
Wenn du eine spezifische Frage hast oder stecken bleibst, zum Beispiel wie du ohne wesentlichen Aufwand eine Liste baust (std::vector), dann frag.
-
Wo steht da, dass man eine verkettete Liste benutzen soll?
Zeiger braucht man da allerdings auch nicht.Für die Abbildung vom Krankheitsnamen auf eine Krankheitsakte kannst du gut
std::unordered_mapbenutzen. Oder, falls C++11 nicht zur Verfügung steht, tut es hier auchstd::map.
std::unordered_mapwird wahrscheinlich auch bei den Medikamenten gut passen.
Die bieten nämlich Methoden zum Einfügen, Löschen und Suchen an. Deren Funktionsweisen sind uninteressante Details, mit denen du dich noch nicht befassen solltest.Die Datenstrukturen könnten ungefähr so aussehen:
#include <string> #include <map> enum MedicationRating { Best, Good, //... }; struct Sickness { std::map<std::string, MedicationRating> nameToMedicationRatings; }; struct Patient { std::map<std::string, Sickness> nameToSickness; };Das war C++. Wenn du ein wenig recherchierst, hast du eine realistische Chance die Menüs damit gut hinzubekommen.
Dein Lehrer möchte wahrscheinlich so einen BS oder schlimmeres haben:
struct MedicationRating { char *name; int value; MedicationRating *next; }; struct Sickness { char *name; MedicationRating *firstMedicationRating; Sickness *next; }; struct Patient { Sickness *firstSickness; };Du hast keine Chance die Menüs damit vernünftig hinzubekommen. Versuchen kannst du es natürlich trotzdem. Bei beiden Varianten kannst du etwas lernen.
-
Die Vorgabe ist nunmal dass es u.a mit Zeigern gelöst werden soll, wir müssen das auch noch alles erst lernen, auch wenns für erfahrene Programmierer wohl viel leichter ist

Und wie meinst du das mit dem Menü?
Normalerweise würde ich da einen einfacehn Switch verwenden@nwp3: Das hab ich ja schon versucht, aber komm halt nicht so ganz weiter...weiß jetzt z.b nicht genau ob ich nur 2 Klassen machen soll (Krankheit, Medikament) oder noch ne 3. für die Liste dazumachen soll..

-
solider schrieb:
Die Vorgabe ist nunmal dass es u.a mit Zeigern gelöst werden soll, wir müssen das auch noch alles erst lernen, auch wenns für erfahrene Programmierer wohl viel leichter ist

Dann ist die clevere Methode, sich zunaechst eine eigene Listenklasse zu programmieren. Eine Liste musst du fuer die Aufgabe ohnehin programmieren, also kann man es auch gleich ordentlich und wieder benutzbar machen. Das macht bei dieser Aufgabe moeglicherweise ein wenig mehr Arbeit als gedacht. Aber du wirst als Anfaenger nicht beim ersten Versuch eine fehlerfrei Liste programmieren und wenn deine Liste eine eigene Klasse fuer sich ist, ist die Fehlersuche viel einfacher und insgesamt hast du weniger Arbeit. Ausserdem kannst du die Liste in zukuenftigen Aufgaben benutzen. Und das Beste: Wenn du es wirklich ordentlich machst, lernst du dabei sogar noch nuetzliche C++-Techniken (Stichwort ist beispielsweise RAII), anstatt bloss wie man mit Pointern rumfrickelt, was du nie wieder benoetigen wirst.
noch ne 3. für die Liste dazumachen soll..

Wuerde ich machen. Ist mehr Arbeit, gibt aber 1+ mit Sternchen, wenn du es gut machst.
Man kann sogar den Verdacht haben, dass dein Lehrer gar nicht weiss, wie man in C++ eine Liste orderntlich programmiert und moeglicherweise erstaunt ist, wenn er eine gute Umsetzung sieht. Die Aufgabenstellung laesst jedenfalls vermuten, dass er nach einem ser veralteten Stil unterrichtet und Wert auf die falschen Dinge legt (Wieso ist die Benutzerfuehrung so ein grosser Teil der Aufgabenstellung?)
-
solider schrieb:
@nwp3: Das hab ich ja schon versucht, aber komm halt nicht so ganz weiter...weiß jetzt z.b nicht genau ob ich nur 2 Klassen machen soll (Krankheit, Medikament) oder noch ne 3. für die Liste dazumachen soll..

Eine Klasse Liste zu machen ist eine gute Idee. Generell ist es eine gute Idee wenn eine Klasse nur eine Sache macht. Wie schon gesagt gibts das schon fertig im Standard-C++. Wenn du das nicht benutzen darfst wäre das unnötig umständlich, da würde ich nochmal nachfragen.
-
nwp3 schrieb:
Wenn du das nicht benutzen darfst wäre das unnötig umständlich, da würde ich nochmal nachfragen.
Das sehe ich nicht so, schließlich geht es auch darum, zu lernen, wie die Datenstrukturen funktionieren. Für mich war es damals die wichtigste Übung, selbst einmal eine generische vector-Klasse zu implementieren und dabei aufzupassen, dass man keine dangling-pointers, buffer overflows, oder memory leaks bekommt.
Schlimm wird es erst, wenn man für größere Aufgaben eigene Klassen benutzen soll.
-
Die Aufgabe kommt direkt von der Pharmaindustrie
