cadastro usando lista encadeada
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.