Ir ao conteúdo
  • Cadastre-se
Entre para seguir isso  
Skf8

Lista encadeada e alocação dinâmica

Recommended Posts

O código abaixo, está dando um erro no main() onde dá que o elemento está nulo ou vazio, já verifiquei o código várias vezes e não consigo ver aonde está erro porquê a função está correta...

Código:


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

//Armazena os dados do clientes cadastrados
struct cadastro{
char nome[50];
char estadocivil[15];
int id;
char situacao[15];
char cargo[20];
};

typedef struct cadastro cli;

/* Cria uma struct para dar referencia a próxima celula*/
struct celula
{
cli cadastro;
struct celula *prox;

};

typedef struct celula CEL;

/* Agora está alocando a celula do tipo struct*/
CEL *cria_cel()
{
CEL *p;

p=(struct celula *) malloc(sizeof(struct celula));
return p;
}

CEL *cria_cel();
void exibe_lista(CEL *p);
void insere_ult(CEL **pl);
void remove_ult(CEL **pl);

/* Funcao menu, retorna o numero digitado pelo usuario conforme as instruções abaixo*/
int menu(){
int menu;
printf("\n");
printf ("***MENU CADASTRO DE CLIENTES LOJA DE INFORMATICA***\n");
printf("\n");
printf ("Digite 1 para INSERIR\n");
printf ("Digite 2 para PROCURAR\n");
printf ("Digite 3 para EXCLUIR\n");
printf ("Digite 4 para ALTERAR\n");
printf ("Digite 5 para GRAVAR EM ARQUIVO\n");
printf ("Digite 6 para LER ARQUIVO\n");
printf ("Digite 0 para SAIR\n");
printf("\n");
printf ("Digite qual a opcao que deseja efetuar: ");
scanf ("%i", &menu);
printf("\n");
system("cls");
return menu;
}

/*Funcao Cadastro, armazena o cadastro na ultima celula e
a passagem de parâmetro acontece por referência*/
void insere_ult(CEL **pl)
{
CEL *p,*q;

p=cria_cel();
fflush(stdin);
int i=0,qtd;
FILE *arq;
arq=fopen("C:/teste.bin", "ab");
printf ("********** CADASTRO DE GRUPO DE CLIENTES **********\n");
printf ("\nDigite quantos grupos de clientes que deseja cadastrar: ");
scanf ("%i", &qtd);
printf("\n");
for(i=0;i<qtd;i++){

printf ("**********Cadastro de Clientes**********\n");
printf("\n");
printf ("Digite um codigo para o cadastro do cliente: ");
fflush(stdin);
scanf ("%i",&p->cadastro.id);
printf("\n");
printf ("Digite o nome do %i cliente: ", i+1);
fflush(stdin);
gets (p->cadastro.nome);
printf("\n");
printf ("Digite o Estado Civil do %i cliente: ", i+1);
fflush(stdin);
gets (p->cadastro.estadocivil);
printf("\n");
printf ("Digite a situacao do %i cliente(ATIVO/INATIVO): ", i+1);
fflush(stdin);
gets (p->cadastro.situacao);
printf("\n");
printf ("Digite a profissao do %i cliente: ", i+1);
fflush(stdin);
gets (p->cadastro.cargo);
p->prox=*pl;
*pl=p;
printf("\n");
system("cls");
p->prox=NULL;
if(*pl==NULL)
*pl=p;
else
{
/* Procura o ultimo numero */
for(q=*pl;q->prox!=NULL;q=q->prox);
q->prox=p;
}
fwrite(pl,sizeof(pl),1,arq);
}
fclose(arq);

}

/* Remove a ultima célula e verifica se a mesma está vazia*/
void remove_ult(CEL **pl)
{
CEL *pn,*un;

if(*pl==NULL)
printf("\nLista Vazia");
else
{
if((*pl)->prox==NULL)
*pl=0;
else
{
/* procura o ultimo no */
pn=*pl;
un=*pl;
while(un->prox!=NULL)
{ pn=un;
un=un->prox;
}
pn->prox=NULL;
free(un);
}
printf("\nFoi removida a ultima celula!!!!");
}
}

/* Remove depois da celula que verifica se contêm conteudo*/
void remDepois(CEL *pl)
{
CEL *q;

if(pl==NULL||pl->prox==NULL)
printf("\nRemocao nula");
else
{
q=pl->prox;
pl->prox=q->prox;
free(q);
}
}

