Mehrere Elemente einer verketteten Liste löschen
-
Ich möchte gern nicht nur eins, sondern mehrere (aber nicht alle) Elemente in einer verketteten Liste löschen. Also das ich die Löschfunktion aufrufe, als Parameter ein Name (einer Person) übergebe und alle Elemente die diesen Namen haben sollen gelöscht werden...
Ich bekomme es aber leider nicht hin, eine Lösung hab ich nur dafür gefunden, ein einziges Element zu löschen:/*Funktion zum Löschen einer Datei*/ void loesche(char wen[]) { struct angestellt *zeiger ,*zeiger1; /*Ist überhaupt ein Element vorhanden?*/ if(anfang != NULL) { /*Ist unser 1. Element das von uns gesuchte (wen[])?*/ if(strcmp(anfang->name,wen) == 0) { zeiger=anfang->next; free(anfang); anfang=zeiger; } else { /*Es ist nicht das 1. Element zu löschen. Wir suchen in der weiteren Kette, ob das zu löschende Element vorhanden ist*/ zeiger=anfang; while(zeiger->next != NULL) { zeiger1=zeiger->next; /*Ist die Adresse von zeiger1 der gesuchte Name?*/ if(strcmp(zeiger1->name,wen) == 0) { /*Falls ja dann.....*/ zeiger->next=zeiger1->next; free(zeiger1); break; } zeiger=zeiger1; }/*Ende while*/ } /*Ende else*/ } /*Ende if(anfang != NULL)*/ else printf("Es sind keine Daten zum Löschen vorhanden!!!\n"); }
Habe schon probiert das umzuschreiben um mehrere zu löschen, aber es leider nicht hinbekommen... Kann mir einer helfen?
-
falls die funktion^^ funzt:
schreib eine zweite, die mit einem array von namen versorgt wird und die deine löschfunktion aufruft.void delete_many (char *names[]) { while (*names) { loesche (*names); names++; } } ... char *names[] = {"tinky-winky", "dipsy", "lala", "po", 0}; ... delete_many (names); ...
(ungetestet)
-
Eventuell reicht es ja, das break aus Zeile 32 zu elliminieren. Dann wird die Liste weiter durch-iteriert und weitere Elemente mit gleichem Namen werden gelöscht. Der Abbruch erfolgt dann nach dem letzten Listenelement.
Mit dem break springst Du aber momentan aus der while-Schleife raus.
-
fricky: Ja, dass ist eine Idee. Aber leider ist das nicht mein Problem
Ich mag nicht verschiedene Namen löschen, sondern den gleichen falls er mehrmals vorkommt
MiP: das hab ich schon probiert, aber wenn der Name schon im 1. Element ist, dann geht er gar nicht erst dahin.. und wenn ich das "else" rauskommentiere, also das er beide aufjedenfall durchläuft, dann kommt da nur Mist bei raus.
-
Dann probier es mal so:
zeiger=anfang; while(zeiger != NULL) { if(strcmp(zeiger->name,wen) == 0) { if (zeiger==anfang) { // Ersten löschen } else{ // löschen } } zeiger=zeiger->next; }
-
Anfängerin80 schrieb:
fricky: Ja, dass ist eine Idee. Aber leider ist das nicht mein Problem
Ich mag nicht verschiedene Namen löschen, sondern den gleichen falls er mehrmals vorkommt
dann verpass der funktion einen rückgabewert, also wenn sie was gelöscht hat, gibt sie 1 zurück, sonst 0. und dann...
int delete_all(char *name) {while (loesche(name));}
-
MiP schrieb:
Dann probier es mal so:
zeiger=anfang; while(zeiger != NULL) { if(strcmp(zeiger->name,wen) == 0) { if (zeiger==anfang) { // Ersten löschen } else{ // löschen } } zeiger=zeiger->next; }
Liest sich irgendwie schön
Aber was dann genau beim 2. Löschen einsetzen? Da brauch ich dann doch wieder etwas mit zwei Zeiger oder?
-
else{ angestellt *tmp = zeiger->next; free(zeiger); zeiger = tmp; }
-
Ich glaube jetzt passt es:
zeiger=anfang; while(zeiger != NULL) { if(strcmp(zeiger->name,wen) == 0) { if (zeiger==anfang) { zeiger=anfang->next; free(anfang); anfang=zeiger; } else{ angestellt *tmp = zeiger->next; free(zeiger); zeiger = tmp; } } else zeiger=zeiger->next; }