Ir para conteúdo
Fórum Script Brasil
  • 0

lista simples encadeada -Função excluir não funciona


Bruno Pacheco

Pergunta

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 ### */

Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...