Salve Programmatori!

Sto sviluppando un codice per un piccolo giochino chiamato Sandwich e vorrei salvare le azioni di ogni utente (o meglio le parole che ogni utente gioca).
Le regole del gioco sono poche e semplicissime:
Innanzitutto si stabilisce l'ordine di gioco.
Il primo giocatore scrive una parola di 10 lettere su un foglio e lo passa al secondo giocatore.
Il secondo giocatore deve scrivere una parola della medesima lunghezza e che inizi e termini con le stesse
lettere con le quali inizia la parola passatagli dal primo giocatore.
Se il secondo giocatore riesce a scrivere la parola secondo quanto detto, non segna alcun punto di penalità.
Se invece trova una parola con le stesse lettere alle estremità ma di lunghezza diversa da 10, il giocatore
segna tanti punti di penalità quante sono le lettere della parola che mancano (o eccedono) per ottenere la
lunghezza giusta.
In ogni caso il secondo giocatore, scritta la propria parola e segnati gli eventuali punti di penalità, passa il
foglio al terzo giocatore.
Esempio:
Primo giocatore: CONCLUDERE
Possibili parole del secondo giocatore:
CACCIATORE (10 lettere: nessun punto di penalità)
CAMELIE (7 lettere: 3 punti di penalità)
CANCELLATURE (12 lettere: 2 punti di penalità)
I giocatori che via via raggiungono o superano un certo numero prefissato di punti di penalità vengono
eliminati.
Di seguito incollerò il mio codice. Ho già provato a creare una funzione apposita per il listaggio delle parole usate da ogni giocatore ma quando eseguo il programma, nel momento in cui si dovrebbero visualizzare le liste di parole, il programma crasha.
Ecco un taglio del codice in questione:

codice:
struct Mossa
{
    char giocata;
    struct Mossa *next;
};

struct Account
{
    char nome[15];
    int penalita;
    int contatore;
    struct Account *next;
    struct Mossa *p_gioc;
};

struct Best
{
    float tempo;
    struct Account *p_nome;
    struct Best *next;
};

typedef struct Mossa mossa;
typedef struct Account account;
typedef struct Best best;
typedef enum{false, true} boolean;

void risultati(account *cursore, int cont);

int main()
{
    for(i=0; i<n_gioc; i++)
    {
        printf("Parole inserite da %s:", (nuovo+i)->nome);
        risultati((nuovo+i), (nuovo+i)->contatore);
        printf("\n\n");
    }
}

void risultati(account *cursore, int cont)
{
    int i;

    for(i=0; i<cont; i++)
    {
        printf("\n%da parola utilizzata: %s", (cont+1), cursore->p_gioc->giocata);
        cursore = cursore->next;
    }
}
E questo è il codice completo:
codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

struct Mossa
{
    char giocata;
    struct Mossa *next;
};

struct Account
{
    char nome[15];
    int penalita;
    int contatore;
    struct Account *next;
    struct Mossa *p_gioc;
};

struct Best
{
    float tempo;
    struct Account *p_nome;
    struct Best *next;
};

typedef struct Mossa mossa;
typedef struct Account account;
typedef struct Best best;
typedef enum{false, true} boolean;

account* inserisci(int giocatori);
void sandwich(account *nuovo, char par[20]);
boolean esistente(mossa *paroledb, char scritta[20]);
void classifica(best **b, account *nick, float tot, best **ultimo);
void risultati(account *cursore, int cont);
void stampaclassifica(best *b);
void liberaclassifica(best **cursore);

int main()
{
    int turno = 0, n_gioc, fine = 0, i, gioc_rimasti, uscita = 0;
    char parola[20], parola2[20], eliminati[n_gioc], vincitore, scelta;
    account *nuovo = NULL, *a = NULL;
    best *b = NULL, *ultimo = NULL;

    clock_t start = 0;
    clock_t end = 0;

    for(i=0; i<20; i++)
    {
        parola[i] = '\0';
    }

    do
    {
        printf("Inserire il numero dei giocatori [0 per uscire]: ");
        scanf("%d", &n_gioc);
        if(n_gioc == 0)
        {
            exit(0);
        }

        nuovo = inserisci(n_gioc);
        gioc_rimasti = n_gioc;
        eliminati[n_gioc];

        system("cls");

        for(i=0; i<n_gioc; i++)
        {
            printf("Inserire il nome del giocatore %d [0 per uscire]: ", i+1);
            scanf("%s", (nuovo+i)->nome);
            if((nuovo+i)->nome[0] == '0')
            {
                exit(0);
            }
        }

        do
        {
            for(i=0; i<n_gioc; i++)
            {
                system("cls");
                if((nuovo+i)->penalita >= 10)
                {
                    if((nuovo+i)->nome[15] != eliminati[i+1])
                    {
                        eliminati[i+1] = (nuovo+i)->nome[15];
                        printf("%s, hai superato il limite di penalita'!\nSfortunatamente non puoi piu' giocare.", (nuovo+i));
                        gioc_rimasti--;
                    }
                    else
                    {
                        printf("%s, sei stato eliminato.\n\n", (nuovo+i));
                    }
                }
                else
                {
                    if(gioc_rimasti == 1)
                    {
                        printf("%s HAI VINTO LA PARTITA CON SOLE %d PENALITA'!\n\n", (nuovo+i), (nuovo+i)->penalita);
                        uscita = 1;
                        vincitore = (nuovo+i)->nome[15];
                        system("pause");
                    }
                    else
                    {
                        printf("Tocca a %s con %d penalita'!\n", (nuovo+i)->nome, (nuovo+i)->penalita);

                        if(parola[0] == '\0')
                        {
                            while(parola[0] == '\0')
                            {
                                printf("Inserisci una parola di 10 lettere [X per uscire]: ");
                                scanf("%s", parola);
                                if((parola[0] == 'X') || (parola[0] == 'x'))
                                {
                                    exit(0);
                                }
                                else
                                {
                                    if(strlen(parola) != 10)
                                    {
                                        printf("ATTENZIONE: la parola \"%s\" non contiene 10 lettere.\n", parola);
                                        parola[0] = '\0';
                                    }
                                }
                            }
                        }
                        else
                        {
                            start = clock();
                            sandwich((nuovo+i), parola);
                            end = clock();
                            classifica(&b, (nuovo+i), ((double)(end - start)), &ultimo);
                            start = 0;
                        }
                    }
                }
            }
        }while(uscita == 0);

        system("cls");
        for(i=0; i<n_gioc; i++)
        {
            printf("Parole inserite da %s:", (nuovo+i)->nome);
            risultati((nuovo+i), (nuovo+i)->contatore);
            printf("\n\n");
        }

        system("pause");
        system("cls");

        stampaclassifica(b);
        printf("\n\nIl record di lentezza va a %s con %.2f secondi!", ultimo->p_nome->nome, ultimo->tempo);
        liberaclassifica(&b);

        printf("\n\nPremi un tasto qualsiasi per continuare [X per uscire]: ");
        scelta = getch();

    }while(scelta != 'x');

    system("pause");
    return 0;
}

