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!!!


Anmelden zum Antworten