einfache verkettete struct. komme nicht weiter :(



  • Hallo,
    ich will ne verkette structur machen.
    Soweit klappt es nur ist es so. Wenn ich die erste eingabe mache und er fügt sie zu struct hinzu. Dann beendet sich das Program mit "Speicherzugriff fehler".
    Hab schon mehrere Sachen probiert aber nicht weiter gekommen.

    Hier ist der Code:

    #include <iostream>
    #include <ostream>
    #include <vector>
    #include <string>
    typedef struct daten *lp;
    struct daten {
      char datum;
      lp next;
    } datenendl;
    lp liste;
    void f(char *x){
       //liste->next = x;
      //liste->datum = *x;
      liste->next = NULL;
      //liste->next = liste;
      //liste = ll;
      liste->next = new daten[sizeof(datenendl)];
      liste->datum = *x;
       };
    int main(){
    int durchgang = 1;
    char eingabe[30];
    while (durchgang != 3){
        std::string eingabewhile[4];
        eingabewhile[1] = "Bitte Name eingeben";
        eingabewhile[2] = "\nBitte Telefonnummer eingeben";
        eingabewhile[3] = "\nBitte Datum eingeben";
        std::cout << eingabewhile[durchgang] << "\n";
        std::cin >> eingabe;
        f(eingabe);
        durchgang = durchgang+1;
    };
    
    }
    

    Mfg.
    Hurley



  • Die Variable 'liste' muss auf jeden Fall initialisiert werden und ändere f() nach

    // ...
    lp liste = 0; // erst initialisieren
    
    void f(char *x)
    {
        lp p = new daten;
        p->datum = *x;
        p->next = liste; // verketten
        liste = p;
    };
    // ...
    

    Tipp: ersetze die char[] durch std::string, das ist einfacher.

    Gruß
    Werner



  • Vielen dank für deine schnelle antwort.
    Ich werde mich gleich mal dran setzen und anfangen.

    Vielen dank :)))))))



  • ich habe noch eine frage.

    Eine doppel verkettete liste ist damit gemeint wenn die liste zu der nächste liste springt oder 2 listen?
    MfG.
    Hurley



  • "doppelt verkettete Liste" bedeutet ganz einfach, daß jeder Knoten nicht nur seinen Nachfolger, sondern auch seinen Vorgänger kennt - damit kannst du recht schnell in beide Richtungen laufen.

    übrigens ist deine Typdefinition noch sehr C-lastig - in C++ schreibt man das etwas kürzer:

    struct daten
    {
      char datum;//oder wahrscheinlicher 'string datum;'
      daten* next;
    };
    


  • zumal ist der pointer per typedef total sinnlos -.-
    daten* ist doch viel übersichtlicher als lp das für "leftpoint?" steht



  • Warum verwendest du nicht gleich std::list, da du ja sowieso schon die anderen STL-Header eingebunden hast?



  • KA, bin zuzeit daran c++ zulernen und kenne mich mit den standartbibliotheken wenig aus.

    void a(){
    //daten* y;
    //y = liste;
    if ( liste == NULL){
        std::cout << "liste leer" << std::flush;
    } else {
        daten* y;
       y = liste->next;
      while (y != 0){
      std::cout << y->name << std::flush;
      };
    };
    

    Wenn ich da nun eingebe beim oberen code bei jeder frage: a, b oder c.
    Wenn ich danach die liste auflisten lase passiert es das er in der console voll floodet mit 1 buchstabe den ich angegeben habe listet aber nicht alles auf.

    Was ist den daran falsch 😕 ?
    Ich blick leider nocht nicht der zeiger vollständig.

    Vielen dank für jede hilfe.

    Sry fürs nerven^^ 🙂



  • bool show_list()
    {
        if (liste == NULL)
            return false;
    
        daten* lpNext = liste->next;
    
        while (lpNext != NULL)
        {
            lpNext = lpNext->next;
            std::cout << lpNext->name << std::endl;
        }
        return true;
    }
    

    hmm musst auch immer das nächste Element auswählen ...


Anmelden zum Antworten