Mi sembrava molto chiaro , praticamente è l'algoritmo che ti serviva
Ho usato il passaggio del puntatore per valore nella funzione mescolamazzo, visto che non ho mai usato il passaggio per indirizzo !
Intendevo qualcosa del genere
codice:#include <time.h> #include<stdio.h> typedef enum {CUORI=0,QUADRI,FIORI,PICCHE} TipoSeme; typedef enum {DUE=2,TRE,QUATTRO,CINQUE,SEI,SETTE,OTTO,NOVE,DIECI,FANTE,DONNA,RE,ASSO} TipoValore; typedef struct { TipoSeme seme; TipoValore valore; } TipoInfo; typedef struct carta { TipoInfo info; struct carta* next; } TipoCarta; typedef TipoCarta* TipoMazzo; void InserisciCartaInTesta(TipoMazzo* indirizzo_mazzo, TipoCarta* indirizzo_carta); TipoMazzo creaMazzo(); void stampaCarte(TipoMazzo mazzo); TipoMazzo mescolaMazzo(TipoMazzo indirizzo_mazzo, int num_mescolate); int main() { TipoMazzo mazzo = NULL; mazzo = creaMazzo(); printf("Mazzo appena creato:\n"); stampaCarte(mazzo); mazzo=mescolaMazzo(mazzo,100); printf("\n\nMazzo dopo essere stato mescolato:\n"); stampaCarte(mazzo); system("pause"); return 0; } void InserisciCartaInTesta(TipoMazzo* indirizzo_mazzo, TipoCarta* indirizzo_carta) { indirizzo_carta->next = *indirizzo_mazzo; *indirizzo_mazzo = indirizzo_carta; } TipoMazzo creaMazzo() { TipoMazzo nuovo_mazzo = NULL; int i=0, j=0; for (i=0; i < 4; i++) { for (j=0; j < 13; j++) { TipoCarta* carta = (TipoCarta*)malloc(sizeof(TipoCarta)); carta->info.seme = i; carta->info.valore = j+2; InserisciCartaInTesta(&nuovo_mazzo,carta); } } return nuovo_mazzo; } void stampaCarte(TipoMazzo mazzo) { TipoCarta* carta = mazzo; while (carta != NULL) { switch(carta->info.valore) { case FANTE: printf("J "); break; case DONNA: printf("Q "); break; case RE: printf("K "); break; case ASSO: printf("A "); break; default: printf("%d ",carta->info.valore); } switch(carta->info.seme) { case QUADRI: printf("QUADRI, "); break; case CUORI: printf("CUORI, "); break; case PICCHE: printf("PICCHE, "); break; case FIORI: printf("FIORI, "); } carta = carta->next; } } TipoMazzo mescolaMazzo(TipoMazzo indirizzo_mazzo, int num_mescolate) { /* 1 in un ciclo FOR si genera un numero casuale da 0 a numero carte 2 in un puntatore temporaneo si fa puntare al primo nodo della lista 3 il puntatore lista , si fa puntare al secondo nodo ,"quello che era il primo elemento della lista ora è raggiungibile solo col puntatore temporaneo " 4 si scorre la lista , fino a raggiungere il nodo in posizione data dal numero casuale -1 5 si salva il puntatore NEXT in un puntatore temporaneo es: tempnext 6 si fa puntare a next , l'indirizzo del puntatore che contiene quello che era il primo nodo "abbiamo inserito la carta" 7 si fa puntare a , next->next =tempnext , collegando cosi gli altri nodi della lista */ int i=0,j=0, rnd=1; TipoCarta *PrimoNodo ,*Tmpnext,*TmpLista; srand(time(NULL)); for(i=0;i<num_mescolate;i++) { rnd = rand() % 52 + 1; if(rnd==0)rnd=1; PrimoNodo= indirizzo_mazzo; TmpLista=indirizzo_mazzo; indirizzo_mazzo=TmpLista->next; for(j=0;j<rnd && TmpLista->next!=NULL;j++) { TmpLista=TmpLista->next; } Tmpnext=TmpLista->next; TmpLista->next=PrimoNodo; TmpLista->next->next= Tmpnext; } return indirizzo_mazzo; }


Rispondi quotando
