Ir para conteúdo

POWERED BY:

Arquivado

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

Bruno Pacheco

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

Recommended Posts

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou colar a mensagem do compilador: warning: the `gets' function is dangerous and should not be used.

 

E não use fflush(stdin). Tem um tópico sobre isso. Leia.

 

 

Reveja a inserção na lista:

 

Tecle <ENTER> para continuar

#### Programa Simula Lista Encadeada ####

 

1- Cria Lista Encadeada

2- Insere Elementos na Lista Encadeada

3- Imprime a Lista Encadeada

4- Pesquisa Elementos na Lista Encadeada

5- Exclui um Elemento da Lista Encadeada

6- Sair do Programa

 

Digite a opcao desejada: 2

 

Informe o novo codigo: 1

 

Informe o novo nome: qw

 

Informe a nacionalidade: as

 

Informe o estado civil: zx

 

Breakpoint 2, main () at cadastro.c:70

70 l = insere(l, num, nome, nacionalidade, estado_civil);

(gdb) p l

$1 = (Cadastro *) 0x0

Breakpoint 3, insere (l=0x0, i=1, nome=0xbfffeedc "qw", nacionalidade=0xbfffeec8 "as", estado_civil=0xbfffeeb9 "zx") at cadastro.c:149

149 Cadastro *novo = (Cadastro*) malloc(sizeof(Cadastro));

(gdb) c

Continuing.

 

Breakpoint 4, insere (l=0x0, i=1, nome=0xbfffeedc "qw", nacionalidade=0xbfffeec8 "as", estado_civil=0xbfffeeb9 "zx") at cadastro.c:156

156 return novo;

(gdb) p *novo

$2 = {codigo = 1, nome = "qw", '\0' <repeats 37 times>, nacionalidade = "as", '\0' <repeats 17 times>, estado_civil = "zx", '\0' <repeats 12 times>,

prox = 0x0}

Breakpoint 1, main () at cadastro.c:71

71 printf("\n\t\tElemento inserido na lista com sucesso!!!");

(gdb) c

Continuing.

 

Elemento inserido na lista com sucesso!!!

sh: cls: command not found

Tecle <ENTER> para continuar

#### Programa Simula Lista Encadeada ####

 

1- Cria Lista Encadeada

2- Insere Elementos na Lista Encadeada

3- Imprime a Lista Encadeada

4- Pesquisa Elementos na Lista Encadeada

5- Exclui um Elemento da Lista Encadeada

6- Sair do Programa

 

Digite a opcao desejada: 2

 

Informe o novo codigo: 2

 

Informe o novo nome: we

 

Informe a nacionalidade: sd

 

Informe o estado civil: xc

 

Breakpoint 2, main () at cadastro.c:70

70 l = insere(l, num, nome, nacionalidade, estado_civil);

(gdb) p l

$3 = (Cadastro *) 0x804b008

(gdb) p *l

$4 = {codigo = 1, nome = "qw", '\0' <repeats 37 times>, nacionalidade = "as", '\0' <repeats 17 times>, estado_civil = "zx", '\0' <repeats 12 times>,

prox = 0x0}

(gdb) p l[0]

$5 = {codigo = 1, nome = "qw", '\0' <repeats 37 times>, nacionalidade = "as", '\0' <repeats 17 times>, estado_civil = "zx", '\0' <repeats 12 times>,

prox = 0x0}

(gdb) c

Continuing.

 

Breakpoint 3, insere (l=0x804b008, i=2, nome=0xbfffeedc "we", nacionalidade=0xbfffeec8 "sd", estado_civil=0xbfffeeb9 "xc") at cadastro.c:149

149 Cadastro *novo = (Cadastro*) malloc(sizeof(Cadastro));

(gdb) c

Continuing.

 

Breakpoint 4, insere (l=0x804b008, i=2, nome=0xbfffeedc "we", nacionalidade=0xbfffeec8 "sd", estado_civil=0xbfffeeb9 "xc") at cadastro.c:156

156 return novo;

(gdb) p *novo

$6 = {codigo = 2, nome = "we", '\0' <repeats 37 times>, nacionalidade = "sd", '\0' <repeats 17 times>, estado_civil = "xc", '\0' <repeats 12 times>,

prox = 0x804b008}

(gdb) s

157 }

(gdb) s

 

Breakpoint 1, main () at cadastro.c:71

71 printf("\n\t\tElemento inserido na lista com sucesso!!!");

(gdb) p l

$7 = (Cadastro *) 0x804b060

(gdb) p *l

$8 = {codigo = 2, nome = "we", '\0' <repeats 37 times>, nacionalidade = "sd", '\0' <repeats 17 times>, estado_civil = "xc", '\0' <repeats 12 times>,

prox = 0x804b008}

(gdb) p l[0]

$9 = {codigo = 2, nome = "we", '\0' <repeats 37 times>, nacionalidade = "sd", '\0' <repeats 17 times>, estado_civil = "xc", '\0' <repeats 12 times>,

prox = 0x804b008}

(gdb) p l[1]

$10 = {codigo = 134993, nome = '\0' <repeats 39 times>, nacionalidade = '\0' <repeats 19 times>, estado_civil = '\0' <repeats 14 times>, prox = 0x0}

(gdb)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tudo bem eu vou rever a parte de inserção aqui e vou ver depois mas Só me responde por enquanto uma coisa a lógica estabelecida na função excluir está certa ou errada?

 

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

 

// exclui um elemento da lista
//int main()...

            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;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Refaça a inserção e deixe ela funcionando direito antes de pensar em excluir os dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.