Buchstaben aus Liste löschen
-
ihr habt das nicht zufällig zusammen gemacht?
http://www.c-plusplus.net/forum/viewtopic-var-t-is-259260-and-postdays-is-0-and-postorder-is-asc-and-start-is-0.html
-
noobLolo schrieb:
ihr habt das nicht zufällig zusammen gemacht?
http://www.c-plusplus.net/forum/viewtopic-var-t-is-259260-and-postdays-is-0-and-postorder-is-asc-and-start-is-0.htmlJa, es handelt sich anscheinend um die gleiche Aufgabe.
Jedoch wurde in genanntem Thread leider nicht auf das Problem mit dem Löschen der Buchstaben eingegangen.
LG Maximilian
-
int findAndRemove(list *n,char c){ int count = 0; node *prev = 0; node *x = n->head; while(x){ if(x->cont == c){ if(prev){ prev->next = x->next; free(x); x = prev->next; }else{ n->head = x->next; free(x); x = n->head; } count++; }else{ last = x; x = x->next; } } return count; }
das ist sicher nicht die schönste lösung aber klappen sollte es schon, das problem ist das du um aus einer linked list was zu löschen immer das vorherige element brauchst daher auch "prev" als zwischen speicher... gibt es kein prev, löschen wir das erste element und müssen daher den "head" knoten unserer liste updaten
lg lolo
-
ups. z18
prev = x; statt last = x;
-
Hallo!
Vielen vielen Dank an NoobLolo! Du glaubst gar nicht, wie sehr du mir geholfen hast!
Ich hätte jedoch noch zwei kleine Fragen, undzwar:
1. In dem Code stellt "x" doch den zu löschenden Buchstaben dar, oder irre ich mich da?
2. Wird der, von den Elementen mit gelöschen Buchstaben belegte, Speicher automatisch freigegeben, sobald dieses gelöscht wird?
LG Maximilian
Und nochmals vielen Dank an NoobLolo!
-
Hallo!
Ich habe hier nochmal den Code von NoobLolo modifiziert, aber beim Compilieren kommen da einige Fehlermeldungen. Wir müssen mit einer Header-Datei arbeiten, falls ihr euch wundern solltet.
Header-Datei
#ifndef CHARLIST_H #define CHARLIST_H struct element{ char cont; //information part struct element* next; //organization part }; struct list{ struct element* head; }; typedef struct element charElemT; typedef struct list charListT; int removeChar(charList *clist, char c); #endif
Programm-Code
#include<stdlib.h> #include<stdio.h> #include "charList.h" int removeChar(charList *clist, char c) { int count = 0; node *prev = 0; node *x = clist->head; while(x) { if(x->cont == c) { if(prev) { prev->next = x->next; free(x); x = prev->next; } else { clist->head = x->next; free(x); x = clist->head; } count++; } else { prev = x; x = x->next; } } return count; } int removeAtPosition(charListT* clist, int pos) { return 0; }
Könnte vielleicht jemand sagen, wo der/die Fehler begraben ist/sind?
Vielen vielen Dank
LG Maximilian
-
die daten typen sollten natürlich schon übereinstimmen,
z.5/18 int removeChar(charListT *clist, char c); statt int removeChar(charList *clist, char c); und in z.8/9 charElemT statt node
post doch mal das komplette teil;)
lg lolo
-
Also wenn ich die folgende Version compiliere bekomme ich nur noch eine Fehlermeldung. Das sieht schon mal um Welten besser aus!
Ich denke mal das leigt daran, dass noch keine main()-Funktion definiert wurde, oder liege ich damit falsch? Die Fehlermeldung lautet: "undefined reference to 'WinMain@16' " . Hier nochmal der compilierte CodeHeader
#ifndef CHARLIST_H #define CHARLIST_H struct element{ char cont; //information part struct element* next; //organization part }; struct list{ struct element* head; }; typedef struct element charElemT; typedef struct list charListT; int removeChar(charListT *clist, char c); void clear(charListT *clist); #endif
Programm-Code
#include<stdlib.h> #include<stdio.h> #include "charList.h" int removeChar(charListT *clist, char c) { int count = 0; charElemT *prev = 0; charElemT *x = clist->head; while(x) { if(x->cont == c) { if(prev) { prev->next = x->next; free(x); x = prev->next; } else { clist->head = x->next; free(x); x = clist->head; } count++; } else { prev = x; x = x->next; } } return count; } int removeAtPosition(charListT* clist, int pos) { return 0; }
Wir haben nun noch ein Hauptprogramm gegeben, welches so geändert werden soll, dass die Funktion des o.g. Codes überprüft werden soll.
Dieses Hauptprogramm sieht folgendermaßen aus:
#include <stdio.h> #include "charList.h" int main() { char c1 = 'A'; char c2 = 'a'; int i = 0; charListT liste; return 0; }
Danke für eure Hilfe!
LG Maximilian
-
Hallo!
Das von mir oben gepostete Hauptprogramm bringt einen sicherlich nicht sonderlich weiter. Hier habe ich die "komplette" Version.
#include <stdio.h> #include "charList.h" int main() { char c1 = 'A'; char c2 = 'a'; int i = 0; charListT liste; init(&liste); for(;c1 <'G'; c1++) { appendChar(&liste, c1); } print_liste(&liste); int len = length(&liste); printf("Laenge der Liste %d\n\n", len); int pos = 0; for(;c2 < 'g';c2++){ insertChar(&liste, c2, pos); pos = pos +2; } print_liste(&liste); len = length(&liste); printf("Laenge der Liste %d\n\n", len); for (i = len-2; i >=0; i= i-2) { removeAtPosition(&liste, i); } /*removeAtPosition(&liste, 10); */ print_liste(&liste); len = length(&liste); printf("Laenge der Liste %d\n\n", len); clear(&liste); print_liste(&liste); return 0; }
Wie man sieht, sind darin noch andere Funktionen imlementiert, welche ja erstmal die zu löschenden Elemente erzeugt. Ich soll nun dieses Hauptprogramm so ergänzen, dass gezeigt wird, dass die "removeChar"-Funktion wirklich funktioniert. (was für ein Satz!!!)
Am vorteilhaftesten wäre es doch, wenn ich diesen "Test" bei Zeile 26 beginne, oder?
Vielen Dank
MfG Maximilian
-
zweifelst du an meinen nicht vorhandenen fähigkeiten
lg lolo
-
noobLolo schrieb:
zweifelst du an meinen nicht vorhandenen fähigkeiten
lg lolo
Natürlich zweifel ich nicht an deinen Fähigkeiten. Ich danke dir sogar vielmals dafür!
Wir müssen jedoch diesen Test machen
MfG Maximilian
-
Hallo!
Sorry, dass ich den Thread nach oben pusche, aber langsam wirds zeitmäßig etwas eng bei mir.
Es wäre also extrem nett, wenn evtl. jemand eine Antwort auf meine Frage(n) hätte!
Dankeschön
MfG Maximilian
-
Max789 schrieb:
Hallo!
Sorry, dass ich den Thread nach oben pusche, aber langsam wirds zeitmäßig etwas eng bei mir.Ach, so ist das.
Es ist nicht unüblich, Geld zu bieten für Praktikumsaufgaben. Das gleicht ein wenig die Undurchlässigkeit der Bildungsschichten aus. Jemand, der nicht so das Händchen dafür hat, zahlt 80€ oder je nach dem für eine Lösung und ein junger aufstrebender Informatikstudent mit Händchen dafür aus ärmeren Kreisen kann sich davon 50+ Tiefkühlpizzen kaufen.