Telefonbuch mit Liste
-
Hallo zusammen,
ich bin ein einigermassen Neuling in C++ und habe daher ein Problem, wo Ihr mit hoffentlich schnell helfen könntet!Ich programmiere ein Telefonbuch mit einer Liste (struct) und sortiere die Einträge. Dies klappt soweit, nur dass wenn ich am Ende der Liste einen Eintrag einfüge (also einer der alphabetisch am grösste ist) verliert er mir Einträge am Anfang und ich weiss irgendwie nicht wieso. Ich suche den Fehler seit Stunden und blicke nicht mehr ganz durch, daher wäre ich froh um einen Hint.
Hier mein Code:
// Telefonbuch struct tele { char vorname[100]; char nachname[100]; char nummer[100]; tele *next; }; // Init Telefonbuch tele *telefonbuch=0; // --------- Print a List----------- void printBook(); // ------ Make new entries -------- void newEntry(); // --> Eingabe <-- void newEntry() { char lName[100]; char fName[100]; char number[100]; cout << "--- New Entry ---" << endl; cout << "Please enter the first name: "; cin.getline(fName,100); cout << "Please enter the last name: "; cin.getline(lName,100); cout << "Please enter the Phonenumber: "; cin.getline(number,100); tele *entry = new tele; strcpy(entry->vorname, fName); strcpy(entry->nachname, lName); strcpy(entry->nummer, number); // First Entry? if(telefonbuch == 0) { telefonbuch = entry; } else { bool weiter = true; bool vergleich; tele *tmp = telefonbuch; tele *begin=0; tele *tmpNode = new tele; do { //Entry alphabeticaly bigger? if (tmp) { if (strcmp(lName, (tmp->nachname))>0) { vergleich = true; } else { vergleich = false; } } else { vergleich = false; } // save entry before and go to the next entry if (vergleich) { strcpy(tmpNode->vorname, tmp->vorname); strcpy(tmpNode->nachname, tmp->nachname); strcpy(tmpNode->nummer, tmp->nummer); if (begin == 0) { begin = tmpNode; } else { begin->next = tmpNode; } tmp = tmp->next; } else { // assemble begin+entry+tmp(end) entry->next = tmp; tmp = entry; if (begin==0) { telefonbuch=tmp; } else { begin->next = tmp; tmp = begin; telefonbuch = tmp; } printBook(); weiter = false; } } while (weiter); } cout << "Eintrag erfolgreich!" << endl; }
Besten Dank, Jonas
-
Bevor ich mir 100+ Zeilen Code auf gut Glück durchlese ein guter Vorschlag: Momentanes Buch (lass mich raten: von Jürgen Wolf?) wegschmeißen, std::string, std::vector und std::list angucken, Programm nochmal neu schreiben (wird dadurch automatisch viel kürzer und viel sauberer) und staunen wie einfach das war und wie gut das funktioniert.
-
Das da ist eine C++- und C-Mutation!
-
SeppJ schrieb:
Bevor ich mir 100+ Zeilen Code auf gut Glück durchlese ein guter Vorschlag: Momentanes Buch (lass mich raten: von Jürgen Wolf?) wegschmeißen, std::string, std::vector und std::list angucken, Programm nochmal neu schreiben (wird dadurch automatisch viel kürzer und viel sauberer) und staunen wie einfach das war und wie gut das funktioniert.
Benutze kein Buch.
Dies ist eben eine Aufgabe, wo ich mit structs arbeiten soll.
Bis jetzt hat mir die Aufgabe zum bessern Verständnis von Pointern geholfen, aber eben. Irgendwie verliert er mir den Pointer 'begin' im beschriebenen Fall.Das da ist eine C++- und C-Mutation!
Das heisst?
-
wapplegraph schrieb:
Das da ist eine C++- und C-Mutation!
Das heisst?
Das bedeutet, wonach auch immer du lernst, hör auf damit! Das was du gelernt hast ist großer, gefährlicher Mist. Das liegt vermutlich nicht an dir, sondern am Lehrmaterial. Wenn du danach weiterlernst wirst du immer schlechter werden in C++.
-
SeppJ schrieb:
Das bedeutet, wonach auch immer du lernst, hör auf damit! Das was du gelernt hast ist großer, gefährlicher Mist. Das liegt vermutlich nicht an dir, sondern am Lehrmaterial. Wenn du danach weiterlernst wirst du immer schlechter werden in C++.
+1
EDIT: Wenn du nicht weisst, wo im Code du Müll machst:
struct tele { char vorname[100]; //std::string bitte char nachname[100]; //std::string bitte char nummer[100]; //Arithmerischer Typ bitte tele *next; //Weg damit }; tele *telefonbuch=0; //std::vector bitte void printBook(); void newEntry(); void newEntry() { //Vergiss es! }
Lieber so:
#include <string> #include <vector> #include <iostream> struct PhonebookEntry { std::string FirstName, LastName; unsigned long int Number; }; std::vector<PhonebookEntry> Phonebook; int main() { std::cout << "Hallo zu meinem Telephon-Buch-Programm\n\n"; //Code hier hin }
-
EOutOfResources schrieb:
char nummer[100]; //Arithmerischer Typ bitte
Bei dem Punkt muß ich widersprechen - Telefonnummern bestehen zwar hauptsächlich aus Ziffern, trotzdem macht es imho keinen Sinn, die als Zahl zu speichern.
-
CStoll schrieb:
EOutOfResources schrieb:
char nummer[100]; //Arithmerischer Typ bitte
Bei dem Punkt muß ich widersprechen - Telefonnummern bestehen zwar hauptsächlich aus Ziffern, trotzdem macht es imho keinen Sinn, die als Zahl zu speichern.
Jap, eine Telefonnummer würde ich auch als std::string machen.
Mach mal bei einemairthmerischenarithmetischen eine führende Null, was ja bei einer Telefonnummer sehr häufig vorkommen sollLg freeG
-
Ich hab einen Telefonpartner, da muss ich 19 oder 20 Ziffern eingeben, je nach dem was ich dem mitteilen will, auch deswegen würde ich zu std::string raten.
-
Hier, damit ihr euch das vorstellen könnt:
Telefonnummer Partner[hier 10] + Identnr.[5] + Gruppe[1] + Untergruppe[1] + prüfen[1] + Anzahl[1 oder 2]
-
SeppJ schrieb:
...std::string, std::vector und std::list angucken, Programm nochmal neu schreiben (wird dadurch automatisch viel kürzer und viel sauberer) und staunen wie einfach das war und wie gut das funktioniert.
Wenn der OP lernen möchte, wie eine verkettete Liste funktioniert, ist er - finde ich - nicht gut beraten selbige durch std::vector oder std::list zu ersetzen.
Zu allen anderen Anmerkungen: volle Zustimmung!
-
MassNerder schrieb:
Wenn der OP lernen möchte, wie eine verkettete Liste funktioniert
Dann sollte er eine Klasse schreiben, und nicht einen Node und ein paar Funktionen...