Struct, Rekursive Listen ansteuern



  • Hey
    habe einige tutorials zu dem thema gelesen aber nicht so richtig gefunden was mir weiterhilft.

    was will ich machen: ich habe ganz viele "jobs" mit jeweils einer prozesszeit und größe. ich dachte einen job als struct zu definieren und dann ein "array job" zu erstellen was ich dann mit den jeweiligen zeiten füllen kann.
    das problem ist, dass ich wenn möglich einzelne jobs löschen können, bzw. neue jobs am besten dynamisch einfügen können sollte.
    deswegen denke ich dass jeder job einen zeiger brauch der auf den nächsten job im array zeigt. das krieg ich aber garnich hin:(
    das is wohl etwas viel verlangt aber es wäre echt super nett wenn mir jemand auf die sprünge helfen könnte!

    #include <stdlib.h>
    #include <stdio.h>
    typedef  struct job_tag{
            int process;
            int capacity;
            struct job_tag *next;    
            } job_list[20];   // Array mit 20 Jobs vom Typ job_list
    int main(void)
    {
    // die jobs mit Zeiten füllen
    for(int i=1;i<20;i++){
    job_list[i].process=rand();
    job_list[i].capacity=rand()
    }
    // und jetzt das problem: zeiger setzen!!!
    for(i=1;i<19;i++ {
    job_list[i]*next=job_list[i+1];
    }
    return 0;
    }
    


  • anzga schrieb:

    deswegen denke ich dass jeder job einen zeiger brauch der auf den nächsten job im array zeigt. das krieg ich aber garnich hin...

    das nennt sich 'verkette liste', ist sowas wie das lieblingsspielzeug einiger C-progger. bemüh' er mal die forensuche, da findeste hunderte von beispielen.
    🙂



  • job_list[i].next
    statt
    job_list[i]*next
    

    btw. muß man nicht vor dem rand() iwi srand() aufrufen 😕



  • // Array mit 20 Jobs vom Typ job_list
    

    Das glaube ich nicht. Du machst einen Typ und kein Array.

    Abgesehen davon wird's laufen, wenn man die Syntax-Fehler rausnimmt.
    🙂



  • auch müßtest du von 0 bis 18 gehen also

    for(i=0;i<18;i++){ 
    ...
    }
    job_list[i].next = NULL;
    
    statt
    
    for(i=1;i<19;i++ {
    

    zusammen finden wir die fehler schon 😉



  • Ich habe mal die gröbsten Dinger weggemacht, dass man mal übersetzen kann:

    #include <stdlib.h> 
    #include <stdio.h> 
    
    struct job_tag{ 
    	int process; 
    	int capacity; 
    	struct job_tag *next;     
    } job_list[20];
    
    int main(void) 
    { 
    	// die jobs mit Zeiten füllen 
    	for(int i=0; i<20; i++){ 
    		job_list[i].process=rand(); 
    		job_list[i].capacity=rand();
    	} 
    	// und jetzt das problem: zeiger setzen!!! 
    	for(int i=0;i<19;i++) { 
    		job_list[i].next=&job_list[i+1];
    	}
            job_list[19].next = 0;
    
    	return 0; 
    }
    

    Und das Schlüsselwort heißt "Verkettete Liste".

    - mach Dich außerdem mal mit Arrays/Indizierung vertraut.
    - rand() sollte man mal mit srand ( time(NULL) ) initialisieren
    - mit typedef kannst Du keine Variable deklarieren



  • ach quatsch...

    for(i=0;i<19;i++){
    


  • haha ihr seidn traum! danke!

    naja und das mit den rekursiven listen, da wollte ich wohl maln professionellen ausdruck benutzen, hab aber rekursive strukturen gemeint:)
    das mit dem rand war nur ne andeutung, benutz ich so nich...
    probiers gleich mal aus.
    danke nochmal
    änz



  • noobLolo schrieb:

    ach quatsch...

    for(i=0;i<19;i++)
    

    19 stimmt doch nicht (oder das < muss ein <= sein). mach doch besser: *for(i=0; i<sizeof(job_list)/sizeof(job_list); i++)
    🙂



  • ;fricky schrieb:

    noobLolo schrieb:

    ach quatsch...

    for(i=0;i<19;i++)
    

    19 stimmt doch nicht (oder das < muss ein <= sein). mach doch besser: *for(i=0; i<sizeof(job_list)/sizeof(job_list); i++)
    🙂

    Hast Du bemerkt, dass in der besagten Schleife job_list[i+1] verwendet wird?



  • uUuuUu schrieb:

    Hast Du bemerkt, dass in der besagten Schleife job_list[i+1] verwendet wird?

    nö, sorry. aber hardcodierte zahlenwerte im code sind trotzdem oft nicht toll. ändert er die grösse des arrays, muss er alles anpassen. dann schon lieber ein gepflegtes #define, oder so.
    🙂



  • ;fricky schrieb:

    dann schon lieber ein gepflegtes #define, oder so.

    hab mal sowas vorbereitet 😉

    ;fricky schrieb:

    #define LENGTH(arr) (sizeof(arr)/sizeof(*arr))
    
    for(i=0; i < LENGTH(job_list); i++)
    

    fein fein 😋

    und für den konkreten fall

    for(i=0; i < LENGTH(job_list)-1; i++)
    

    hui und ab c99 kann man dann auch

    #define EACH(arr,i)\
    for(int i=0; i < LENGTH(arr); i++)
    

    machen oder?



  • noobLolo schrieb:

    hui und ab c99 kann man dann auch

    #define EACH(arr,i)\
    for(int i=0; i < LENGTH(arr); i++)
    

    machen oder?

    Die Variablendeklaration im Kopf der for-Schleife ja, das Makro so wie es da steht besser nicht. 😉

    MfG,

    Probe-Nutzer


Anmelden zum Antworten