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;
}