Unterprogramme vergessen Kopfzeiger der verketteten Listen.
-
Hallo,
Ich habe eine verkettete Liste, die auch eigentlich funktioniert und 3 Daten einlesen soll. Zur besseren Übersicht will ich Unterprogramme verwenden, da ich Menupunkte für Ausgeben und Sortieren, Einlesen, und nach Katalognr suchen einbauen will.
Das Problem, das ich nun habe ist, dass ich nicht weiß, wie ich den Kopfzeiger immer an die Unterprogramme weiterreichen undwieder entgegennehmen soll. Ich habe schon versucht mit Zeiger auf Zeiger zu arbeiten, oder die Adresse weiterzureichen, aber irgendwie bekomme ich entweder nur Fehlermeldungen beim kompilieren, oder falls das Kompilieren mal klappt, bekomme ich "Segmentation Fault". Wie kann ich es also schaffen, dass der Kopfzeiger ständig zwischen jedem Unterprogramm weitergereicht wird, sodass ich die verkettete Liste nicht verliere.Ich benutze Linux, mit GCC 3.3.4
Hier das Listing:#include <iostream> #include <cstring> struct schueler { int katalognummer; char vorname[20]; char nachname[20]; schueler *next; }; schueler hinzufuegen(schueler *neu, schueler *head); schueler ausgeben(schueler *neu, schueler *head); int main(void) { int x; schueler *neuerzeiger; schueler *kopfzeiger; kopfzeiger = NULL; do { std::cout << "Treffen sie ihre Wahl:" <<"\n\n"; std::cout << "Schüler hinzufügen (Taste 1)." <<"\n"; std::cout << "Schüler nach Katalognummer suchen (Taste 2)." <<"\n"; std::cout << "Schülerliste nach Katalognr sortieren und ausgeben (Taste 3)." <<"\n"; std::cout << "Programm beenden (Taste 0)" <<"\n"; std::cin >> x; switch(x) { case 1: hinzufuegen(neuerzeiger, kopfzeiger); break; case 3: ausgeben(neuerzeiger, kopfzeiger); break; case 0: exit(1); break; default: std::cout << "Ungültige Eingabe " <<"\n"; } } while (x != 0); return 0; } schueler hinzufuegen(schueler *neu, schueler *head) { char temp[20]; int katnr; neu = new schueler; neu->next = head; //Next Zeiger d. neuen Elements auf aktuellen Wert des Kopfzeigers setzen. std::cout << "Katalognummer: "; std::cin >> katnr; neu->katalognummer = katnr; std::cout << "Vorname: "; std::cin >> temp; strcpy(neu->vorname, temp); std::cout << "Nachname: "; std::cin >> temp; strcpy(neu->nachname, temp); head = neu; //Kopfzeiger auf neues Element richten std::cout <<"\n"; } schueler ausgeben(schueler *neu, schueler *head) { schueler *aktuell; std::cout << "Schülerliste wird ausgegeben...\n"; std::cout << "Katalognummer\t Vorname\t Nachname\n"; aktuell = head; while (aktuell != NULL) { std::cout << aktuell->katalognummer <<"\t" << aktuell->vorname <<"\t" << aktuell->nachname <<"\n"; aktuell = aktuell->next; } std::cout << "\n"; }
-
Die Pseudo Lösung wäre einen globalen Kopfzeiger zu definieren, wie ich es jetzt gemacht habe, aber globale Variablen sind kein besonders guter Programmierstil, also wäre es toll wenn doch noch jemand eine richtige Lösung hätte.
-
Das Problem, das ich nun habe ist, dass ich nicht weiß, wie ich den Kopfzeiger immer an die Unterprogramme weiterreichen undwieder entgegennehmen soll
Gar nicht. Globale Variablen sind zwar nicht gut, aber als globale Variablen bezeichnet man eigentlich eher nur die, die wirklich im *ganzen* Programm global sind.
D.h, wenn dein Programm jetzt größer wäre, könnte man die Funktionen für die verkettete Liste in einer einzigen Datei, bzw. einer Listen-Klasse, unterbringen, wobei der Kopfzeiger auch nur in dieser Datei/Klasse bekannt wäre.
Man hat immer ein paar "halb-globale" Variablen, die letztendlich aber nur für ein paar Funktionen global sind.
-
Na gut, dann kann ich ja beruhigt sein