/* Exibe o conteudo cadastrado no sistema*/
void exibe_lista(CEL *p)
{
int m=1;

printf("\n*****Conteudo Cadastrado*****");
while(p!=0)
{
printf("\nCelula da Lista- %i",m++);
printf("\nCódigo Cliente Cadastrado:%i\n",p->cadastro.id);
printf("\nNome Cliente:%s\n",p->cadastro.nome);
printf("\nEstado Civil:%s\n",p->cadastro.estadocivil);
printf("\nSituacao do cadastro:%s\n",p->cadastro.situacao);
printf("\nCargo:%s\n",p->cadastro.cargo);
p=p->prox;
}
printf("\nFim da exibicao do conteudo cadastrado\n");
}

/* Busca o que já foi cadastrado no sistema e o que vai estar no arquivo*/
CEL * busca(CEL *pl)
{
CEL *p;
int m=1,cod;
printf("\nDigite o codigo do cliente que deseja pesquisar: ");
scanf("%i",&cod);
for(p=pl;p!=NULL;p=p->prox)
{
if(p->cadastro.id==cod){
printf("\nCelula da Lista- %i",m++);
printf("\nCódigo Cliente Cadastrado:%i\n",p->cadastro.id);
printf("\nNome Cliente:%s\n",p->cadastro.nome);
printf("\nEstado Civil:%s\n",p->cadastro.estadocivil);
printf("\nSituacao do cadastro:%s\n",p->cadastro.situacao);
printf("\nCargo:%s\n",p->cadastro.cargo);

return p;
}
return NULL;
}
}

/* Remove e exclui o cadastro conforme digitar pelo código do cliente*/
CEL * remove(CEL *pl,int id){
CEL *p,*ant;
int m=1,del,cod;
ant = pl;

for(p=pl;p!=NULL;p=p->prox)
{
if(p->cadastro.id==cod)
{
printf("\nCelula da Lista- %i",m++);
printf("\nCódigo Cliente Cadastrado:%i\n",p->cadastro.id);
printf("\nNome Cliente:%s\n",p->cadastro.nome);
printf("\nEstado Civil:%s\n",p->cadastro.estadocivil);
printf("\nSituacao do cadastro:%s\n",p->cadastro.situacao);
printf("\nCargo:%s\n",p->cadastro.cargo);
fflush(stdin);
printf("Deseja realmente excluir?\n1-Sim\n2-Nao");
printf("Digite: 1-Sim e 2-Nao");
scanf("%i",&del);
if(del==1)
{
ant->prox=p->prox;
free(p);
}
}
}

return NULL;
}

/* Vai modificar um cadastro já efetuado, permitindo alterar o que desejar*/
CEL * modifica(CEL **pl)
{
CEL *p;
int m=1,id,cod;
printf("\nDigite o codigo do cliente que deseja alterar: ");
scanf("%i",&id);
for(p=*pl;p!=NULL;p=p->prox){
if(p->cadastro.id==cod){
printf("\nCelula da Lista- %i",m++);
printf("Codigo Cadastrado: %i\n",p->cadastro.id);
printf("\nNome Cliente: %s\n",p->cadastro.nome);
fflush(stdin);
printf ("Digite o nome do %i cliente: ");
fflush(stdin);
gets (p->cadastro.nome);
printf("\n");
printf ("Digite a situacao do %i cliente(ATIVO/INATIVO): ");
fflush(stdin);
scanf("%s",&p->cadastro.situacao);
printf("\n");
printf ("Digite a profissao do %i cliente: ");
fflush(stdin);
gets (p->cadastro.cargo);

p=p->prox;
return p;
}
else{
printf("\nNao existe cadastro com esse codigo\n");
}
}
return NULL;
}

