Ir ao conteúdo
  • Cadastre-se

Lista encadeada e alocação dinâmica


Skf8

Posts recomendados

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");
}

Link para o comentário
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

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...