Olá pessoal

Estou com o seguinte problema, estou fazendo um cadastrinho usando lista encadeada, coloquei apenas uma variavel na struct (nome da variavel = "nome"), funcionou beleza, so que ai fui acrescentar outra variavel na struct (nome da variavel = "ra"), ai compilei, não me apresentou nenhum erro, so que quando chamo a função para inserir ele me pede nome ai digito e depois pede ra que tambem digito ai quando dou enter ele trava o programa. Alguem sabe o que pode estar acontecendo. Segue abaixo meu codigo para analise:

Código :
//main
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
    char op;
 
    do 
    {
        system("cls");
        printf("Cadastro de Alunos\n\n");
        printf("1 - Insere Dados\n");
        printf("2 - Exibe Dados\n");
        printf("3 - Busca Dados\n");
        printf("4 - Deleta Dados\n");
        printf("5 - Sair\n\n");
        printf("Escolha uma opcao: ");
        fflush(stdin);        
        scanf("%c", &op);
        switch(op) 
        {
            case '1':
                    insere();
                    break;
            case '2':
                    exibe();
                    break;
            case '3':
                    busca();
                    break;
            case '4':
                    deleta();
                    break;
 
            case '5':
                    exit(0);
                    break;
 
            default:
                   system("cls");
                   printf("Opcao invalida\n\n");
                   system("pause");
                   break;
        }
    }
    while (op != 5);
 
    system("PAUSE"); 
    return 0;
}

Código :
//notas.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct aluno
{
    char *nome;
    char *ra;
    struct aluno *proximo;
};
typedef struct aluno Aluno;
//Inicializa a estrutura de dados principal-------------------------------------
Aluno *principal = NULL;
//------------------------------------------------------------------------------
//Cria a nova lista apontando o proximo no para NULL----------------------------
Aluno *inicia_dados(char *nome, char *ra) 
{
    Aluno *novo;
    novo = (Aluno *)malloc(sizeof(Aluno));
    novo->nome = (char *)malloc(strlen(nome)+1);
    strncpy(novo->nome, nome, strlen(nome)+1);
    novo->ra = (char *)malloc(strlen(ra)+1);
    strncpy(novo->ra, ra, strlen(ra)+1);
    novo->proximo = NULL;
    return novo;
}
//------------------------------------------------------------------------------
//Como a lista nao esta mais vazia, apontamos o proximo no para lista anterior--
Aluno *insere_dados(Aluno *dados, char *nome, char *ra) 
{
    Aluno *novo;
    novo = (Aluno *)malloc(sizeof(Aluno));
    novo->nome = (char *)malloc(strlen(nome)+1);
    strncpy(novo->nome, nome, strlen(nome)+1);
    novo->ra = (char *)malloc(strlen(ra)+1);
    strncpy(novo->ra, ra, strlen(ra)+1);
    novo->proximo = dados;
    return novo;
}
//------------------------------------------------------------------------------
//Percorre todos os campos da lista e imprime ate o ponteiro proximo 
//chegar em NULL----------------------------------------------------------------
void exibe_dados(Aluno *dados) 
{
    printf("Cadastro de Alunos\n\n");
    printf("------------------------\n");
    for (; dados != NULL; dados = dados->proximo) 
    {
        printf("Nome: %s\n", dados->nome);
        printf("RA: %s\n", dados->ra);
        printf("------------------------\n");
    }
    system("pause");
}
//------------------------------------------------------------------------------
//Percorre cada ponta comparando o nome com a auxiliar--------------------------
void busca_dados(Aluno *dados, char *auxiliar) 
{
    int achou = 0;
    system("cls");
    printf("Cadastro de Alunos\n\n");
    for (; dados != NULL; dados = dados->proximo) 
    {
        if (strcmp(auxiliar, dados->nome) == 0) 
        {
            printf("------------------------\n");
            printf("Nome: %s\n", dados->nome);
            printf("RA: %s\n", dados->ra);
            printf("------------------------\n");
            achou++;
        }
    }
    if (achou == 0)
        printf("Nenhum resultado encontrado\n\n");
    else
        printf("Foram encontrados %d registros\n\n",achou);
    system("pause");
}
//------------------------------------------------------------------------------
//Deleta o ultimo registro inserido--------------------------------------------
Aluno *deleta_dados(Aluno *dados) 
{
    Aluno *novo;
    novo = dados->proximo;
    free(dados->nome);
    free(dados->ra);
    free(dados);
    printf("Ultimo registro inserido foi deletado\n\n");
    system("pause");
    return novo;
}
//------------------------------------------------------------------------------
//Apenas checa se a lista e NULL ou nao-----------------------------------------
int checa_vazio(Aluno *dados) 
{
    if (dados == NULL) 
    {
        printf("Nenhuma informacao foi inserida\n\n");
        system("pause");
        return 1;
    } 
    else
        return 0;
}
//------------------------------------------------------------------------------
//Obtem os dados necessarios para chamar as funcoes de manuseio de dados--------
void insere(void) 
{
    char *nome;
    char *ra;
    nome = (char *)malloc(100);
    system("cls");
    printf("Nome: ");
    fflush(stdin);
    gets(nome);
    printf("\n");
    printf("RA: ");
    fflush(stdin);
    gets(ra);
    printf("\n");
 
    if (principal == NULL)
        principal = inicia_dados(nome, ra);
    else
        principal = insere_dados(principal, nome, ra);
}
//------------------------------------------------------------------------------
//exibe todos os elementos da lista---------------------------------------------
void exibe(void) 
{
    system("cls");
    if (!checa_vazio(principal))
        exibe_dados(principal);
}
//------------------------------------------------------------------------------
//busca um determinado elemento-------------------------------------------------
void busca(void) 
{
    char *auxiliar;
    system("cls");
    if (!checa_vazio(principal)) 
    {
        auxiliar = (char *)malloc(100);
        printf("Informe o nome que deseja buscar: ");
        fflush(stdin);
        gets(auxiliar);
        busca_dados(principal, auxiliar);
    }
}
//------------------------------------------------------------------------------
//deleta elemento da lista------------------------------------------------------
void deleta(void) 
{
    system("cls");
 
    if (!checa_vazio(principal))
        principal = deleta_dados(principal);
}
//------------------------------------------------------------------------------