account* inserisci(int giocatori)
{
    int i;
    account *nuovo = NULL;
    nuovo = (account*)malloc(giocatori*sizeof(account));

    for(i=0; i<giocatori; i++)
    {
        nuovo[i].p_gioc = NULL;
    }

    return nuovo;
}

void sandwich(account *nuovo, char par[20])
{
    int i, esiste = 0, lunghezza;
    char par2[20];

    mossa *nuovamossa = NULL;
    nuovamossa = (mossa*)malloc(sizeof(mossa));

    if(nuovo->p_gioc == NULL)
    {
        nuovamossa->next = NULL;
    }
    else
    {
        nuovamossa->next = nuovo->p_gioc;
        nuovo->p_gioc = nuovamossa;
    }

    do
    {
        printf("Inserisci una parola, possibilmente di 10 lettere, che inizi con\nla lettera \"%c\" e finisca con la lettera \"%c\" [X per uscire]: ", par[0], par[9]);
        scanf("%s", par2);
        if((par[0] == 'X') || (par[0] == 'x'))
        {
            exit(0);
        }

        if(esistente(nuovo->p_gioc, par2) == true)
        {
            printf("ATTENZIONE: la parola \"%s\" è gia' stata inserita.\n", par2);
            esiste = 1;
        }

        esiste = 0;
        lunghezza = strlen(par2);

        if((par2[0] == par[0]) && (par2[lunghezza-1] == par[9]))
        {
            (nuovamossa)->giocata = par2[20];
            (nuovo)->contatore = (nuovo)->contatore + 1;

            if(lunghezza <= 10)
            {
                (nuovo)->penalita += (10 - lunghezza);
            }
            else
            {
                (nuovo)->penalita += (lunghezza - 10);
            }
        }
        else
        {
            esiste = 1;
            if(par2[0] != par[0])
            {
                printf("ATTENZIONE: la parola \"%s\" non inizia con la lettera \"%c\".\n", par2, par[0]);
            }
            else
            {
                printf("ATTENZIONE: la parola \"%s\" non termina con la lettera \"%c\".\n", par2, par[9]);
            }
        }
    }while(esiste == 1);
}

boolean esistente(mossa *paroledb, char scritta[20])
{
    while(paroledb != NULL)
    {
        if(paroledb->giocata == scritta[20])
        {
            return true;
        }
        paroledb = paroledb->next;
    }
    return false;
}

void classifica(best **b, account *nick, float tot, best **ultimo)
{
    best *tempi, *prec, *temp;
    tempi = (best*)malloc(sizeof(best));

    if (tempi == NULL)
    {
        exit(0);
    }

    tempi->tempo = tot;
    tempi->p_nome = nick;
    tempi->next = NULL;

    if(*b == NULL)
    {
        *b = tempi;
        *ultimo = *b;
        return;
    }

    prec = NULL;
    temp = *b;

    while(temp != NULL)
    {
        if(tempi->tempo < temp->tempo)
        {
            tempi->next = temp;

            if(prec == NULL)
            {
                *b = tempi;
            }
            else
            {
                prec->next = tempi;
            }
            return;
        }
        prec = temp;
        temp = temp->next;
    }
    prec->next = tempi;
    *ultimo = tempi;
    return;
}

void risultati(account *cursore, int cont)
{
    int i;

    for(i=0; i<cont; i++)
    {
        printf("\n%da parola utilizzata: %s", (cont+1), cursore->p_gioc->giocata);
        cursore = cursore->next;
    }
}

void stampaclassifica(best *b)
{
    int cont = 1;

    printf("Classifica dei record di velocita':\n");
    while((b != NULL) && (cont <= 5))
    {
        printf("\n%do posto: %s con %.2f secondi.", cont, b->p_nome->nome, b->tempo);
        b = b->next;
        cont++;
    }
}

void liberaclassifica(best **cursore)
{
    best *temp;

    while(cursore != NULL)
    {
        temp = *cursore;
        *cursore = (*cursore)->next;
        free(temp);
    }
}
Sapete gentilmente dirmi cosa/dove sbaglio e come fare per sistemarlo?
P.S. Sono alle prime armi con la programmazione... :master: