Problem mit Liste
-
Hallo erstmal,
ich heiß Flo bin 21 Jahre alt und studiere Wirtschaftsinfo im 2ten Semester.
Ich hab mir mal, weil ich Fleißig sein wollte ein kleines eigenes Projekt gestartet und da stoß ich auf ein Problem bei dem ich nicht weiter weiß.#include <iostream> #include <cstring> #include <fstream> #include <iomanip> using namespace std; class liste; class freunde { private: char* name; int tag, monat, jahr; char* adresse; int postleitzahl; char* stadt; freunde * next; public: friend class liste; freunde(); freunde(char*,int,int,int,char*,int,char*); freunde(const freunde&); void ausgabe(); char* getname(){return name;}; freunde* getnext(){return next;}; void setnext(freunde* name){next->name;}; }; class liste { private: freunde* anker; freunde a; public: liste(); void einfuegen(freunde f); void ausgabe(); ~liste(); void del(); }; //implementierung freunde::freunde() { name=adresse=stadt=NULL; tag=monat=1; jahr=1900; postleitzahl=0; } freunde::freunde(char *n, int t, int m, int j, char *a, int p, char * s) { name=new char[strlen(n)+1]; strcpy(name,n); tag=t; monat=m; jahr=j; adresse=new char[strlen(a)+1]; strcpy(adresse,a); postleitzahl=p; stadt=new char[strlen(s)+1]; strcpy(stadt,s); } freunde::freunde(const freunde &f) { name=new char[strlen(f.name)+1]; strcpy(name,f.name); tag=f.tag; monat=f.monat; jahr=f.jahr; adresse=new char[strlen(f.adresse)+1]; strcpy(adresse,f.adresse); postleitzahl=f.postleitzahl; stadt=new char[strlen(f.stadt)+1]; strcpy(stadt,f.stadt); } void freunde::ausgabe() { cout<<"Name: "<<name<<endl; cout<<"Geburtsdatum: "<<tag<<"."<<monat<<"."<<jahr<<endl; cout<<"Anschrift: "<<adresse<<endl; cout<<" "<<postleitzahl<<endl; cout<<" "<<stadt<<endl; } liste::liste() { anker=NULL; a.freunde(); //WIE SOLL ICH DAS HIER MACHEN?????? } void liste::einfuegen(freunde f) { freunde*neu =new freunde(f); freunde*zeiger= anker; //wenn liste leer if(anker==NULL) anker=neu; else if(strcmp( f.name,a.name)<1) //vorne einfügen //else if(strcmp(f.name,anker.name) geht nicht daher habe ich freund a in private bei der liste angelegt { neu->setnext(anker); anker =neu; } else{ //Einfügestelle wird gesucht while(zeiger->getnext()!=NULL && strcmp(zeiger->getnext()->getname(),f.name)<=0) { zeiger=zeiger->getnext(); } neu->setnext(zeiger->getnext()); zeiger->setnext(neu); } } void liste::ausgabe() { freunde* zeiger=anker; while(zeiger!=NULL) { zeiger->ausgabe(); zeiger=zeiger->getnext(); } } int main() { cout<<setfill('#')<<setw(69)<<"#"<<endl; cout<<"#"<<setfill(' ')<<setw(68)<<"#"<<endl; cout<<"# Hallo! Bitte waehle eine der folgenden Operationen aus:"<<setfill(' ')<<setw(7)<<"#"<<endl; cout<<"#"<<setfill(' ')<<setw(68)<<"#"<<endl; cout<<"# (1) Freund neu anlegen"<<setfill(' ')<<setw(40)<<"#"<<endl; cout<<"# (2) Freund verwalten"<<setfill(' ')<<setw(42)<<"#"<<endl; cout<<"# (3) Freunde anzeigen"<<setfill(' ')<<setw(42)<<"#"<<endl; cout<<"# (4) Freund suchen"<<setfill(' ')<<setw(45)<<"#"<<endl; cout<<"# (5) Freund loeschen"<<setfill(' ')<<setw(43)<<"#"<<endl; cout<<"#"<<setfill(' ')<<setw(68)<<"#"<<endl; cout<<setfill('#')<<setw(69)<<"#"<<endl<<endl; //Menü Auswahl int auswahl; cout<<"Auswahl der auszufuehrenden Aktion (1-5):"; cin>>auswahl; //Überprüfung der Eingabe //test(auswahl); //Auswahl der Funktion //wahl(auswahl); liste l(); freunde a("hans",3,5,1956,"panzerstr",90441,"nürnberg"); freunde b("agathe",5,4,1999,"dieselstr 23",64551,"germania"); freunde c("Bauer",6,7,1866,"bauer",5443,"fuerth"); freunde d("peter pan",7,34,1988,"sfsttt",34234512,"sfrrtr"); l.einfuegen(a); l.einfuegen(b); //<-damit ich das hier korrekt aufrufen kann? l.einfuegen(c); l.einfuegen(d); l.ausgabe(); return 0; }Hab da ein bissl rumprobiert nur komm ich da net weiter.
Wär schön wenn mir jemand sagen könnte wie ich das Regeln könnte.
-
hat hier keiner lust seinen senf dazu zu geben?

