Meu código abaixo possui uma função excluir e ela não está funcionando. Por exemplo eu cadastro 5 elementos e ai eu tento excluir o terceiro elemento e acaba não dando certo. Porque? Como posso consertar a função excluir?
/*
Descrição: Programa que tem como objetivo apresentar a manipulação de uma lista encadeada, por meio
das funções de inserção, impressão e pesquisa.
*/
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
/* ### Declaração das estruturas e protótipos de função ### */
// declaração do tipo de estrutura da lista
typedef struct nodo Cadastro;
struct nodo{
int codigo;
char nome[40];
char nacionalidade[20];
char estado_civil[15];
Cadastro *prox;
};
// prototipação das funções
void menu();
Cadastro *inicializa (void);
Cadastro *insere (Cadastro *l, int i, char nome[], char nacionalidade[], char estado_civil[]);
void imprime (Cadastro *l);
int vazia (Cadastro *l);
Cadastro *busca (Cadastro *l, int v);
Cadastro *retira (Cadastro *l, int v);
/* ### Fim da declaração das estruturas e protótipos de função ### */
/* ### Declaração das funções do programa ### */
// função principal
int main (){
// cria um ponteiro para a estrutura Cadastro
Cadastro *l, *r;
int op, num;
char nome[40], nacionalidade[20], estado_civil[15];
do{
system("cls");
menu();
scanf("%d", &op);
// verifica a opção digitada pelo usuário
switch(op){
// cria a lista
case 1:
// inicializa lista como vazia
l = inicializa();
printf("\n\t\tA lista foi criada com sucesso!!!");
printf("\n\t\tTecle <ENTER> para continuar");
getch();
break;
// insere elementos na lista
case 2:
// Trabalho futuro: verificar se a lista foi criada
printf("\n\t\tInforme o novo codigo: ");
scanf("%d", &num);
fflush(stdin);
printf("\n\t\tInforme o novo nome: ");
gets(nome);
fflush(stdin);
printf("\n\t\tInforme a nacionalidade: ");
gets(nacionalidade);
fflush(stdin);
printf("\n\t\tInforme o estado civil: ");
gets(estado_civil);
fflush(stdin);
// insere na lista o elemento informado pelo usuário
l = insere(l, num, nome, nacionalidade, estado_civil);
printf("\n\t\tElemento inserido na lista com sucesso!!!");
printf("\n\t\tTecle <ENTER> para continuar");
getch();
break;
// imprime elementos da lista
case 3:
// verificar se a lista está vazia
if(!vazia(l)){
// imprime os elementos da lista
imprime(l);
printf("\n\t\tTecle <ENTER> para continuar");
getch();
}
else{
printf("\n\t\tA lista estah vazia!\n");
printf("\n\t\tTecle <ENTER> para continuar");
getch();
}
break;
// pesquisa na lista
case 4:
// Trabalho futuro: verificar se a lista foi criada
printf("\n\t\tDigite um valor a ser pesquisado: ");
scanf("%d", &num);
r = busca(l, num);
if(r){
printf("\n\t\tO valor %d estah na lista!\n\n", r->codigo);
printf("\n\t\tTecle <ENTER> para continuar");
getch();
}
else{
printf("\n\t\tO valor %d não estah na lista!\n\n", num);
printf("\n\t\tTecle <ENTER> para continuar");
getch();
}
break;
// exclui um elemento da lista
case 5:
printf("\n\t\tDigite um valor a ser retirado da lista: ");
scanf("%d", &num);
r = busca(l, num);
if(r){
// chama a função para retirar o elemento da lista
l = retira (r, num);
printf("\n\t\tO valor %d foi retirado da lista!\n\n", num);
printf("\n\t\tTecle <ENTER> para continuar");
getch();
}
else{
printf("\n\t\tO valor %d não estah na lista!\n\n", num);
printf("\n\t\tTecle <ENTER> para continuar");
getch();
}
break;
// sai do programa
case 6:
printf("\n\t\tFim do Programa!\n");
break;
// se o usuário digitar uma opção fora da faixa entre 1 e 5
default:
printf("\n\tOpcao invalida!\n");
} // fim do switch
}while(op != 6); // fim do..while
printf("\n");
return 0;
}
// função que inicializa a lista
Cadastro *inicializa (void){
return NULL;
}
// insere elemento novo na lista
Cadastro *insere (Cadastro *l, int i, char nome[], char nacionalidade[], char estado_civil[]){
Cadastro *novo = (Cadastro*) malloc(sizeof(Cadastro));
novo->codigo = i;
strcpy(novo->nome, nome);
strcpy(novo->nacionalidade, nacionalidade);
strcpy(novo->estado_civil, estado_civil);
novo->prox = l;
return novo;
}
// imprime os elementos da lista
void imprime (Cadastro *l){
// variável auxiliar para percorrer a lista
Cadastro *p;
printf("\n\t\tElementos da Lista Encadeada\n\n");
for (p = l; p != NULL; p = p->prox){
printf("\t\t=====================================\n");
printf("\t\t Codigo: %d\n", p->codigo);
printf("\t\t Nome: %s\n", p->nome);
printf("\t\tNacionalidade: %s\n", p->nacionalidade);
printf("\t\t Estado civil: %s\n", p->estado_civil);
printf("\t\t=====================================\n");
}
printf("\n\t\tFim dos Elementos da Lista Encadeada\n");
}
// retorna 1 se vazia ou 0 se não vazia
int vazia (Cadastro *l){
return (l == NULL);
}
// busca um elemento na lista
Cadastro *busca (Cadastro *l, int v){
Cadastro *p;
for (p = l; p != NULL; p = p->prox)
if (p->codigo == v)
return p;
// não achou o elemento
return NULL;
}
// monta o menu do programa
void menu(){
printf("\n\t\t#### Programa Simula Lista Encadeada ####\n");
printf("\n\t\t1- Cria Lista Encadeada");
printf("\n\t\t2- Insere Elementos na Lista Encadeada");
printf("\n\t\t3- Imprime a Lista Encadeada");
printf("\n\t\t4- Pesquisa Elementos na Lista Encadeada");
printf("\n\t\t5- Exclui um Elemento da Lista Encadeada");
printf("\n\t\t6- Sair do Programa");
printf("\n\n\t\tDigite a opcao desejada: ");
}
// retira um elemento da lista
Cadastro *retira (Cadastro *l, int v){
Cadastro *marc;
// ponteiro para elemento anterior
Cadastro *ant = NULL;
// ponteiro para percorrer a lista
Cadastro *p = l;
// procura elemento na lista, guardando anterior
while (p != NULL && p->codigo != v) {
ant = p;
p = p->prox;
}
// verifica se achou elemento
if (p == NULL)
// não achou: retorna lista original
return l;
// retira elemento
if (ant == NULL){
// retira elemento do inicio
marc = p->prox;
}
else {
// retira elemento do meio da lista
ant->prox = p->prox;
marc = l;
}
free(p);
return marc;
}
/* ### Fim da declaração das funções do programa ### */
Pergunta
Bruno Pacheco
Meu código abaixo possui uma função excluir e ela não está funcionando. Por exemplo eu cadastro 5 elementos e ai eu tento excluir o terceiro elemento e acaba não dando certo. Porque? Como posso consertar a função excluir?
Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.