segmentation fault bei einfach verkettete listen



  • huhu gemeine 🙂

    Also hätte ein Problem, ich schreibe mir zur Zeit eine einfach verlinkte Liste.

    Nur hänge ich gerade daran wieso ich diesen Segmentation fault kriege:

    hier meine main:

    #include <iostream>
    #include "kette.h"
    
    int main () {
        int lauf= 10;
    
        while(lauf != 0 ){
            hinzu(lauf);
    
            --lauf;
        }
        ausgeben();
    
    }
    

    hier meine kette.h:

    struct list{
            int id;
            struct list *next;
        } *head;
    
    void hinzu(int id){
    
            if(head == NULL){
    
                //hier in den nächsten 3 zeilen muss er sein ...
                std::cout << "1" << std::endl;
                head->id = id;
                std::cout << "1" << std::endl;
    
                head->next = NULL;
    std::cout << "1" << std::endl;
    
            }else{
    
                struct list* llist;
                llist=head;
    
                    while(llist->next != NULL) // wird durchgeschaut wann next = 0
                    llist=llist->next;
    
            llist->id   = id;
            llist->next = NULL;
        }
    
    }
    
    void ausgeben(){
    
            struct list *llist;
            llist = head;
                while(llist->next != NULL ) // solange bis das letzte Listenelement durch ist
                {
                int nr = 0;
    
                std::cout << nr << ":" << llist->id << std::endl;
                ++nr;
                }
        }
    
        #endif	/* _KETTE_H */
    

    Danke schonmal im voraus 😃



  • Schön, dass du den Fehler so eingrenzen konntest. Oft sieht man hier hunderte von Zeilen irrelevanten Code, teilweise sogar externe Verlinkungen. 🙂

    if(head == NULL){ 
        head->id = id;
    

    Hier liegt das Problem. Wenn head ein Nullzeiger ist, darfst du ihn nicht dereferenzieren (was du mit -> aber tust). Wahrscheinlich willst du sowas erreichen:

    if (head == NULL)
        head = new list;
    // ...
    // und nach Gebrauch freigeben
    delete head;
    

    Übrigens: Dafür

    int lauf= 10;
    
        while(lauf != 0 ){
            hinzu(lauf);
    
            --lauf;
        }
    

    gibts eine For-Schleife. 😉

    for (int lauf = 10; lauf != 0; --lauf)
        hinzu(lauf);
    

    Ach ja, es heisst "voraus". Und weshalb sind wir gemein? :p



  • new problem, wieso geht der bei mir nicht in die while schleife?!
    habe mal da als Test die Variable "nr" ausgegeben und gab nix aus ...

    void hinzu(int id){
    
            if(head == NULL){
                head= new list;
    
                head->id = id;
    
                head->next = NULL;
    
            }else{
    
                struct list* llist;
    
                llist = new list;
    
                llist=head;
    
                    while(llist->next != NULL) // wird durchgeschaut wann next = 0
                    {llist = llist->next;}
    
                llist = new list;
            llist->id   = id;
    
            llist->next = NULL;
    
        }
    


  • guck mal noch mal in deinem C++-Buch nach, was new macht - du verwendest es hier zumindest einmal vollkommen sinnlos (im else-zweig).
    das sollte aber einfach nur nen memory-leak erzeugen und nicht zu deinem beschriebenen problem führen.
    zeig mal die ausgabe her - vll findet sich ja dort ein fehler...

    ansonsten:

    void hinzu(int id)
    {
      if(head == NULL)
      {
        head = new list;
        head->id = id;
        head->next = NULL;
    
        //normalerweise werden diese 3 Zielen über einen Konstruktor in einer Zeile erledigt
    
        return; //übersichtlicher als der lange else zweig, aber wohl geschmackssache
      }
    
      list* last = head;
    
      while(last->next != NULL)
      {
        last = last->next;
      }
    
      last->next = new list;
      last->next->id = id;
      last->next->next = NULL;
    }
    

    es sieht so aus, als ob man das new und die beiden zuweisungen nur einmal schreiben müsste - aber iwie komm ich gerad nicht auf die schnelle auf die idee, wie rum man das angehen sollte...

    bb



  • danke dir unskilled werde es dann gleich versuchen.

    Zur Ausgabe es existiert keine, da das Konsolenfenster leer ist :s



  • demonking schrieb:

    danke dir unskilled werde es dann gleich versuchen.

    Zur Ausgabe es existiert keine, da das Konsolenfenster leer ist :s

    ich meinte den quellcode zur ausgabe... ^^
    das hinzufügen sollte so auf jeden fall funktionieren


Log in to reply