Código :
//notas.h
//Cria a nova lista apontando o proximo no para NULL----------------------------
Notas *inicia_dados(char *nome);
//------------------------------------------------------------------------------
//Como a lista nao esta mais vazia, apontamos o proximo no para lista anterior--
Notas *insere_dados(Notas *dados, char *nome);
//------------------------------------------------------------------------------
//Percorre todos os campos da lista e imprime ate o ponteiro proximo 
//chegar em NULL----------------------------------------------------------------
void exibe_dados(Notas *dados);
//------------------------------------------------------------------------------
//Percorre cada ponta comparando o nome com a auxiliar--------------------------
void busca_dados(Notas *dados, char *auxiliar);
//------------------------------------------------------------------------------
//Deleta o ultimo registro inserido--------------------------------------------
Notas *deleta_dados(Notas *dados);
//------------------------------------------------------------------------------
//Apena checa se a lista e NULL ou nao-----------------------------------------
int checa_vazio(Notas *dados);
//------------------------------------------------------------------------------
//Obtem os dados necessarios para chamar as funcoes de manuseio de dados--------
void insere(void);
//------------------------------------------------------------------------------
//exibe todos os elementos da lista---------------------------------------------
void exibe(void);
//------------------------------------------------------------------------------
//busca um determinado elemento-------------------------------------------------
void busca(void);
//------------------------------------------------------------------------------
//deleta elemento da lista------------------------------------------------------
void deleta(void);
//------------------------------------------------------------------------------

Desde já agradeço.