HILFE! verkettete liste



  • #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <string.h>
    
    struct ID3Tag/*structur eigener datentyp */
    {
        char Titel[31]; /* initialisierung von arrays, char variable mit länge 30*/
        char Interpret [31];
        char Album[31];
        char Erscheinungsjahr[5];
        char Kommentar[31];
        char Genre[4];
        struct ID3Tag *next;
    }ID3Tagstructur;
    
    struct ID3Tag *kopf, *ende;
    
    char menueAnzeigen (int i_menue);
    void Anzeigen (void);
    void Hinzufuegen (void);
    void ListeHinzufuegen (void);
    void ListeAnzeigen (void);
    void liste_initialisieren(void);
    void Datei_oeffnen (void);
    void Datei_speichern (void);
    void getGarbage (void);
    
    // ID3Tag myID3Tag [10];/* 10 Felder sind reserviert vom typ ID3Tag*/
                        /* Datentyp,Variable,10Felder*/
    void main()
    {
        char c_Eingabe;
        liste_initialisieren ();
    
        /*
        strcpy (myID3Tag[0].Titel,"");/* Kopieren von einem string in array von char
        strcpy (myID3Tag[0].Interpret,"");
        strcpy (myID3Tag[0].Album,"");
        strcpy (myID3Tag[0].Erscheinungsjahr,"");
        strcpy (myID3Tag[0].Genre,"");
        */
    
        c_Eingabe = menueAnzeigen (1);
    
    }
    
    void liste_initialisieren(void)
    {
        kopf = (struct ID3Tag*) malloc(sizeof(struct ID3Tag));
        ende = (struct ID3Tag*) malloc(sizeof(struct ID3Tag));
    
        if (kopf == NULL || ende == NULL) {
            printf (".......Speicherplatzmangel\n");
            exit(1);
        }
    
        kopf->next = ende->next = ende;
    }
    
    void Datei_oeffnen (void)
    {
        FILE *pfile;
        char Dateiname[14]; /*3 stellen fuer txt, 1 stelle fuer punkt, 8 stellen fuer namen und 1 stelle fuer nullterminierung*/
        int DatensatzNr =1;
    
        struct ID3Tag *ID3Data;
    
        strcpy (Dateiname, "test.txt");
    
        if ((pfile=fopen(Dateiname,"r")) == NULL)
        {
            printf("Fehler : Die angegebene Datei kann nicht geoeffnet werden\n");
            exit(0);
        }
    
        while (fread(&ID3Tagstructur, sizeof(ID3Tagstructur),1, pfile)==1)
        {
            // Schleife durchlaufen bis Datei Ende
    
            // Neuen Speicher für Element reservieren
            ID3Data = (struct ID3Tag*) malloc(sizeof(struct ID3Tag));
    
            // Ist noch genügend Speicher vorhanden?
            if (ID3Data == NULL) {
                printf ("... kein Speicher!");
                exit (1);
            }
    
            // Daten in Element kopieren
            strcpy (ID3Data->Titel, ID3Tagstructur.Titel);
            strcpy (ID3Data->Album, ID3Tagstructur.Album);
            strcpy (ID3Data->Interpret, ID3Tagstructur.Interpret);
            strcpy (ID3Data->Kommentar, ID3Tagstructur.Kommentar);
            strcpy (ID3Data->Erscheinungsjahr, ID3Tagstructur.Erscheinungsjahr);
            strcpy (ID3Data->Genre, ID3Tagstructur.Genre);
                printf ("Titel:%s\n",&ID3Tagstructur.Titel);
            printf ("Interpret:%s\n",&ID3Tagstructur.Interpret);
            printf ("Album:%s\n",&ID3Tagstructur.Album);
            printf ("Erscheinungsjahr:%s\n",&ID3Tagstructur.Erscheinungsjahr);
            printf ("Kommentar:%s\n",&ID3Tagstructur.Kommentar);
            printf ("Genre:%s\n\n",&ID3Tagstructur.Genre);
    
            // Element einfügen und Zeiger auf nächstes Element setzen
            ID3Data->next = kopf;
            kopf = ID3Data;
    
        }
    
        printf ("Titel", &kopf->Titel);
    
        /* Datei schliessen */
        fclose(pfile);
        //printf ("\n%d Datensaetze wurden gelesen.\n", --DatensatzNr);
    }
    
    void Datei_speichern (void)
    {
        struct ID3Tag *ID3Data;
    int zaehler =0;
        char ch = 'n';
        char Dateiname[14];
    
        strcpy (Dateiname, "test.txt");
    
        FILE *pfile;
    
        /* Datei wird geoeffnet*/
        if ((pfile = fopen (Dateiname, "w+")) == NULL)
        {
            printf("Fehler: Die angegebene Datei kann nicht geoeffnet werden\n");
            exit(0);
        }
    
        ID3Data = kopf;
    
        while (ID3Data != ID3Data->next)
        {
            // Daten in Element kopieren
            strcpy (ID3Tagstructur.Titel, ID3Data->Titel);
            strcpy (ID3Tagstructur.Album, ID3Data->Album);
            strcpy (ID3Tagstructur.Interpret, ID3Data->Interpret);
            strcpy (ID3Tagstructur.Kommentar, ID3Data->Kommentar);
            strcpy (ID3Tagstructur.Erscheinungsjahr, ID3Data->Erscheinungsjahr);
            strcpy (ID3Tagstructur.Genre, ID3Data->Genre);
    
            // In das File schreiben
            fwrite (&ID3Tagstructur, sizeof(ID3Tagstructur),1,pfile);
            zaehler++;
            ID3Data = ID3Data->next;
    
        }
    
        fclose (pfile);
        printf("\n\n Datensaetze wurden erfolgreich abgespeichert %d.\n", zaehler);
    
    }
    
    char menueAnzeigen (int i_menue)
    {
        bool gefunden=false;
        char c_Eingabe;
    
        switch (i_menue) {
        case 1: while (gefunden==false) {
    
         printf("********************************ID3-Tag Editor**********************************\n\n\n\n\n");
         printf("Optionen:\n\n");
         printf("(L)aden - ");
         printf("(S)peichern - ");
         printf("(H)inzufuegen - ");
         printf("S(u)chen - ");
         printf("(B)earbeiten - ");
         printf("Ent(f)ernen -\n");
         printf("(A)usgabe - ");
         printf("B(e)enden\n\n");
    
         c_Eingabe = getch();
         switch (c_Eingabe){
    
         case 'L' : case 'l' : printf("Daten werden geladen\n\n");
                            Datei_oeffnen();
         break;
         case 'S' : case 's' : printf("Daten werden gespeichert\n\n");
                            Datei_speichern();
         break;
         case 'H' : case 'h' : printf("Neuer eintrag:\n\n");
                            ListeHinzufuegen();
         break;         
         case 'u'            : printf("Suchen ist noch nicht verfuegbar\n\n");
         break;
         case 'B' : case 'b' : printf("Daten werden bearbeitet\n\n");
                            Hinzufuegen();
         break; 
         case 'f'            : printf("Daten werden Entfernt\n\n");
         break;
         case 'A' : case 'a' : printf("Ausgabe\n\n");
                            ListeAnzeigen();/*Anzeigen ist eine Prozedur mit Integer Parameter*/
         break;
         case 'e'            : printf ("Bis zum nechstenmal\n\n");
                            gefunden=true;
         break;
         default:
         printf("Falsche Taste!\n\n");
         break;             
         }/* Ende switch Eingabe*/
                }/*Ende While SChleife*/
        }/*Ende Switch Menue*/
        return c_Eingabe;
    }/*Ende Funktion*/
    
    void ListeAnzeigen ()
    {
        struct ID3Tag *ID3Data;
    
        char ch = 'j';
    
        ID3Data = kopf;
    
        while ((ID3Data != ID3Data->next) && ((ch=='j') || (ch=='J')))
        {
            // Daten in Element kopieren
            strcpy (ID3Tagstructur.Titel, ID3Data->Titel);
            strcpy (ID3Tagstructur.Album, ID3Data->Album);
            strcpy (ID3Tagstructur.Interpret, ID3Data->Interpret);
            strcpy (ID3Tagstructur.Kommentar, ID3Data->Kommentar);
            strcpy (ID3Tagstructur.Erscheinungsjahr, ID3Data->Erscheinungsjahr);
            strcpy (ID3Tagstructur.Genre, ID3Data->Genre);
    
            // Daten anzeigen
            printf ("Titel:%s\n",&ID3Tagstructur.Titel);
            printf ("Interpret:%s\n",&ID3Tagstructur.Interpret);
            printf ("Album:%s\n",&ID3Tagstructur.Album);
            printf ("Erscheinungsjahr:%s\n",&ID3Tagstructur.Erscheinungsjahr);
            printf ("Kommentar:%s\n",&ID3Tagstructur.Kommentar);
            printf ("Genre:%s\n\n",&ID3Tagstructur.Genre);
    
            /* Schleife wiederholen, solange j oder J*/
            printf ("\n Wollen Sie einen weiteren Datensatz anzeigen? (J/N)");
            ch=getchar();
    
            getGarbage();
            ID3Data = ID3Data->next;
    
        }
    }
    
    void Anzeigen ()
    {
    
        FILE *pfile;
        char Dateiname[14]; /*3 stellen fuer txt, 1 stelle fuer punkt, 8 stellen fuer namen und 1 stelle fuer nullterminierung*/
        int DatensatzNr =1;
    
        strcpy (Dateiname, "test.txt");
    
        if ((pfile=fopen(Dateiname,"r")) == NULL)
        {
            printf("Fehler : Die angegebene Datei kann nicht geoeffnet werden\n");
            exit(0);
        }
            fread(&ID3Tagstructur, sizeof(ID3Tagstructur),1, pfile);
    
        printf ("Eintrag Nr. %d\n\n",DatensatzNr++);
        printf ("Titel:%s\n",ID3Tagstructur.Titel);
        printf ("Interpret:%s\n",ID3Tagstructur.Interpret);
        printf ("Album:%s\n",ID3Tagstructur.Album);
        printf ("Erscheinungsjahr:%s\n",ID3Tagstructur.Erscheinungsjahr);
        printf ("Kommentar:%s\n",ID3Tagstructur.Kommentar);
        printf ("Genre:%s\n",ID3Tagstructur.Genre);
    
    //  ch=getchar();
    
        /* Datei schliessen*/
        fclose(pfile);
        printf ("\n%d Datensaetze wurden gelesen.\n", --DatensatzNr);
    }
    
    void ListeHinzufuegen (void)
    {
        /* Tastatureingabepuffer leeren*/
        fflush(stdin);
    
        struct ID3Tag *ID3Data;
        char ch;
    
        do
        {
    
        // Neuen Speicher für Element reservieren
        ID3Data = (struct ID3Tag*) malloc(sizeof(struct ID3Tag));
    
        // Ist noch genügend Speicher vorhanden?
        if (ID3Data == NULL) {
            printf ("... kein Speicher!");
            exit (1);
        }
    
        printf ("Bitte um Eingabe:\n\n");
        printf ("Geben Sie einen Titel ein:\n");
        fflush(stdin);
        scanf  ("%[^\n]",&ID3Tagstructur.Titel);
        getGarbage();   /* Inhalt wird geloescht aus C in 21 Tagen s.398*/
        printf ("Titel:%s\n",ID3Tagstructur.Titel);
        printf ("Geben Sie einen Interpreten an:\n");
        scanf  ("%[^\n]",&ID3Tagstructur.Interpret);
        getGarbage(); 
        printf ("Interpret:%s\n",ID3Tagstructur.Interpret);
        printf ("Geben Sie ein Album an:\n");
        scanf  ("%[^\n]",&ID3Tagstructur.Album);
        getGarbage(); 
        printf ("Album:%s\n",ID3Tagstructur.Album);
        printf ("Geben Sie das Erscheinungsjahr an:\n");
        scanf  ("%[^\n]",&ID3Tagstructur.Erscheinungsjahr);
        getGarbage(); 
        printf ("Erscheinungsjahr:%s\n",ID3Tagstructur.Erscheinungsjahr);
        printf ("Geben Sie ein Kommentar dazu an:\n");
        scanf  ("%[^\n]",&ID3Tagstructur.Kommentar);
        getGarbage(); 
        printf ("Kommentar:%s\n",ID3Tagstructur.Kommentar);
        printf ("Geben sie das zugehoerige Genre an:\n");
        scanf  ("%[^\n]",&ID3Tagstructur.Genre);
        getGarbage();
        printf ("Genre:%s\n",ID3Tagstructur.Genre);
    
        // In verkettete Liste einfügen
        strcpy (ID3Data->Titel, ID3Tagstructur.Titel);
        strcpy (ID3Data->Album, ID3Tagstructur.Album);
        strcpy (ID3Data->Interpret, ID3Tagstructur.Interpret);
        strcpy (ID3Data->Kommentar, ID3Tagstructur.Kommentar);
        strcpy (ID3Data->Erscheinungsjahr, ID3Tagstructur.Erscheinungsjahr);
        strcpy (ID3Data->Genre, ID3Tagstructur.Genre);
    
        ID3Data->next = kopf;
        kopf = ID3Data;
    
        /* structurvariable ID3Tagstructur speichern*/
        //fwrite (&ID3Tagstructur, sizeof(ID3Tagstructur),1,pfile);
    
        /* Tastatureingabepuffer leeren*/
        fflush(stdin);
    
        /* Schleife wiederholen, solange j oder J*/
        printf ("\n Wollen Sie einen weiteren Datensatz eingeben ? (J/N)");
    
        ch = getchar();
    
    }
    
        while ((ch == 'j') || (ch == 'J'));
    
    }
    
    void Hinzufuegen ()
    {
    
        char ch = 'n';
        char Dateiname[14];
        strcpy (Dateiname, "test.txt");
    
        FILE *pfile;
    
        /* Datei wird geoeffnet*/
        if ((pfile = fopen (Dateiname, "w+")) == NULL)
        {
            printf("Fehler: Die angegebene Datei kann nicht geoeffnet werden\n");
            exit(0);
        }
        /* Daten eingeben und abspeichern*/
        do
        {
        printf ("Bitte um Eingabe:\n\n");
        printf ("Geben Sie einen Titel ein:\n");
    //  fflush(stdin);
        scanf  ("%[^\n]",&ID3Tagstructur.Titel);
        getGarbage();   /* Inhalt wird geloescht aus C in 21 Tagen s.398*/
        printf ("Titel:%s\n",ID3Tagstructur.Titel);
        printf ("Geben Sie einen Interpreten an:\n");
        scanf  ("%[^\n]",&ID3Tagstructur.Interpret);
        getGarbage(); 
        printf ("Interpret:%s\n",ID3Tagstructur.Interpret);
        printf ("Geben Sie ein Album an:\n");
        scanf  ("%[^\n]",&ID3Tagstructur.Album);
        getGarbage(); 
        printf ("Album:%s\n",ID3Tagstructur.Album);
        printf ("Geben Sie das Erscheinungsjahr an:\n");
        scanf  ("%[^\n]",&ID3Tagstructur.Erscheinungsjahr);
        getGarbage(); 
        printf ("Erscheinungsjahr:%s\n",ID3Tagstructur.Erscheinungsjahr);
        printf ("Geben Sie ein Kommentar dazu an:\n");
        scanf  ("%[^\n]",&ID3Tagstructur.Kommentar);
        getGarbage(); 
        printf ("Kommentar:%s\n",ID3Tagstructur.Kommentar);
        printf ("Geben sie das zugehoerige Genre an:\n");
        scanf  ("%[^\n]",&ID3Tagstructur.Genre);
        getGarbage();
        printf ("Genre:%s\n",ID3Tagstructur.Genre);
    
    /* structurvariable ID3Tagstructur speichern*/
        fwrite (&ID3Tagstructur, sizeof(ID3Tagstructur),1,pfile);
    
        /* Tastatureingabepuffer leeren*/
        fflush(stdin);
    
        /* Schleife wiederholen, solange j oder J*/
        printf ("\n Wollen Sie einen weiteren Datensatz eingeben ? (J/N)");
    
        ch = getchar();
    
    }
    
        while ((ch == 'j') || (ch == 'J'));
    
        fclose (pfile);
        printf("\n\n Datensaetze wurden erfolgreich abgespeichert.\n");
    
    }
    
    void getGarbage (void)
    {
        char gabColl [80];
        gets (gabColl);
    }
    

    Hallo

    Ich hab folgendes problem mit meiner verketteten liste:
    beim menuepunkt speichern wird immer etwas mitreingespeichert das ich nicht eingegeben habe, ich denke es liegt an der abbruchbedingung der while schleife in der funktion speichern
    was is falsch?
    vielen dank für eure hilfe



  • *lol*

    wir sind keine debugger.

    Am besten gehst du mit deinem debugger schritt für schritt durch den code und dann merkst du schon wo und was er wie falsch macht - dann kannst du uns sagen:

    in den zeilen x, y und z macht er bla bla obwohl er gugu machen soll, aber ich versteh das leider nicht.

    und schon sind alle glücklich



  • Hmmm ich glaube du hast eher einen fehler in deiner verketteten liste gemacht.

    Hab mir den Code mal angesehen...sag mal hast du das letzte element der liste (den pointer zur nächsten struktur) auf NULL gesetzt?! Du musst den PointerToNext der letzen Struktur in deiner Liste immer auf NULL setzen, sonst fuckt dein programm rum.


Anmelden zum Antworten