linked list



  • Ok hab die eine Zeile entfernt und den Struct next pointer jeweils auf NULL gesetzt.
    Hab es auch mit dem Debuger in Eclipse versucht und konnte die Zeile welche jeweils das erste strukt element ueberschreibt lokalisieren aber ich weis immer noch nicht worans liegt??

    struct targets {
        char *targ;
        struct targets *next;
    };
    
    void readIP() {
        firstIP = malloc(sizeof(struct targets));
        firstIP->targ = malloc(sizeof(char) * 20);
        firstIP->next = NULL;
        struct targets *last = firstIP;
    
        int check;
        char *buf = malloc(sizeof(char) * 16);
        while ((check = strncmp(buf, "done", 4)) != 0) {
            fgets(buf, 15, stdin);
            if (strcmp(buf, "\n") == 0)
                continue;
            strcpy(last->targ, buf);
            last->next = malloc(sizeof(struct targets));
            last->next->targ = malloc(sizeof(char) * 20);
            last->next->next = NULL;
            last = last->next;      //Beim ausfuehren dieser Zeile wird jeweils das erste Element ueberschrieben???
        }
    
        free(buf);
    }
    


  • Typ222 schrieb:

    last = last->next;      //Beim ausfuehren dieser Zeile wird jeweils das }
    

    Was passiert dann? Sind die Daten weg?
    last zeigt dann auf das neue Element. Und das hat noch keine Daten.

    Was steht bei firstIP->targ

    Wie kommst du außerhalb von readIP() an deine Liste ran?



  • Daten sind weg, im Prinzip gibs immer nur ein listenelement!?!?!?
    firstIP->targ
    wird zunaechst korrekt mit dem richtigen element beschrieben aber dann bei der zuweisung
    last = last->next;
    ueberschrieben??
    firstIP ist eine globale Variable somit ist der Zugriff darauf kein Problem...



  • Bau mal sowas in deine while-Schleife:

    int i=0;
    ...
        while ((check = strncmp(buf, "done", 4)) != 0) {
    ....
            last->next->targ = malloc(sizeof(char) * 20);
            sprintf(last->next->targ, "Lauf %d", i++); // einfuegen
            last->next->next = NULL;
    ....
    

    und schau was passiert.



  • - du hast verkettete Listen nicht verstanden
    - verkettete Listen sind nichts für Anfänger
    - du verwendest ohne Grund C99 (dein Anwendungsfall funktioniert auch mit dem portableren C89)
    - du sicherst Nutzereingaben >14 Zeichen nicht ab (das Programm hat dann "durchschlagenden" Erfolg)
    - sizeof(char) ist immer 1
    - check ist überflüssig
    - ...



  • Hab den Code ein bisschen veraendert und die eine Zeile eingefuegt aber in das Feld

    last->next->targ
    

    wo ja eigentlich "Lauf i" geschrieben werden sollte wird nix hineingeschrieben!?

    struct targets {
        char *targ;
        struct targets *next;
    };
    
    void readIP() {
        firstIP = malloc(sizeof(struct targets));
        firstIP->targ = malloc(sizeof(char) * 20);
        struct targets *last = firstIP;
    
        int i=0;
        char *buf = malloc(sizeof(char) * 1024);
        while (strncmp(buf, "done", 4) != 0) {
            fgets(buf, 1024, stdin);
            if (strcmp(buf, "\n") == 0)
                continue;
            strncpy(last->targ, buf, 15);
            last->next = malloc(sizeof(struct targets));
            last->next->targ = malloc(sizeof(char) * 20);
            last->next->next = NULL;
            snprintf(last->next->targ, "Lauf %d", i++);
            last = last->next;
        }
    
        free(buf);
    }
    


  • Fehlt bei snprintf nicht noch ein Parameter?



  • sry ja der hat gefehlt jetzt hats geklapt mit der funktion aber die liste funkt immer noch nicht hier die Schritte wies bei mir ablaeuft:
    -Speicher fuer erstes Element wird angelegt
    -Lese erste Zeile
    -Zeile wird in last->targ geschrieben
    -Speicher fuer last-next und last->next->targ wird angelegt
    -In last->next->targ wird "Lauf 0" geschrieben
    -Nach ausfuehren von last->next->next = NULL, last->next->next zeigt auf 0x0
    Momentane Speicherbelegung:

    name        type                  value
    
    last        struct targets*       0x6047a0
     targ       char*                 0x6047c0 "12\n"
     next       struct targets*       0x604420
      targ      char*                 0x604440 "Lauf 0"
      next      struct targets*       0x0
    

    Nach ausfuehren des Befehls last = last->next;
    siehts ploetzlich so aus:

    name        type                  value
    
    last        struct targets*       0x604420
     targ       char*                 0x604440 "Lauf 0"
     next       struct targets*       0x0
      targ      char*                 
      next      struct targets*
    


  • Typ222 schrieb:

    Nach ausfuehren des Befehls last = last->next;
    siehts ploetzlich so aus:

    Das ist doch genau das, was du mit diesem Befehl sagst. 🙄

    Der Zeiger last zeigt jetzt auf den nächsten Eintrag. Und das zeigt dir der Debugger auch an.



  • Jetzt hats geklappt
    Danke fuer eure Hilfe!


Anmelden zum Antworten