Ansatz zum josephus Problem
-
Hallo,
in der Schule sollen wir ein Programm zum Josephus Problem schreiben. Ich habe schon dir richtige Idee, bekomme jedoch jedes mal eine Fehlermeldung beim ausführen. Kann mir jemand sagen woran das liegt ?Code:
#include <stdio.h> #include <stdlib.h> #include <string.h> void crt_list(); void del_list(); struct liste { int n; int h; struct liste *next; }; struct liste *first = NULL; void crt_list () { int N,H; struct liste *ptr; if (first == NULL) { first = (struct liste *)malloc(sizeof(struct liste)); ptr = first; for(N=1;N<41;N++)//For Schleife für n-Wert { ptr->n = N; if(N<41) ptr->next = (struct liste*)malloc(sizeof(struct liste)); else ptr->next = NULL; //printf("Ptr Wert = %d\n",ptr->n); //Zur Kontrolle ptr = ptr->next; } for(H=1;H<41;H++)//For Schleife für h-Wert { ptr->h = H; ptr = ptr->next; } ptr = first; while(ptr->next !=NULL) { printf("n-Wert : %d",ptr->n); printf("h-Wert : %d",ptr->h); ptr= ptr->next; } } else { printf("Shit!/n"); exit(0); } } void del_list() { struct liste *ptr1,*ptr2; int z,e; for (z = 3; z<41; z+3) { ptr1=first; ptr2=ptr1->next; while (ptr1!=NULL) { if(first->n == z) { ptr1=first->next; free(first); first=ptr1; } else if (ptr2->n == z) { ptr1->next = ptr2->next; free(ptr2); ptr2=ptr1; } ptr1 = ptr1->next; ptr2 = ptr1->next; } } } int main () { struct liste *ptr; ptr = first; crt_list(); while(ptr!=NULL) { printf("n-Wert: %d\n",ptr->n); ptr=ptr->next; } del_list(); while(ptr!=NULL) { printf("n-Wert: %d\n",ptr->n); ptr=ptr->next; } return 0; }
Kompilieren klappt einwandfrei. Nur beim Ausführen bekomme ich folgende Fehlermeldung:
Bus error
logout[Prozess beendet]
Bitte nicht wundern, das Programm ergibt bis jetzt keine Sinn, es ist noch in der "Entwicklung" xD
Kann mir jemand helfen ?
Mfg Sackerl
-
das mit dem Buserror versteh ich nicht, fakt ist aber, das deine ptr-Variable auf NULL zeigt, da du first in ptr kopierst (first ist NULL) und danach erst first initialisierst.
den rest hab ich mir nicht angeschau, sorry, kann sein, dass bei der pointer kopiererrei auch noch was drin is.
-
Hallo Sackerl,
du hast einige Fehler oder Überflüssiges in deinem Code:
-- Zeile 31: Diese If-Abfrage ist überflüssig, da innerhalb der For-Schleife N < 41 immer gilt. -- In den Zeilen 25 und 32 allozierst du zwar Speicher, initialisierst ihn aber nicht. Somit sind die Abfragen wie ptr == NULL ungültig. Richtig wäre: ptr->next = malloc(sizeof(struct liste)); ptr->next->next = NULL;
hier fände ich es schöner eine Funktion dafür zu schreiben:
struct liste *create_list_element() { struct liste *el = malloc(sizeof(*el)); el->n = 0; el->h = 0; el->next = NULL; return el; }
-- Zeile 40: ptr zeigt auf das letzte Element der Liste zu Beginn der For-Schleife. Ich nehme mal an hier fehlt noch ein: ptr = first; vor der Schleife. -- Zeile 87,88: Hier überprüfst du nicht, ob ptr1 schon NULL ist. -- Zeile 66: for (....; z+3) : hier musst du z+3 noch zuweisen. Ich nehme mal an, du meinst so etwas hier: for (z=3; z<41; z=z+3) -- Zeile 80: da ptr2 immer das Nachfolgeelement von ptr1 zu sein scheint, musst du hier noch überprüfen, ob ptr2 nicht NULL ist, bevor du auf n zugreifst. -- Zeile 102,110: ptr hat hier immer den Wert NULL, deswegen gibst du an diesen Stellen nie was aus. Du musst vor jeder dieser Zeilen ein ptr = first; setzen.
So, ich glaube nicht, dass ich alle Fehler gefunden habe. Aber damit
solltest du schon mal ein wenig weiter kommen.Bytheway: Es gibt so etwas wie Debugger, mit denen mal solchen Fehlern
auf die Schliche kommt.Gruß mcr
-
Vielen Dank!!!