main()
{
CEL *mostra,*p;
int x,i,f=0,cod;
system("cls");
mostra=0;

/* Abre o menu, possibilitando o usuário escolher o que deseja*/
int opcao;
opcao=menu();
while (opcao==1 || opcao==2 || opcao==3 || opcao==4 || opcao==5 || opcao==6){
if(opcao==1){
opcao=insere_ult(&mostra);
}
if(opcao==2){
opcao=busca(&mostra);
}
if(opcao==3){
opcao=remove(&mostra);
}
if(opcao==4){
opcao=modifica(&mostra);
}
if(opcao==5){
opcao=grava(&mostra);
}
if(opcao==6){
opcao=exibe_lista(&mostra);
}
}
printf("\n\n");
system("pause");
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

void insere_ult(CEL **pl)

A função é sem retorno

opcao=insere_ult(&mostra);

e aqui ela recebe um inteiro, ou seja, a função deveria retornar um inteiro.

Compartilhar este post


Link para o post
Compartilhar em outros sites
void insere_ult(CEL **pl)

A função é sem retorno

opcao=insere_ult(&mostra);

e aqui ela recebe um inteiro, ou seja, a função deveria retornar um inteiro.

Não entendi o que você quis dizer??

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

//Armazena os dados do clientes cadastrados
struct cadastro{
char nome[50];
char estadocivil[15];
int id;
char situacao[15];
char cargo[20];
};

typedef struct cadastro cli;

/* Cria uma struct para dar referencia a próxima celula*/
struct celula
{
cli cadastro;
struct celula *prox;

};

typedef struct celula CEL;

/* Agora está alocando a celula do tipo struct*/
CEL *cria_cel()
{
CEL *p;

p=(struct celula *) malloc(sizeof(struct celula));
return p;
}

CEL *cria_cel();
void exibe_lista(CEL *p);
void insere_ult(CEL **pl);
void remove_ult(CEL **pl);

/* Funcao menu, retorna o numero digitado pelo usuario conforme as instruções abaixo*/
int menu(){
int menu;
printf("\n");
printf ("***MENU CADASTRO DE CLIENTES LOJA DE INFORMATICA***\n");
printf("\n");
printf ("Digite 1 para INSERIR\n");
printf ("Digite 2 para PROCURAR\n");
printf ("Digite 3 para EXCLUIR\n");
printf ("Digite 4 para ALTERAR\n");
printf ("Digite 5 para GRAVAR EM ARQUIVO\n");
printf ("Digite 6 para LER ARQUIVO\n");
printf ("Digite 0 para SAIR\n");
printf("\n");
printf ("Digite qual a opcao que deseja efetuar: ");
scanf ("%i", &menu);
printf("\n");
system("cls");
return menu;
}

/*Funcao Cadastro, armazena o cadastro na ultima celula e
a passagem de parâmetro acontece por referência*/
[B][U]void insere_ult(CEL **pl)[/U][/B]
{
CEL *p,*q;

p=cria_cel();
fflush(stdin);
int i=0,qtd;
FILE *arq;
arq=fopen("C:/teste.bin", "ab");
printf ("********** CADASTRO DE GRUPO DE CLIENTES **********\n");
printf ("\nDigite quantos grupos de clientes que deseja cadastrar: ");
scanf ("%i", &qtd);
printf("\n");
for(i=0;i<qtd;i++){

printf ("**********Cadastro de Clientes**********\n");
printf("\n");
printf ("Digite um codigo para o cadastro do cliente: ");
fflush(stdin);
scanf ("%i",&p->cadastro.id);
printf("\n");
printf ("Digite o nome do %i cliente: ", i+1);
fflush(stdin);
gets (p->cadastro.nome);
printf("\n");
printf ("Digite o Estado Civil do %i cliente: ", i+1);
fflush(stdin);
gets (p->cadastro.estadocivil);
printf("\n");
printf ("Digite a situacao do %i cliente(ATIVO/INATIVO): ", i+1);
fflush(stdin);
gets (p->cadastro.situacao);
printf("\n");
printf ("Digite a profissao do %i cliente: ", i+1);
fflush(stdin);
gets (p->cadastro.cargo);
p->prox=*pl;
*pl=p;
printf("\n");
system("cls");
p->prox=NULL;
if(*pl==NULL)
*pl=p;
else
{
/* Procura o ultimo numero */
for(q=*pl;q->prox!=NULL;q=q->prox);
q->prox=p;
}
fwrite(pl,sizeof(pl),1,arq);
}
fclose(arq);

}

/* Remove a ultima célula e verifica se a mesma está vazia*/
void remove_ult(CEL **pl)
{
CEL *pn,*un;

if(*pl==NULL)
printf("\nLista Vazia");
else
{
if((*pl)->prox==NULL)
*pl=0;
else
{
/* procura o ultimo no */
pn=*pl;
un=*pl;
while(un->prox!=NULL)
{ pn=un;
un=un->prox;
}
pn->prox=NULL;
free(un);
}
printf("\nFoi removida a ultima celula!!!!");
}
}

/* Remove depois da celula que verifica se contêm conteudo*/
void remDepois(CEL *pl)
{
CEL *q;

if(pl==NULL||pl->prox==NULL)
printf("\nRemocao nula");
else
{
q=pl->prox;
pl->prox=q->prox;
free(q);
}
}

/* Exibe o conteudo cadastrado no sistema*/
void exibe_lista(CEL *p)
{
int m=1;

printf("\n*****Conteudo Cadastrado*****");
while(p!=0)
{
printf("\nCelula da Lista- %i",m++);
printf("\nCódigo Cliente Cadastrado:%i\n",p->cadastro.id);
printf("\nNome Cliente:%s\n",p->cadastro.nome);
printf("\nEstado Civil:%s\n",p->cadastro.estadocivil);
printf("\nSituacao do cadastro:%s\n",p->cadastro.situacao);
printf("\nCargo:%s\n",p->cadastro.cargo);
p=p->prox;
}
printf("\nFim da exibicao do conteudo cadastrado\n");
}

/* Busca o que já foi cadastrado no sistema e o que vai estar no arquivo*/
CEL * busca(CEL *pl)
{
CEL *p;
int m=1,cod;
printf("\nDigite o codigo do cliente que deseja pesquisar: ");
scanf("%i",&cod);
for(p=pl;p!=NULL;p=p->prox)
{
if(p->cadastro.id==cod){
printf("\nCelula da Lista- %i",m++);
printf("\nCódigo Cliente Cadastrado:%i\n",p->cadastro.id);
printf("\nNome Cliente:%s\n",p->cadastro.nome);
printf("\nEstado Civil:%s\n",p->cadastro.estadocivil);
printf("\nSituacao do cadastro:%s\n",p->cadastro.situacao);
printf("\nCargo:%s\n",p->cadastro.cargo);

return p;
}
return NULL;
}
}

/* Remove e exclui o cadastro conforme digitar pelo código do cliente*/
CEL * remove(CEL *pl,int id){
CEL *p,*ant;
int m=1,del,cod;
ant = pl;

for(p=pl;p!=NULL;p=p->prox)
{
if(p->cadastro.id==cod)
{
printf("\nCelula da Lista- %i",m++);
printf("\nCódigo Cliente Cadastrado:%i\n",p->cadastro.id);
printf("\nNome Cliente:%s\n",p->cadastro.nome);
printf("\nEstado Civil:%s\n",p->cadastro.estadocivil);
printf("\nSituacao do cadastro:%s\n",p->cadastro.situacao);
printf("\nCargo:%s\n",p->cadastro.cargo);
fflush(stdin);
printf("Deseja realmente excluir?\n1-Sim\n2-Nao");
printf("Digite: 1-Sim e 2-Nao");
scanf("%i",&del);
if(del==1)
{
ant->prox=p->prox;
free(p);
}
}
}

return NULL;
}

/* Vai modificar um cadastro já efetuado, permitindo alterar o que desejar*/
CEL * modifica(CEL **pl)
{
CEL *p;
int m=1,id,cod;
printf("\nDigite o codigo do cliente que deseja alterar: ");
scanf("%i",&id);
for(p=*pl;p!=NULL;p=p->prox){
if(p->cadastro.id==cod){
printf("\nCelula da Lista- %i",m++);
printf("Codigo Cadastrado: %i\n",p->cadastro.id);
printf("\nNome Cliente: %s\n",p->cadastro.nome);
fflush(stdin);
printf ("Digite o nome do %i cliente: ");
fflush(stdin);
gets (p->cadastro.nome);
printf("\n");
printf ("Digite a situacao do %i cliente(ATIVO/INATIVO): ");
fflush(stdin);
scanf("%s",&p->cadastro.situacao);
printf("\n");
printf ("Digite a profissao do %i cliente: ");
fflush(stdin);
gets (p->cadastro.cargo);

p=p->prox;
return p;
}
else{
printf("\nNao existe cadastro com esse codigo\n");
}
}
return NULL;
}

main()
{
CEL *mostra,*p;
int x,i,f=0,cod;
system("cls");
mostra=0;

/* Abre o menu, possibilitando o usuário escolher o que deseja*/
int opcao;
opcao=menu();
while (opcao==1 || opcao==2 || opcao==3 || opcao==4 || opcao==5 || opcao==6){
if(opcao==1){
[B][U] opcao=insere_ult(&mostra);[/U][/B]
}
if(opcao==2){
opcao=busca(&mostra);
}
if(opcao==3){
opcao=remove(&mostra);
}
if(opcao==4){
opcao=modifica(&mostra);
}
if(opcao==5){
opcao=grava(&mostra);
}
if(opcao==6){
opcao=exibe_lista(&mostra);
}
}
printf("\n\n");
system("pause");
}

olhe nos códigos em negrito

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora
Entre para seguir isso  





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×