Io ti consiglio di usare 
liste concatenate 
Sarebbe giusto (anche divertente) con la stessa tecnica gestire anche i 
giocatori.
typedef struct card
{
    int order; // key order
    char type;
    int seme;
    int value; // 1...10..o 11 etc..
    struct card *prev;
    struct card *next;
}card;
typedef struct player
{
    int isHuman;
    char name[32];
    int pescare;  // Qui mettere quello che ti serve di sapere
    int scartare; // sulla situazione del giocatore
    int numcards;               // Numero carte in mano
    struct card *HandFirst;  // Carte in mano
    struct card *HandLast;  //  ""
    struct card *DownFisrt; // Carte scartate da giocatore 
    struct card *DownLast; // ""
    struct player *prev;
    struct player *next;
}player;
e poi esternamente gestire il 
mazzo nuovo e il 
mazzo delle scartate:
int NumCards=108;
card *FirstCard=NULL;
card *LastCard =NULL;
int NumTrashCards=0;
card *FirstTrashCard=NULL;
card *LastTrashCard =NULL;
ovvio ... anche i 
giocatori:
int NumPlayers=0;
player *FirstPlayer=NULL;
player *LastPlayer =NULL;
Per l'ordinamento dellle carte in mano una 
bubblesort è + che sufficiente... poi aggiungerei una funzione di 
move per spostare la carta agendo sui link (differente dalla swap che userai nel sort). - anche per le carte di scarto modificare solo i 
link delle liste -
Saluti,
Max