Anfängerproblem mit Structure, verk. Listen und Zeigern
-
Hi @all,
folgender Code macht mir Probleme:
// ----- Structure Person ---- struct Person { char acName[30]; Person *Next; } *pstErster, *pstLetzter; // ----- void getElement ----- Person* getElement(){ Person *pstTmp; pstTmp = pstErster; pstErster = pstErster->Next; return pstTmp; } // ----- void main ----- char cName[30]={0}; pstErster = NULL; // Eingabe for (int nI = 0; nI < 3; nI++){ cout << (nI+1) << ".) Name: "; cin >> cName; cout << endl; addElement ( cName ) ; } cout << "Ausgabe" << endl; Person *person; // hier kommt der Fehler wg. Speicher! do{ person = getElement(); cout << (nI+1) << person->acName ; nI--; delete person; }while (person);
Wenn ich dies ausführe, bekomme ich einen Speicherfehler und des werden nur 2 anstatt 3 Elemente ausgegeben.
Wenn ich die While-Schleife so mache:
}while(nI>0 && person);
dann kommt kein Speicherfehler, jedoch werden auch nur 2 Elemente ausgegeben.
Das dritte ist immer ein gaanz langer Strich (sieht aus wie ein = Zeichen 30 mal hintereinander).
Wie kann man dem Abhilfe schaffen?
Vielen Dank.
Gruß
Guest04
-
1.) person ist doch nicht dynamisch allokiert worden (ist nur ein ganz einfacher Zeiger auf Person), also hat delete person; nix in deinem Code zu suchen
2.) merke dir die Anzahl der Personen und frage darauf ab
3.) warum schreibst du keine Klasse Person?
-
Ist halt eine Schulaufgabe und ich habe jetzt erst seit 1 Jahr C++.
Wollte erstmal das mit der Structure hinbekommen und das dann in eine Klasse abwandeln.
Kannst Du das noch ein bißchen genauer erleutern?
Vieln Dank.
Gruß
Guest04
-
ich würde getElem folgendermaßen proggen:
Person getElem() //keinen pointer übergeben, sondern ein Element { if (pstErster) { Person * todel = pstErster; Person toret = &pstErster; //dazu brauchst du aber einen cp konstruktor pstErster = pstErster->next; delete todel; return toret; } return 0; }
und die ausgabe dann so:
while ((person = getElement())!= 0) { cout << (nI+1) << person->acName ; nI--; }
-
<wie immer ohne Gewähr>
// ----- Structure Person ---- struct Person { char acName[30]; Person *Next; } *pstErster, *pstLetzter; // ----- void getElement ----- //warum void???? es soll doch was zurückgegeben werden Person* getElement(){ Person *pstTmp; pstTmp = pstErster; pstErster = pstErster->Next; return pstTmp; } // ----- void main ----- //warum void und nicht int main(){.......return 0;} char cName[30]={0}; pstErster = NULL; // Eingabe for (int nI = 0; nI < 3; nI++){ cout << (nI+1) << ".) Name: "; cin >> cName; cout << endl; addElement ( cName ) ; } cout << "Ausgabe" << endl; Person *person; do{ person = getElement(); cout << (--nI) << person->acName ; }while (nI);
Vorschlag: schreibe dir noch eine Struktur PersonenListe, welche aus pstErster und Letzter besteht...try!
-
ok eine klasse person könnte folgendermaßen aussehen:
// klasse Person class PERSON { struct ELEM { char Name [30]; ELEM * next; ELEM () : next(0) {} // <-- das ist der Konstruktor für das struct elem }; ELEM * first; // die klasse besteht nur aus einem pointer auf das erste element int size; public: PERSON () : first (0), size (0) {} void addElem(const ELEM & elem) { if (!first) { first = elem; } else { ELEM * runner = first; while(runner->next) { runner = runner->next; } runner->next = elem; } size++; } void addElem(char * name) // wenn du nur namen speicherst geht das auch so: { ELEM * toinsert = new ELEM; toinsert->name = name; toinsert->next = 0; addElem(toinsert): } ELEM getElem() { ELEM * runner = first; ELEM tmp = *first; first = first->next; size--; delete *runner; //hoffe das stimmt so *g* return tmp; } // vl währe eine Funktion printElem() praktisch: printElem(int index) { if (index <= size) { ELEM * runner = first; for(int i = 0; i < index; i++ { runner = runner->next; } cout << index << ". " << runner->Name << endl; } } };
-
@m0rph3uz: aber dann doch lieber gleich zwei Klassen
class Person{ private: char acName[30]; //könnte ja auch Vari vom Typ string sein Person *Next; public: //Methoden,Operatorfunktionen.... }; class Liste { private: //vielleicht noch sowas wie static int numOfElements oder so Spielereien Person * pstErster; Person * pstLetzter; public: //Methoden,Operatorfunktionen.... }; //am Besten direkt alle als Templates....
ich glaube mit OOP können wir Gast04 aber nicht helfen