probleme mit linearen listen



  • edit:

    hallo die ursprüngliche frage hat sich erledigt.

    hier meine neue:

    ich hab den quelltext jetzt übern haufen geworfen und einen neuen geschrieben

    aber er geht noch nicht ganz ich ich weiss nicht genau wo der fehler ist

    aber ich überschreibe mir immer einen "next"-pointer und verliere so immer

    wieder elemente in der liste beim einfügen.

    hier der neue code ist weiter unten.



  • Du kannst strings nicht durch '=' zuweisen, strings durch char-Arrays
    repräsentiert werden. Das '=' weist jetzt einem Pointer einen anderen zu.
    Schau dir mal die Fkt. strcpy(..) an.

    Viel Glück bei deinem Testat 🙂

    edit: 30 Plätze für einen string ist vielleicht ein bischen knapp. Du kannst
    ohne schlechtes Gewissen 300 draus machen. In erdoes.txt sind (glaub ich) sogar
    längere Namen.



  • mir ist gerade eingefallen das ich ja strncpy benutzen soll

    geänderte zeile:

    strncpy(name,strtok(txt,":"),MAX_NAM);
    

    trotzdem das Programm funktioniert noch nicht ganz richtig.

    die commando-line argumente benutze ich noch nicht beim testen, ich bau die erst ein wenn ich mir sicher bin das ich auch den inhalt des *.txt files in die lineare liste geschrieben habe.

    Wie krieg ich jetzt den inhalt aus der textdatei in diese verflixte liste.

    hier die URL auf der man das Aufgaben-blatt und die *.txt datei finden kann.
    http://www.ti3.tu-harburg.de/ProgMetho/

    es ist übung 12.

    vielen dan für die hilfe



  • @taurin

    thx is mir auch gerade aufgefallen.

    das kommt davon wenn mehrere stunden codet man sieht irgendwann den wald vor lauter

    bäumen nicht mehr......

    gruss Aeon



  • Aeon schrieb:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define MAX_NAM 30
    
    /*struct dient als Basis für lin. Liste*/
    struct sListe
    {
      char Name[MAX_NAM];
      int ez;
      struct sListe *next;
    };
    /* - - - - - - - - - */
    struct sListe *Next = NULL;
    struct sListe *anfang = NULL;
    
    /*fügt ein element am ende der Liste an*/
    int attach(char n[MAX_NAM], int z)
    {
      struct sListe *pointer;
      
      if(anfang == NULL)
      {
        if((anfang = (struct sListe *) malloc(sizeof(struct sListe))) == NULL)
        {
          printf("ERROR 1:Not enought Memmory\n"); getchar();
          return (1);
        }
        
        strncpy(anfang->Name, n, MAX_NAM);
        anfang->ez = z;
        anfang->next = NULL;  
      }
      else
      {
        pointer = anfang;
        while(pointer->next != NULL){ pointer = pointer->next;}
       
        /* pointer zeigt auf das letzte Element, aber warum überschreibst du
           pointer jetzt??? */
    
         if((pointer = (struct sListe *) malloc(sizeof(struct sListe))) == NULL)
        {
          printf("ERROR 2:Not enought Memmory\n"); getchar();
          return (1);
        }
       
        /* und jetzt kann das arbeiten mit pointer nur noch schief gehen */
    
        pointer = pointer->next;
        strncpy(pointer->Name, n, MAX_NAM);
        pointer->ez = z;
        pointer->next = NULL;    
        
      }
      
      
      return(0);
    }/*attach*/
    
    /*Sortierstes Eingeben der Listenelemente*/
    void sort_insert(char n[MAX_NAM], int z)
    {
      struct sListe *pointer, *pointer1;
      
      if(anfang == NULL)/*Ist das Element das erste der Liste?*/
      {
        attach(n,z);
      }
      else/*1*/
      {
        pointer = anfang;
        while(pointer != NULL && (strncmp(pointer->Name,n,MAX_NAM))<0)
         pointer = pointer->next;
         
         if(pointer == NULL)
           attach(n,z);
         
         else if (anfang == pointer)
         {
           anfang = (struct sListe *) malloc(sizeof(struct sListe));
           
           if(NULL == anfang)
           {
             printf("Error 3: not enought memory\n"); getchar();
             return;
           }
           
           strncpy( anfang->Name,strtok(n,"\n"),MAX_NAM );
           anfang->ez = z;
         }
         
         else/*2*/
         {
           pointer1 = anfang;
           
           while(pointer1->next != pointer)
             pointer1 = pointer1->next;
           
           pointer = (struct sListe *) malloc(sizeof(struct sListe));
           
           if(NULL == pointer)
           {
             printf("Error 4: Not enought memory\n"); getchar();
             return;
           }    
           strncpy(pointer->Name,strtok(n, "\n"),MAX_NAM);
           pointer->ez = z;
           
           /*element einfügen*/
           pointer->next = pointer1->next;
           pointer1->next = pointer;
           
         }/*end else/*2*/        
      
      }/*end else/*1*/
      
    
    }/*sort_insert*/
    
    /*funktion zum Löschen der kompletten Liste*/
    void clearlist()
    {
       struct sListe *pointer, *pointer1;
    
       /*prüfen ob eine Liste existiert*/
       if(anfang != NULL)
          {
             /*Liste Vorhanden*/
             pointer = anfang->next;
             while(pointer != NULL)
                { /* das schaut auch ein bissl komisch aus. könnte es sein,
                     dass das schiefgehen könnte ? */
                   pointer1 = anfang->next->next;
                   anfang->next = pointer1;
                   free(pointer->next);
                   free(pointer);
                   pointer = pointer1;
                }
             /*Anfang der Liste löschen*/
             free(anfang->next);
             free(anfang);
             anfang=NULL;
             printf(" List deleted\n");
          }
       else
          printf("Error 5: can't find a List\n");
    }/*clearlist*/
    
    int main(int argc, char* argv[])
    {
      FILE *in;
     /* struct sListe *anfang = NULL;/*pointer auf NULL setzen*/
      char txt[100] = {},name[30] = {};
      int z = 0;
    
      /*------      Abfrage wieviele parameter eingeben wurden               -----*/
      if(argc != 3 )
      {
        printf("+-------------------------------------------------------+\n");
        printf("|                    Fehler!                            |\n");
        printf("|                   ========                            |\n");
        printf("|        Das Programm benoetigt 2 Parameter.            |\n");
        printf("|                                                       |\n");
        printf("| Du kannst folgende Parameter dem Programm uebergeben: |\n");
        printf("|                                                       |\n");
        printf("| -n <name> : suchen nach einem Namen                   |\n");
        printf("| -l <no>   : Ausgabe aller Namen mit Erdoes-Zahl <no>  |\n");
        printf("| -r <no>   : siehe -l nur die namen werden             |\n");
        printf("|             alphabetisch absteigend sortiert          |\n");
        printf("|                                                       |\n");
        printf("|            Please press any key to exit               |\n");
        printf("+-------------------------------------------------------+\n");
        getchar();
        return (0);
      }
    /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
      
      
      
    /* -- FILE-Pointer mit textdatei verknüpfen --*/  
      if((in = fopen("erdoes.txt","r")) == NULL)
      {
        printf("Error: can't open file erdoes.txt");
        return (1);
      }
    /* - - - - - - - */
    
    /* - - Daten aus datei in lin. Liste schreiben*/
      while(fgets(txt, 100, in) != NULL)
      {
        name = strtok(txt,":");
        z = atoi(strtok(txt,"\n")); 
        sort_insert(name,z); 
      }
    /* - - - - - */
    
      /* hier machst du den anfang-pointer kaputt und verlierst den beginn der liste
      */
      while(anfang->next != NULL)
      {
        printf("%s %d\n",anfang->Name, anfang->ez);
        anfang = anfang->next;
      }
    
    /* - - - Speicher wieder freigeben - - -*/ 
    /* und löscht daher hier nicht die ganze liste, weil anfang nicht mehr
       auf den Anfang zeigt :) */
    clearlist(anfang);
    fclose(in);
    return(0); 
    }/*main*/
    

    Kann sein, dass da noch mehr schief hängt. Habs nur überflogen.

    edit: ach ja, globale Variablen sollte man meiden wie der Teufel das Weihwasser 😉



  • danke für den infos.

    ich hab den quelltext jetzt übern haufen egworfen und einen neuen geschrieben

    aber er geht noch nicht ganz ich ich weiss nicht genau wo der fehler ist

    aber ich überschreibe mir immer einen "next"-pointer und verliere so immer

    wieder elemente in der liste beim einfügen.

    hier der neue code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define TEST 
    
    struct sListe
    {
      char name[30];
      int ez;
      struct sListe *next;
    
    };/*struct sListe*/
    
    /*erzeugt mir das Nullte-Element der lineraren Liste
      es diennt als dummy-*/
    struct sListe *create_list()
    {
      struct sListe *anfang;
    
      anfang = (struct sListe *) malloc(sizeof(struct sListe));
      if (anfang == NULL)
      {
        printf("ERROR 1: can't create List\n");
        return(NULL);
      }
    
      anfang->next = NULL;
      strncpy(anfang->name,"<ANFANG>",10);
      anfang->ez = -1;
    
      return(anfang);
    
    }/*create_list*/
    
    /*fügt ein element in die Liste ein alphabetisch sortiert nach struct
      element name*/
    void insert(struct sListe **anfang, char name[30],int z)
    {
      struct sListe *pointer = NULL,
                    *pointer1 = NULL;
    
       pointer1 = *anfang;                           
    
      pointer = (struct sListe *) malloc(sizeof(struct sListe));
      if(pointer == NULL)
      {
          printf("ERROR 2: can't create new element");
          return;  
      } 
    
      strncpy(pointer->name,name,30);
      pointer->ez = z;
      pointer->next = NULL;
    
      if/*1*/((*anfang)->next == NULL)/*1. Fall Liste Leer*/
      {
        (*anfang)->next = pointer; 
        #ifdef TEST 
          printf("\n |leer einfuegen %s| \n",pointer->name); 
        #endif
    
      }   
      else /*andere möglichkeit liste nicht leer*/
      {
        if( strncmp(pointer->name,((*anfang)->next)->name,30)<0 )/*2.Fall element am anfang einfügen.*/
        {
          pointer->next = (*anfang)->next; 
          (*anfang)->next = pointer; 
          #ifdef TEST 
            printf("\n |anfang einfuegen %s| \n",pointer->name); 
          #endif
    
        }
    
        while(strncmp(pointer->name,((*anfang)->next)->name,30) > 0  )
        {
          if((strncmp(pointer->name,((*anfang)->next)->name,30) > 0) && ( (strncmp(pointer->name,(((*anfang)->next)->next)->name,30) < 0) && ((*anfang)->next)->next !=NULL ) )/*3.Fall element am in mitte  einfügen*/
          {
    
            pointer->next = (*anfang)->next->next;
            (*anfang)->next->next = pointer;
           #ifdef TEST 
             printf("\n |mitte einfuegen %s| \n",pointer->name); 
           #endif
           break;  
    
          }  
          else
          {
            if( (strncmp(pointer->name,((*anfang)->next)->name,30) > 0)  )
            {
    
              ((*anfang)->next)->next = pointer; 
             #ifdef TEST 
               printf("\n |ende einfuegen %s| \n",pointer->name); 
             #endif
              break;
    
            }   
    
          }
          (*anfang) = (*anfang)->next; 
    
        } /*anfang = pointer1;*/ 
    
      }  
    
    }/*insert*/
    
    int main(void)
    {
      struct sListe *anfang;
    
      anfang = create_list();
    
      insert(&anfang,"element1",12);
      insert(&anfang,"alement2",10);
      insert(&anfang,"clement3",11);
      insert(&anfang,"boing4",34);
      insert(&anfang,"gooo5",56);
      insert(&anfang,"tree6",53);
      insert(&anfang,"zlement7",99);
      insert(&anfang,"flement8",20);
    
      while(anfang != NULL)
      {
        printf("\nName: %s  Zahl: %d \n",anfang->name,anfang->ez);
        anfang = anfang->next;
      }
    
      getchar();
      return(0);
    }/*main*/
    

Anmelden zum Antworten