Löschen eines beliebigen Datensatzes aus einem "Struct"



  • hallo Leute,
    ich muss eine Datenverwaltung einrichten. Bei dieser werden Daten aufgenommen (album, interpret, etc). Diese soll ich auch wiedergeben können. Bis dahin klappt alles.
    Nun soll ich aber ein beliebiges Album komplett entfernen (also album + die dazu gehörigen Daten wie interpret, etc..). Ich wollte das so machen, dass ich den Namen des zu löschenden Albums eingebe und dass dann danach gesucht werden soll. Jedoch klappt bei mir irgendwie die Übergabe des Eingegeben and die Löschenfkt nicht! 😕

    danke fürs anschauen:

    [cpp]
    #include<conio.h>
    #include<stdio.h>
    #include<ctype.h>
    #include<alloc.h>
    #include<string.h>
    
    struct CD
    {
    	char Album[100];
    	char Interpret[100];
    	char Genre[100];
    	int Jahr;
    	struct CD *next;
    };
    struct CD *next =NULL;
    struct CD *start=NULL;
    
    void anhaengen (char *a, char *i, char *g, int j)
    {
    	struct CD *zeiger;
    
    if(start == NULL)
     {	
    	start=(struct CD*)malloc(sizeof(struct CD));
    	strcpy(start->Album, a);
    	strcpy(start->Interpret, i);
    	strcpy(start->Genre, g);
    	start->Jahr = j;
    
    	start->next=NULL;
     }
    else
     {
    	zeiger=start;
    	while(zeiger->next !=NULL)
    	       {zeiger=zeiger->next;}
    
    		zeiger->next = (struct CD*)malloc(sizeof(struct CD));
                    zeiger=zeiger->next;
    		strcpy(zeiger->Album, a);
    		strcpy(zeiger->Interpret, i);
    		strcpy(zeiger->Genre, g);
    		zeiger->Jahr = j;
    		zeiger->next=NULL;
     }
    }
    
    void ausgabe(void) {
       struct CD *zeiger = start;
    
       while(zeiger != NULL) {
          printf("\n\nAlbum....: %sInterpret: %sGenre....: %sJahr.....: %d\n\n",zeiger->Album,zeiger->Interpret,zeiger->Genre,zeiger->Jahr);
    	 zeiger=zeiger->next;
       }
    }
    
    void eingabe(void)
    {
    	char alb[100], inter[100], gen[100];
    	int j;
    
    		printf("Album....: ");
    		fgets(alb, 100, stdin);
    		printf("Interpret: ");
    		fgets(inter, 100, stdin);
    		printf("Genre....: ");
    		fgets(gen, 100, stdin);
    		printf("Jahr.....: ");
    		scanf("%i",&j);
    
    		getchar();
    
    		anhaengen (alb, inter, gen, j);
    	}
    
    void loesche(char *x)
     {
       struct CD *zeiger, *zeiger1;
    
       if(start != NULL)
        {
    
          if(strcmp(start->Album,x) == 0)
          {
             zeiger=start->next;
             free(start);
             start=zeiger;
          }
          else
          {
    
             zeiger=start;
    	 while(zeiger->next != NULL)
    	 {
                zeiger1=zeiger->next;
    
    	    if(strcmp(zeiger1->Album,x) == 0)
    	    {
                   zeiger->next=zeiger1->next;
                   free(zeiger1);
                   break;
                }
                zeiger=zeiger1;
             } 
          }    
       }       
       else
          printf("Es sind keine Alben zum Loeschen vorhanden!!!\n");
    }
    
    int main(void) {
       int wahl;
       char x[100];
    
       do {
          printf("\n1 : Eingabe\n");
          printf("2 : Ausgabe\n");
          printf("3 : Album loeschen\n");
          printf("9 : Ende\n");
          printf("\nIhre Wahl : ");
          scanf("%d",&wahl);
          getchar();
          switch(wahl) {
    	 case 1 : eingabe();
    		  break;
    	 case 2 : ausgabe();
    		  break;
    	 case 3 : printf("\nDas Album zum Loeschen: ");
    		  fgets(x, 100, stdin);
    		  loesche(x);                           //ich komme nich drauf was ich hier in loesche ()eingeben muss :(
    		  break;
             case 9 : break;
             default: printf("Falsche Eingabe!!!\n");
          }
       } while(wahl != 9);
    return 1;
    }
    [/cpp]
    

  • Mod

    Klappt irgendwie nicht ist keine brauchbare Fehlerbeschreibung. Erst recht nicht bei 150 Zeilen Code. Was machst du, was erwartest du und was passiert stattdessen?

    edit:
    Ach, sehe jetzt erst den Kommentar:

    //ich komme nich drauf was ich hier in loesche ()eingeben muss :(
    

    Hilft mir aber auch nicht wirklich weiter. Du hast die Funktion doch selbst geschrieben. 😕 Oder alles irgendwo abgeguckt?



  • Hab den Code selber geschrieben. Habe mir aber viele Hinweise aus dem Buch "C von A bis Z" geholt. Dort wurde auch das mit dem Eingeben mehrerer Datensätze und die Wiedergabe gut beschrieben.

    genaueres zu meinem Problem:

    ich erwarte, dass wenn ich im main programm den string x eingebe (also das Album das ich löschen will), dass diese Eingabe ins die Fkt loesche weitergeleitet wird.
    dort soll das besagte x mit den vorhandenen Album Titeln verglichen werden. bei Übereinstimmung soll die Löschung erfolgen.
    Nun wird aber nichts gelöscht. Falls vorher keine Datensätze eingegeben wurde, dann reagiert die Fkt loesche korrekt und sagt, dass es nix zum löschen gibt.



  • Amheh schrieb:

    Hab den Code selber geschrieben. Habe mir aber viele Hinweise aus dem Buch "C von A bis Z" geholt. Dort wurde auch das mit dem Eingeben mehrerer Datensätze und die Wiedergabe gut beschrieben.

    genaueres zu meinem Problem:

    ich erwarte, dass wenn ich im main programm den string x eingebe (also das Album das ich löschen will), dass diese Eingabe ins die Fkt loesche weitergeleitet wird.
    dort soll das besagte x mit den vorhandenen Album Titeln verglichen werden. bei Übereinstimmung soll die Löschung erfolgen.
    Nun wird aber nichts gelöscht. Falls vorher keine Datensätze eingegeben wurde, dann reagiert die Fkt loesche korrekt und sagt, dass es nix zum löschen gibt.

    meines Erachtens nach habe ich die loesche Fkt richtig geschrieben. Nur kriege ich eben das "x" nicht da rein und da steh ich auf dem Schlauch 😞


  • Mod

    Amheh schrieb:

    Habe mir aber viele Hinweise aus dem Buch "C von A bis Z" geholt.

    Oha. Das Buch (und sein Autor) sind hier eher das Ziel von Witzen. Das schlimme ist, es erweckt bei einem unbedarften Leser den Eindruck, dass er etwas lernt. Aber das was gelernt wird, ist in der Regel falsch und gefährlich.

    ich erwarte, dass wenn ich im main programm den string x eingebe (also das Album das ich löschen will), dass diese Eingabe ins die Fkt loesche weitergeleitet wird.
    dort soll das besagte x mit den vorhandenen Album Titeln verglichen werden. bei Übereinstimmung soll die Löschung erfolgen.
    Nun wird aber nichts gelöscht. Falls vorher keine Datensätze eingegeben wurde, dann reagiert die Fkt loesche korrekt und sagt, dass es nix zum löschen gibt.

    Ok, das ist eine gute Fehlerbeschreibung. 👍 Aber erst einmal gehe ich einen Kaffee trinken, deine lösche-Funktion ist nicht so ganz trivial. Vielleicht ist jemand anderes schneller als ich und antwortet in der Zwischenzeit.



  • SeppJ schrieb:

    Amheh schrieb:

    Habe mir aber viele Hinweise aus dem Buch "C von A bis Z" geholt.

    Oha. Das Buch (und sein Autor) sind hier eher das Ziel von Witzen. Das schlimme ist, es erweckt bei einem unbedarften Leser den Eindruck, dass er etwas lernt. Aber das was gelernt wird, ist in der Regel falsch und gefährlich.

    ich erwarte, dass wenn ich im main programm den string x eingebe (also das Album das ich löschen will), dass diese Eingabe ins die Fkt loesche weitergeleitet wird.
    dort soll das besagte x mit den vorhandenen Album Titeln verglichen werden. bei Übereinstimmung soll die Löschung erfolgen.
    Nun wird aber nichts gelöscht. Falls vorher keine Datensätze eingegeben wurde, dann reagiert die Fkt loesche korrekt und sagt, dass es nix zum löschen gibt.

    Ok, das ist eine gute Fehlerbeschreibung. 👍 Aber erst einmal gehe ich einen Kaffee trinken, deine lösche-Funktion ist nicht so ganz trivial. Vielleicht ist jemand anderes schneller als ich und antwortet in der Zwischenzeit.

    hmm, wusste nicht, dass das Buch so einen schlechten Stand hat (auch wenn sogar mir als Neuling Fehler aufgefallen sind) 🙄
    Lass dir den Kaffee schmecken, wäre toll wenn es dir danach möglich wäre mir einen Anstoß zu geben (nur ein Schubser 😃 )



  • hmpf. oO
    es läuft...
    komisch, nachdem das Programm sich aufgehängt hat und ichs neugestartet habe geht es.
    Es war wohl irgendwo was im Speicher, o.ä. 😃



  • - globale Variablen sind Müll
    - verkettete Listen sind aus Praxissicht auch Müll
    - Bücher von JW sind grundsätzlich Müll
    - dass du in deinen Strings auch jeweils (meistens) ein abschließendes '\n' hast, sollte dir bewusst sein
    - deine Eingabeabfragen arbeiten nicht in jedem Fall fehlerfrei
    - die Tatsache, dass mal was läuft und dann wieder nicht, deutet auf Fehler im Code hin



  • Wutz schrieb:

    - globale Variablen sind Müll
    - verkettete Listen sind aus Praxissicht auch Müll
    - Bücher von JW sind grundsätzlich Müll
    - dass du in deinen Strings auch jeweils (meistens) ein abschließendes '\n' hast, sollte dir bewusst sein
    - deine Eingabeabfragen arbeiten nicht in jedem Fall fehlerfrei
    - die Tatsache, dass mal was läuft und dann wieder nicht, deutet auf Fehler im Code hin

    also zu dem fachlichen:
    \n mach ich ja für einen Absatz. Mir war nicht bewusst, dass es schädlich sein kann.
    zum Rest:
    ich bin kein Profi und bin dabei das zu lernen. Wenn uns nahe gelegt wurde diese Aufgabe mit verketteten Listen zu bearbeiten, so habe ich dies auch gemacht. Ein Feedback in dem nur gesagt wird "es ist Müll", ist nicht sehr hilfreich. Tut mir leid, dass ich es nicht auf Anhieb besser weiß.


  • Mod

    Ich hab das Programm mal ausprobiert und konnte keine Fehlfunktion erkennen. Kannst du eine konkrete Kombination von Eingaben (Albennamen wie "A", B", "C" sollten reichen) angeben, bei der Fehler auftreten? Vielleicht ist es ja so etwas wie dass es nicht geht am Listenende/Anfang. Ich hatte jetzt nicht die Geduld, alle Kombinationen durchzuprobieren.



  • SeppJ schrieb:

    Ich hab das Programm mal ausprobiert und konnte keine Fehlfunktion erkennen. Kannst du eine konkrete Kombination von Eingaben (Albennamen wie "A", B", "C" sollten reichen) angeben, bei der Fehler auftreten? Vielleicht ist es ja so etwas wie dass es nicht geht am Listenende/Anfang. Ich hatte jetzt nicht die Geduld, alle Kombinationen durchzuprobieren.

    hey, danke fürs durchlaufen lassen!
    Aber ich habe bereits weiter oben geschrieben, dass es wieder einwandfrei läuft. Ein neustart des Programms hat die Fehlfunktion beseitigt. 🙂



  • SeppJ schrieb:

    Oha. Das Buch (und sein Autor) sind hier eher das Ziel von Witzen. Das schlimme ist, es erweckt bei einem unbedarften Leser den Eindruck, dass er etwas lernt. Aber das was gelernt wird, ist in der Regel falsch und gefährlich.

    Dann frage ich mich, warum dieser Autor noch in der Linkliste für Neulinge mehrfach auftaucht und dort auch noch an 1. Stelle.


  • Mod

    Wutz schrieb:

    SeppJ schrieb:

    Oha. Das Buch (und sein Autor) sind hier eher das Ziel von Witzen. Das schlimme ist, es erweckt bei einem unbedarften Leser den Eindruck, dass er etwas lernt. Aber das was gelernt wird, ist in der Regel falsch und gefährlich.

    Dann frage ich mich, warum dieser Autor noch in der Linkliste für Neulinge mehrfach auftaucht und dort auch noch an 1. Stelle.

    Nun, es steht direkt eine Warnung dabei, dass es Fehler enthält. Ich könnte die Warnung deutlicher machen, aber ich habe das Gefühl, dass Neulinge nie die Linklisten für Neulinge lesen 🙂 .


Anmelden zum Antworten