Verkette Liste-Das zu löschende Element eingeben
-
Hallo erstmal!
Ich stehe vor dem Problem, dass ich in meiner verketteten Liste ein Element, welches ich vorher eingegeben habe, wieder löschen kann. Und zwar steht in der Aufgabenstellung, dass das zu löschende Element von dem Benutzer abgefragt werden soll. Ich schaffe es nicht, dass ich den Namen des zu löschenden Elements eingeben kann. Das Programm löscht mir immmer nur das erste Element der Liste.Würde mich über jede Hilfe freuen.
Hier ist mein Code:
//------------------------------------------------------------------------ // // Datei: programmname.cpp // // Name: // Matr.-Nr.: 123456 // Datum: xx.xx.2009 V1.0 // geaendert: xx.xx.2009 // /*Schreiben Sie ein Programm, das eine Wörterliste verwaltet. Die Wörter, die z. B. Namen, Orte oder Gegenstände bezeichnen, werden in einer verketteten Liste gespeichert. Mit Hilfe eines Menüs sollen folgende Funktionen gewählt werden können: a) Liste erstellen der Speicherplatz für einen neues Wort wird erstellt und das Wort eingegeben. Die Eingabe wird so lange wiederholt, bis "ENDE" eingegeben wird. b) Element hinzufügen der Speicherplatz für ein neues Wort wird erstellt und das Wort eingegeben. Es wird gefragt, vor welchem Element das neue Wort eingefügt werden soll. c) Element löschen Das zu löschende Wort wird abgefragt. Es wird gelöscht und sein Speicherplatz wieder freigegeben. Nach jeder Bearbeitung wird die aktuelle Wortliste vor dem Hauptmenue wieder auf dem Bildschirm angezeigt. */ // Eingabe: Angabe der erforderlichen Eingaben (Benutzer / Datei) // // Ausgabe: Angabe der vom Programm generierten Ausgaben // //------------------------------------------------------------------------ #include <stdio.h> // Bibliothek fuer printf, scanf, ... #include <conio.h> // Bibliothek fuer getch, gets, ... #include <string.h> #include <stdlib.h> struct eintrag { // Deklaration eines Listenelements char wort[20]; struct eintrag *next; }; typedef struct eintrag element; // Typedef -> typedef ist eine Deklaration, wird zunächst kein Programmcode vom Compiler erzeugt struct eintrag *liste; //Zeiger auf den Anfang der Liste //Die Funktion "erstellen" wird zunächst mit dem Zeiger auf den Listenanfang aufgerufen, //dann rekursiv jeweils mit dem Zeiger auf das nächste Element. void erstellen (element* ptr){ printf ("Wort eingeben 'ENDE' fuer Ende der Liste: "); scanf("%s", ptr->wort); if (strcmp(ptr->wort,"ENDE")==0) ptr->next=NULL; else { ptr->next = (element*) malloc(sizeof(element)); erstellen (ptr->next); } return; } void hinzufügen (element* ptr) { } //Das letzte Element der Liste enthält so das Wort "ende" und den Zeiger next = NULL. Die //Funktion "anzeigen" wird auch mit dem Zeiger auf das erste Element aufgerufen, dann //rekursiv mit dem next-Zeiger auf das jeweils nächste Element. void anzeigen (element* ptr){ if (ptr->next != NULL) { printf ("%s\n",ptr->wort); anzeigen (ptr->next); } return; } void loeschen(element *ptr) { printf("%s wurde geloescht", ptr->wort); free(ptr); system ("cls"); } int main () { int z; do { char eingabe[20]; printf("HAUPTMENUE:\n1 - Liste erstellen\n2 - Element hinzufuegen\n3 - Element loeschen\n4 - Liste anzeigen\n5 - Programm beenden\n\nBitte waehlen Sie: "); z=getche(); printf ("\n\n"); if (z=='1') { //Beim Erstellen einer neuen Liste muss im Hauptprogramm zunächst der Speicherplatz für //das Anfangselement mit der Adresse "liste" reserviert werden. Die Speicherreservierung //für die folgenden Elemente erfolgt in der Funktion erstellen. liste = (element*)malloc(sizeof(element)); erstellen(liste); } system("cls"); if (z=='2') { } if (z=='3') { printf("Zu loeschendes Wort eingeben: "); scanf("%s", eingabe); getch(); loeschen(liste); } if (z=='4') { printf("Der Inhalt ihrer gespeicherten Liste:\n"); anzeigen(liste); getch(); system ("cls"); } } while (z!='5'); }
-
Du solltest erstmal das Element suchen, das du löschen willst.
Du gibst nur das erste Element frei. Dadurch kommst du aber nicht mehr an das zweite ran, da du die Verknüpfungen nicht umbiegst.Fang erstmal mit einfügen an.
Und arbeite an deinem Einrückungsstil. Deiner ist grauenhaft.
-
Ich versteh nicht genau, wie ich die einzelne Elemente ansprechen kann. Dann könnte ich auch eher das Hinzufügen und Löschen lösen.
Wie komm ich denn z.B. von der Eingabe (scanf) auf das Element in der Liste? Zu dem Verknüpfungen umbiegen habe ich denk ich mal genug Material zusammen um mir das zu erarbeiten nur zu dem oben genannten Problem finde ich keine Lösung...Die Einrückungen sind so schepp, weil schon paar Funktionen in der Aufgabenstellung zur verfügung standen und ich die per copy&paste ins Programm eingefügt habe und noch keine Zeit hatte das einzurücken. Die anderen Dinge stehen im Vordergrund.
-
Du musst dich vom Anfang durch die Liste hangeln und das Element suchen.