Löschfolge in liste
-
ich habe die Aufgabe bekommen eine Ringliste zu implementieren, welche namen und IDs enthält. Dann wird beginnend mit der Nummer k, jedes k-te Objekt entfernt, wobei der Kreis immer wieder geschlossen wird und die Liste immer wieder im Kreis herum durchlaufen wird. Das solange, bis nurnoch ein Objekt übrig ist. Die Liste an sich mach keine Probleme(hinzufügen von Objecten, ausgabe), aber sobald ich diese Löschfunktion starten will stürtzt das Programm ab.
Hier mal mein Ansatz für die Funktion:liste->count ist die Anzahl der Objekte
void delete_node(struct ilist *liste) { srand(time(NULL)); int counter = 0; int candidates = liste->count; int random = rand()%candidates; list *tmp= liste->head, *last = liste->head; printf("\n%d\n",counter); if(liste->count == 1) { printf("%s",tmp->data); }else { while(candidates >= 0) { for(int i =0;i<candidates;i++) { if(i%random==0) { last->next = tmp->next; } last = tmp; tmp = tmp->next; counter --; } } } liste->count--; free(tmp); }
ich bedanke mich im vorhinein
LG
-
Nimm den Debugger, dann siehst du wo was passiert.
Ach ja, das
srand(time(NULL));
gehört nur einmal im ganzen Programm, am besten am Anfang von main().
-
der Debugger hat mir leider auch nicht weitergeholfen. ich finde den Fehler einfach nicht. Wenn ich 4 Kandidaten habe, läuft er das ganze einmal durch und terminiert dann(kA wieso). wenn es dann 3 bzw. 2 Kandidaten (noch) sind und ich das ganze nochmal starte stürtzt das Programm ab. bei 1 funktionierts wieder, wegen der if-Anweisung. Ich kann mir einfach nicht erklären wieso das nicht funktioniert.....
-
Dein Programm ist völlig konfus aufgebaut,
- was sollcounter
bewirken (wird von 0 runtergezählt, und dann?)while(candidates >= 0
) sieht irgendwie nach Endlosschleife ausrandom
wird erst mit rand()% berechnet und dann nochmal mittels % verglichen
- ...
Ich glaube, du hast komplett den Überblick verloren bei dieser ganz einfachen Aufgabe.
Fange ganz neu an, schreibe erstmal eine Funktion zu Ausgabe deiner Liste und dann einen Testfall zum Löschen.
Wenn dir der Debugger nicht weitergeholfen hat, liegt auch das an dir und nicht am Debugger.
-
Wenn dir der Debugger nicht weitergeholfen hat, liegt auch das an dir und nicht am Debugger
hab ich irgendwo das Gegenteil behauptet, wenn ja, dann nicht absichtlich
Fange ganz neu an, schreibe erstmal eine Funktion zu Ausgabe deiner Liste und dann einen Testfall zum Löschen
ja, wird erledigt, hab einfach zu viel daran rumgeändert.
Habe noch eine andere Frage: was kann der Grund sein, dass wenn ich 40 ints in eine Binärdatei schreibe ich bloß ca. 15 wieder ausgegeben bekomme?
Es wird richtig in die Binärdatei geschrieben, jedoch wenn ich den Inhalt der Binärdatei in der Konsole ausgebe, kommen falsche Zahlen. Z.B:Ich speichere die Zahlen 1 -48 in der Binärdatei. Das Speichern stimmt soweit, jedoch bekomme ich als Ausgabe nur Zahlen zwischen 48 und 53.
Meine schreibe und lesefunktionen sind folgende:
void write_to_file(list *liste) { elem *tmp = liste->first; FILE *fp = fopen("output.bin","w"); assert(fp!=NULL); while(tmp != NULL) { fprintf(fp,"%d",tmp->val); tmp = tmp->next; } fclose(fp); } void read_from_file() { int *ch=calloc(1000,sizeof(int)); int i = 0; FILE *fp = fopen("output.bin","r"); assert(fp!=NULL); while((ch[i]=getc(fp)) != EOF) { printf("%d\n",ch[i]); i++; } fclose(fp); free(ch); }
-
Nehme statt "r"/"w" mal "rb"/"wb".