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 😞


Anmelden zum Antworten