Fehlersuche Verkettete Liste



  • Beim Ausführen dieses Programms bekomme ich einen Speicherzugriffsfehler. Ich hoffe ihr könnt mir helfen. Die Zeiger machen mich noch fertig.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct listenelement {
      char inhalt[10];
      struct listenelement *nachfolger;
    } liste;
    
    liste *anfang, *ende;
    
    /*liste *neuerKnoten (void) {
      malloc(sizeof(liste));  
    }*/
    
    void initListe (void) {
      liste *anfang = NULL;
      liste *ende = NULL;
    }
    
    liste *suchListe (char *such) {
      liste *zeiger = anfang;
    
      while (zeiger != ende && strcmp(zeiger->inhalt, such))
        zeiger = zeiger -> nachfolger;
      return zeiger;  
    }
    
    //Fehler auf die Funktion eingegrenzt. Soweit ich das Überblicke
    void einfuegListe (liste *z, char *einfueg) {
      //liste *neu = neuerKnoten();
      liste *neu = (liste*) malloc(sizeof(liste)); //Hier liegt wahrscheinlich der Fehler
      strcpy (neu->inhalt, einfueg);
      //neu -> inhalt = einfueg;
      neu -> nachfolger = z -> nachfolger;
      z -> nachfolger = neu;
    }
    
    int main (void) {
      char name[10];
      liste *zeiger;
    
      initListe ();
    
      while (1) {
        puts("Geben Sie einen Tiernamen ein: (Beenden mit 0)");
        scanf("%s", name);
        if (name[0] == '0') 
          break; 
        zeiger = suchListe(name);
        einfuegListe (anfang, name);//Bis hierhin klappts
      }
    
      puts("Ausgabe:\n");
      for (zeiger = anfang; zeiger != ende; zeiger = zeiger -> nachfolger)
        printf("%s\n", zeiger -> inhalt);
    
      puts("Geben Sie einen Tiernamen zum Suchen ein: ");
      scanf("%s", name);
      zeiger = suchListe(name);
      if (zeiger == ende) 
        printf("%s ist nicht vorhanden\n", name);
      else
        printf("%s ist vorhanden\n", name);
    
      return 0;
    }
    

    Schonmal vielen Dank für die Mühe

    Grüße


  • Mod

    Du dereferenzierst da allerhand Nullzeiger, am Anfang, wenn deine Liste noch leer ist. Deine Einfügefunktion geht nämlich davon aus, dass der Vorgängerzeiger nicht NULL ist (bei Zeile 35 und 36). Das musst du prüfen.

    Es mag noch mehr Fehler geben, habe nicht alles durchgeguckt. Aber dies ist der Fehler in der von dir beschriebenen Zeile.



  • Globale Variablen?
    anfang+ende werden nirgendwo auf !=NULL gesetzt, wie soll das jemals laufen?



  • Habs jetzt hinbekommen. Falls es jemanden interessiert.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct listenelement {
      char inhalt[10];
      struct listenelement *nachfolger;
    } liste;
    
    liste *anfang, *ende;
    
    liste *neuerKnoten (void) {
      liste *neu;
      neu = malloc(sizeof(*neu)); 
      return neu;
    }
    
    void initListe (void) {
      liste *anfang = NULL;
      liste *ende = NULL;
    }
    
    liste *suchListe (char *such) {
      liste *zeiger = anfang;
    
      while (zeiger != ende && strcmp(zeiger->inhalt, such))
        zeiger = zeiger -> nachfolger;
      return zeiger;  
    }
    
    void einfuegListe (liste **z, char *einfueg) {
    
       liste *neu = neuerKnoten();
       liste *anfang = *z;
    
       strcpy (neu -> inhalt, einfueg);
       neu -> nachfolger = NULL;
    
       if (anfang != NULL) {
         while (anfang -> nachfolger != NULL)
           anfang = anfang -> nachfolger;
         anfang -> nachfolger = neu;
       }
       else
         *z=neu;
    }
    
    int main (void) {
      char name[10];
      liste *zeiger;
    
      initListe ();
    
      while (1) {
        puts("Geben Sie einen Tiernamen ein: (Beenden mit 0)");
        scanf("%s", name);
        if (name[0] == '0') 
          break;
        einfuegListe (&anfang, name);
      }    
    
      puts("Ausgabe:\n");
      for (zeiger = anfang; zeiger != ende; zeiger = zeiger -> nachfolger)
        printf("%s\n", zeiger -> inhalt);
    
      puts("Geben Sie einen Tiernamen zum Suchen ein: ");
      scanf("%s", name);
      zeiger = suchListe(name);
      if (zeiger == ende) 
        printf("%s ist nicht vorhanden\n", name);
      else
        printf("%s ist vorhanden\n", name);
    
      free(zeiger);
    
      return 0;
    }
    

    Das Programm war so als Aufgabe vorgesehen. Es sollten nur die Funktionen gebastelt werden.

    Grüße



  • Du kannst davon ausgehen, dass Code für simple Datenstrukturen wie einfachverkettete Listen schon 1000fach existieren inkl. Erläuterungen.
    Hier im Forum dazu ständig einzelne Eigencodestände begutachten zu lassen, bedarf Leser mit viel Zeit und Geduld.
    http://en.wikipedia.org/wiki/Linked_list


Anmelden zum Antworten