Announcement

Collapse
No announcement yet.

C lineare Listen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • C lineare Listen

    Hallo,

    Bei meinem Programm stürzt immer wieder meine Funktion ab.

    Ich habe eine CSV datei eingelesen, und diese beim ; getrennt. Danach habe ich die Listen einträge hintereinander eingelsen, sortiert und Duplikate entfernt: personA->PersonB->PersonC->NULL

    Person A; Person B //Nicht erlaubt da Duplikat, siehe zeile 3
    Person A; Person C
    Person B; Person A

    Nun möchte die Liste auf Doppelte Freundschaften überprüfen.

    Hat jemand eine Ahnung wie das geht?

    lg
    Zuletzt editiert von jester; 19.02.2014, 12:07.

  • #2
    In den du prüfst, ob (A und B) oder (B und A) vorhanden sind. Was hat der erste - unvollständige/falsche - Satz
    "Bei meinem Programm stürzt immer wieder ab."
    mit der Frage zu tun?
    Zuletzt editiert von Christian Marquardt; 19.02.2014, 12:12.
    Christian

    Comment


    • #3
      Ich hab mir sowas überlegt, wenn ich die namen einlesen, dann überprüfe ich ob Person A schon vorhanden, wenn ja dann kommt Person B dazu.
      Wie verlinke ich dann Person A und B?

      Code:
       
      typedef struct llnode
      {
        char name[100];
        int Freunde;
        struct llnode *next;
      
      } llnode;
      
      typedef struct PersonenNode
      {
        llnode* Person;
        
        struct PersonenNode *next;
        
      }PersonenNode;

      Comment


      • #4
        Ich weiß nicht, was das mit der ersten Frage zu tun hat, weiß nicht was du mit verlinken meinst.

        Da hier keiner weiß, was du nach welchen Regeln einlesen und verarbeiten willst, wirst du wohl auch keine konkrete Antwort bekommen können. Es hat keiner Zugriff auf deinen Computer, so dass man nachsehen könnte.

        Grundsätzlich würde ich einer Person (Klasse/ Struktur) eine Liste von Personen (wenn es mehrere sein können) oder eine einzelne Person (wenn es nur eine sein kann) zuordnen (die Referenz).
        Christian

        Comment


        • #5
          Code:
          int readCsvFile(char *fileName)
          {
            FILE *csvFile = NULL;
            char csvline[400];
            char* semicolon;
            char* newline;
            int result;
          
            csvFile = fopen(fileName, "r");
            if(csvFile == NULL)                  //Datei existiert nicht fopen
            {
              return -3;
            }
            do
            {
              if(fgets(csvline, 400, csvFile) == NULL)
              {
                //variante 1
                if(feof(csvFile) != 0)
                {
                  fclose(csvFile);
                  return -5; 
                }
                fclose(csvFile);
                return -4; 
                /* variante 2
                if(ferror(csvFile)!=0)
                {
                  printf("error: could not read file\n");
                  return -4; 
                }
                printf("error: file corrupt1\n");
                return -5;
                */
              }
              //zeile gelesen, daten stehen in csvline
              semicolon=strchr(csvline, ';');
              if(semicolon == NULL) //kein semikolon in der zeile
              {
                fclose(csvFile);
                return -5; 
              }
              if(semicolon == csvline) // strichpunkt am anfang der zeile
              {
                fclose(csvFile);
                return -5; 
              }
              *semicolon='\0';
              semicolon++;
              if(*semicolon == '\n' || *semicolon == '\0') //sp am ende der zeile
              {
                fclose(csvFile);
                return -5; 
              }
              if(strchr(semicolon, ';') != NULL) //noch ein strichpunkt
              {
                fclose(csvFile);
                return -5; 
              }
              newline=strchr(semicolon, '\n');
              if(newline != NULL) //newline character am ende wegschneiden
              {
                *newline='\0';
              }
              if(strcmp(csvline, semicolon)==0) //beide namen gleich
              {
                fclose(csvFile);
                return -5; 
              }
              //TODO freundschaft in der jeweiligen freundesliste eintragen
              //TODO freundschaftsduplicat checken: csv datei duplizieren und vergleichen
              //      oder string1 und string zwei vergleichen
              
              
              if((result=anHaengen(csvline))!=0)
              {
                fclose(csvFile);
                return result;
              }
              if((result=anHaengen(semicolon))!=0)
              {
                fclose(csvFile);
                return result;
              }
          
              
            } while(feof(csvFile) == 0);
            
          /*
            if((result=friendsDup())!= 0)
            {
              //fclose(csvFile);
              return result;
            }
          */
            
              StandardPrompt();
            
            fclose(csvFile);
            return 0;
          }

          Code:
          int anHaengen(char *prasemi)
          {
            int result;
            llnode *new_elem = NULL;
            llnode *prev_elem = NULL;
            llnode *cur_elem = NULL; //Zeiger für den Zugriff auf einzelne Elmente
          
            if((new_elem = malloc(sizeof(llnode))) == NULL) 
            {
              return -2;
            }
            //speicher vom buffer in das listenlement kopieren
            memcpy(new_elem->name, prasemi, 99);
            //sollte kein /0 im kopierten string sein, wird er abgeschnitten
            new_elem->name[99]='\0';
            
            cur_elem = head;
            while(cur_elem!=NULL && (result=strcmp(cur_elem->name, new_elem->name))<0)
            {
              prev_elem=cur_elem;
              cur_elem=cur_elem->next;
            }
            
            if(result==0)
            {
              free(new_elem);
            }
            else
            {
              new_elem->next = cur_elem;
              if(prev_elem!=NULL)
              {
                prev_elem->next = new_elem;
              }
              else
              {
                head=new_elem;
              }
            }
            return 0;  
          }
          die Csv datei wird so aufgespalten,
          und zweilenweien eingelesen:
          csvline;semicoln

          Ich habe nun alle Namen in einer Liste gespeichert, wenn Namen doppelt vorkommen wurden sie nicht nochmals eingetragen...


          Mein Problem ist, ich weiß nun nicht wie ich die Freundschaftbeziehungen herstellen.

          Ich würde dann gerne, zum Beispiel alle Freunde von Person A ausgeben lassen...

          Comment


          • #6
            Ich denke, dein Problem ist "doppelte" zu finden?
            Warum wird eine verkette Liste benutzt und nicht ein vector aus der STL?

            Offenbar gibt es nur einen Name; jedenfalls sehe ich nichts anderes.
            Dieser wird aus der gelesenen CSV Zeile nach elem kopiert. Dann wird noch irgendwas mit einem head zugeordnet. Ich kann nicht erkennen, wo hier ein Freund ist, woran sich das festmacht. Eine Liste sehe ich auch nicht

            Des Weiteren:

            öffne die Datei
            lese eine Zeile
            Schleifenstart (Abbruch wenn Fehler beim öffene oder Dateiende o.a.)
            verarbeite gelesene Zeile
            lese eine Zeile
            Schleifenende

            Dann würde das Programm schon mal 50% kleiner werden und übersichtlicher
            Zuletzt editiert von Christian Marquardt; 19.02.2014, 16:40.
            Christian

            Comment

            Working...
            X