-
Es ist unverschämt nach ner halben Stunde schon zu pushen!
Hier mein Senf: http://www.worldofugly.de/ugly/798.gif
-
ich will niemanden pushen lediglich die leute die sich das anschaun ihre meinung dazu schreiben sollen, soweit sie verbesserungsvorschläge haben...

-
Also du solltest als erstes mal freunde und liste ordentlich trennen...
ich finds schon wieder total hässlich, wenn nen freund immer nen zeiger auf den nächsten hat.. wieso? nur weil du iwo mal freunde auflisten möchtest?!des weiteren würde ich an deiner stelle auf std::string anstatt auch char* setzen - die Vorteile liegen auf der Hand...
und wenn ich so etwas im header sehe, könnt ich immer ausrasten:
freunde(char*,int,int,int,char*,int,char*);1. muss es statt char* hier _immer_ const char* heißen, weil du da nichts änderst
2. sollte man im header immer parameter-bezeichnungen mitschreiben - weil man zu erst im header guckt, wenn man gerade nicht genau weiß, was die fkt für parameter erwartet(was an sich schon kein gutes zeichen ist, weil man idR keine Fkt braucht, die so viele Daten brauchen, dass es nicht mehr offensichtlich ist)vll hab ich morgen mehr Zeit, aber ich würd ganz grob schon mal folgendes ändern:
struct TName { std::string vorname; std::string nachname; }; struct TTag { int tag; int monat; int jahr; }; struct TAdresse { std::string strasse; int hausnummer; std::string plz; std::string ort; }; class freunde { private: TName name; TTag geburtstag; TAdresse adresse;natürlich jz allem noch Getter/Setter und nen CTor spendieren...
bb
-
idontknowweiter schrieb:
hat hier keiner lust seinen senf dazu zu geben?

Na ja, eigentlich immer das selbe.
- benutze std::string, statt irgenwelcher new-strcpy-Konstruktionen
- benutze Initialisierungslisten
- trenne die Funktionalität Liste von Freunde (oder Person)
- nutze die Standard-ContainerGruß
Werner
-
Naja was welche Vorteile hat, da kann ich leider nicht mitreden, denn so wurde mir das beigebracht und wird auch so in der prüfung abgefragt.(die sache mit dem new und strcpy, auch das mit dem header)
aber gut dann mach ich mich ans trennen ran, nur wie kann ich die dann wieder als liste ausgeben bzw einspeicher. (Listen sind so ne sache bei mir...
)
geplant war dann auch noch mit if- und ofstream das ganze in eine .txt zu schreiben bzw auszulesen...und wieso MUSS ich den zeiger const setzten macht das so einen großen unterschied??
vielen dank
flo
-
idontknowweiter schrieb:
und wieso MUSS ich den zeiger const setzten macht das so einen großen unterschied??
Jopp, tut es!
void foo(const char* val){} //hier ist klar, dass es nen reiner input-parameter ist void bar(char* val){} //hier denke ich als aufrufer, dass etwas an val verändert wird const char alfred1[] = "Alfred Mustermann"; foo(alfred1); //geht bar(alfred1); //geht nicht std::string alfred2(alfred1); foo(alfred2.c_str()); //geht bar(alfred2.c_str()); //geht nichtZum trennen Liste/Datentyp:
struct freund { char* name; //etc. }; struct list { struct node { node* next; freund data; }; node *first; //etc. };bb
PS: Naja - wenn das so abgefragt wird, ists natürlich besser, du übst den Umgang mit den Funktionen aus der C-Zeit noch ein wenig...