3Danke
ERLEDIGT
JA
JA
ANTWORTEN
9
9
ZUGRIFFE
669
669
EMPFEHLEN
-
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.
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
//------------------------------------------------------------------------ // // 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, char *loeschen) { // Dazu muss man den next-Zeiger der Liste auf das neue Element setzen, und den next-Zeiger des neuen Element // auf den alten Wert des next-Zeigers der Liste liste=ptr->next; //printf ("Geben Sie das zu loeschende Wort ein: "); //scanf("%s", ptr->wort); //ptr = liste ->next; //liste->next =liste->next->next; free(ptr); system("cls"); } */ void loeschen(element *ptr) { printf("%s wurde geloescht", ptr->wort); liste->next = liste->next->next; free(ptr); getch(); 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); loeschen(liste); } if (z=='4') { printf("Der Inhalt ihrer gespeicherten Liste:\n"); anzeigen(liste); getch(); system ("cls"); } } while (z!='5'); }
-
13.01.12 09:20 #2
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Wo ist denn jetzt genau dein Problem?
Weißt du nicht wie man die Liste durchläuft? (=> Schleife?)
Oder wie du den zu löschenden Eintrag findest (=> strcmp?)
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Ich weiß nicht wie ich von der Eingabe auf die Elemente in der Liste zugreifen kann.
-
Hi,
als erstes wäre nicht schlecht der "loeschen"-Fkt das zu löschende Wort zu übergeben, denn die Funktion weiß ja garnicht, was sie löschen soll. (Siehe hinzufügen)
Desweiteren musst du dir überlegen, wie die Funktion intern aufgebaut sein muss. Wie deepthroat schon sagte, solltest du eine Schleife haben und alle Elemente durchgehen.
GrüßeWas soll daran kompliziert sein? Es muss doch nur ein Rad bewegt werden, man kann aufsteigen, es kommt die Matschhütte und durch den Regenbogen gelangst du zum hungrigen Affen, der Affenschwanz wird gezogen und bums kommst du zum Paradispark.
-
Danke schonmal für die Beiträge die haben mir schon weitergeholfen.
Ich habe die Eingabe einfach in die löschen Funktion eingefügt somit muss ich nichts übergeben.
Wie vergleiche ich nun das wort in der liste mit der eingabe? if (strcmp ....
-
13.01.12 11:17 #6
- Registriert seit
- Jun 2007
- Ort
- Passau (Niederbayern)
- Beiträge
- 1.394
Hi,
wenn strcmp 0 zurückgibt, sind die zwei Strings gleich.
Siehe auch man 3 strcmp.
Gruß,
BKÜber eine gute Bewertung freut sich jeder ;)
Bitte erledigte Threads als "Erledigt" markieren.
"Though a program be but three lines long, someday it will have to be maintained.''
-- Geoffrey James, "The Tao of Programming"
-
Ich versteh nicht wo hier der Fehler ist:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
void loeschen(element *ptr) { char eingabe[20]; printf("Zu loeschendes Wort eingeben: "); scanf("%s", eingabe); do { if(strcmp(ptr->wort, eingabe)==NULL) { // Eintrag gefunden if(ptr->wort==NULL) { // erster Eintrag liste=ptr->next; } else { liste->next=ptr; } } else if(strcmp(ptr->wort, "ENDE")==0) { printf("'%s' wurde nicht gefunden!", eingabe); } else { loeschen(ptr->next); } } while (strcmp != NULL); printf("%s wurde geloescht", ptr->wort); free(ptr); }Geändert von Sevenfold (14.01.12 um 15:22 Uhr)
-
Du übergibst der Funktion den globalen Zeiger, das ist unnötig, da er sowieso global ist. Dann in der Zeile, in der du prüfst ob es der erste Eintrag ist: Das ist ja egal, ob es nun der erste Eintrag ist, oder nicht, du willst ja nur das eingegebene Element löschen oder?
Nun ja, auf jeden Fall, wenn es so ist, dann schreibst du liste = ptr->next; Da ptr ja liste ist, bedeutet das liste = liste -> next; Ich glaube kaum, dass das deine Absicht ist.
Den weiteren Code habe ich mir bis jetzt noch nicht angesehen, nur while (strcmp != NULL); ist auch nicht korrekt. strcmp ist eine Funktion, die 2 Parameter übergeben bekommt. Du übergibst hier nur den Namen der Funktion und das bewirkt eine Endlosschleife (Der Name einer Funktion ohne () ist die Adresse der Funktion).
Lg
-
Das Endergebnis sieht jetzt so aus (Vielleicht helf ich damit ja dem einen oder anderen)
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
/*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 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; printf("\nListe erfolgreich erstellt!\n\n"); system("Pause"); } else { ptr->next = (element*) malloc(sizeof(element)); erstellen (ptr->next); // Rekursion } return; } void hinzufügen (element* ptr, char*eingabeübergabe, char* posübergabe, element*vorptr) { // Es wird ein Zeiger auf der vorherige Element und auf das nachfolgende Element benötigt if(strcmp(posübergabe, ptr->wort)==0) { // Posübergabe gefunden element *nachptr=(element *)malloc(sizeof(element)); // Speicher reservieren strcpy(nachptr->wort, eingabeübergabe); // in nachptr->wort wird eingabeübergabe eingefügt nachptr->next=ptr; if(vorptr==NULL) { // erste Eintrag liste=nachptr; } else { vorptr->next=nachptr; } printf("\n'%s' wurde vor '%s' hinzugefuegt\n", eingabeübergabe, posübergabe); getch(); system("cls"); } else if(strcmp(ptr->wort, "ENDE")==0) { printf("\n'%s' wurde nicht gefunden!", posübergabe); getch(); system("cls"); } else { hinzufügen(ptr->next, eingabeübergabe, posübergabe,ptr); // Rekursion } } //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, char* eingabeübergabe, element *vorptr) { if(strcmp(ptr->wort, eingabeübergabe)==0){ //strcmp vergleicht zwei Strings miteinander if(vorptr==NULL){ // Erster Eintrag liste=ptr->next; // Liste ist der Anfang der Liste } else { vorptr->next=ptr->next; // Nächstes element } printf("\n'%s' wurde geloescht\n", ptr->wort); free(ptr); getch(); system("cls"); } else if(strcmp(ptr->wort, "ENDE")==0) { printf("\n'%s' konnte nicht gefunden werden!\n", eingabeübergabe); getch(); system("cls"); } else { loeschen(ptr->next,eingabeübergabe, ptr); // Rekursion } } int main () { int z; do { printf("HAUPTMENUE:\n1 - Liste erstellen\n2 - Element hinzufuegen\n3 - Element loeschen\n4 - Liste anzeigen\n5 - Programm beenden "); printf ("\n\n"); if (liste!=NULL){ printf("Es befinden sich folgende Elemente in der Liste:\n"); anzeigen(liste); } printf("\nBitte waehlen Sie: "); z=getche(); 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. system("cls"); liste = (element*)malloc(sizeof(element)); erstellen(liste); } system("cls"); if (z=='2') { char eingabe [20]; char neueswort [20]; printf ("Folgende Strings befinden sich in der Liste:\n"); anzeigen(liste); printf("\nNeues Wort eingeben: "); scanf("%s", neueswort); printf("\nVor welchem Element wollen Sie '%s' einfuegen: ",neueswort); scanf("%s", eingabe); hinzufügen(liste,neueswort,eingabe,NULL); } if (z=='3') { char eingabe [20]; printf ("Folgende Strings befinden sich in der Liste:\n"); anzeigen(liste); printf("\nZu loeschendes Wort eingeben: "); scanf("%s", eingabe); loeschen(liste,eingabe, NULL); } if (z=='4') { printf("Der Inhalt ihrer gespeicherten Liste:\n"); anzeigen(liste); getch(); system ("cls"); } } while (z!='5'); }
-
24.01.12 11:04 #10
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Wirklich schön ist das eigentlich nicht. Wozu übergibst du da noch diesen vorptr? Das ist unnötig.
Ebenso wenig ist ein besonderes Wort notwendig um das Ende der Liste zu markieren. Jetzt kann man ja das Wort "ENDE" nicht in der Liste speichern ohne das die Liste dort plötzlich zuende ist...
Auch die Verwendung der Rekursion ist problematisch, da der Aufrufstack ziemlich begrenzt ist und das bei größeren Listen schnell zum Absturz führt.
Außerdem ist es unschön, dass du eine globale Variable verwendest, so kannst du die Funktion nicht für mehrere Listen verwenden.
Es gibt sicherlich verschiedene Möglichkeiten zur Implementierung. Vorschlag:
GrußCode c:1 2 3 4 5 6 7 8 9 10 11 12 13 14
void loeschen(element** list, const char* str) { element* e = *list; while (e != NULL) { if (strcmp(e->wort, str) == 0) { /* OK, gefunden. Löschen. */ *list = e->next; free(e); return; // nur das erste gefundene Element löschen } list = &(e->next); e = e->next; } } loeschen(&list, "abc");
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
Ähnliche Themen
-
C: verkette liste ergibt crash
Von jkallup im Forum C/C++Antworten: 3Letzter Beitrag: 28.01.11, 12:00 -
Verkette Liste Eintrag verschwindet
Von forsti222 im Forum JavaAntworten: 3Letzter Beitrag: 10.01.11, 11:14 -
ADT Verkette Liste rückwärts ausgeben lassen
Von Dolphon im Forum C/C++Antworten: 10Letzter Beitrag: 10.04.09, 12:17 -
Einfach verkette Liste: Sortierte ausgabe, nur wie? ()
Von dastool im Forum JavaAntworten: 2Letzter Beitrag: 11.03.06, 16:50 -
verkette Liste dynamisch erweiterbar
Von buschke im Forum C/C++Antworten: 4Letzter Beitrag: 11.01.06, 14:36





Zitieren

Login






