PDA

Visualizza la versione completa : Programma in c con l'utilizzo delle liste


lukafulmine
26-11-2013, 16:50
ciao a tutti necessitavo una mano per questo codice.
Il mazzo deve essere mescolato spostando la prima carta in una posizione casuale. (ogni nodo rappresenta una carta). questa operazione va ripetuta x volte...dove x il parametro di ingresso num_mescolate. Qualcuno mi sa aiutare?


il codice il seguente:


#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>


typedef enum {CUORI=0,QUADRI,FIORI,PICCHE} TipoSeme;
typedef enum {DUE=2,TRE,QUATTRO,CINQUE,SEI,SETTE,OTTO,NOVE,DIEC I,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);
void mescolaMazzo(TipoMazzo* indirizzo_mazzo, int num_mescolate);


int main()
{
TipoMazzo mazzo = NULL;


mazzo = creaMazzo();
printf("Mazzo appena creato:\n");
stampaCarte(mazzo);
mescolaMazzo(&mazzo,100);
printf("\n\nMazzo dopo essere stato mescolato:\n");
stampaCarte(mazzo);


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


void mescolaMazzo(TipoMazzo* indirizzo_mazzo, int num_mescolate)
{


}



grazie anticipatamente :)

torn24
27-11-2013, 08:52
Be vedo che sei perfettamente in grado di implementare la funzione Mescolamazzo() , forse ti manca l'idea ??

Per mescolare
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



P.S. il numero casuale deve essere superiore a 0 , uno sarebbe inutile cambiare il primo elemento con se stesso , secondo genererebbe un errore , quando tenterai di inserire valori al nodo che lo precede , non esistendo

lukafulmine
28-11-2013, 22:07
Be vedo che sei perfettamente in grado di implementare la funzione Mescolamazzo() , forse ti manca l'idea ??

Per mescolare
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



P.S. il numero casuale deve essere superiore a 0 , uno sarebbe inutile cambiare il primo elemento con se stesso , secondo genererebbe un errore , quando tenterai di inserire valori al nodo che lo precede , non esistendo


scusami ma tradotto in codice sarebbe???

torn24
29-11-2013, 08:34
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



#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,DIEC I,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;
}

lukafulmine
29-11-2013, 14:00
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



#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,DIEC I,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;
}








perfetto...gentilissimo. Grazie mille

Loading