Double-chained list in C [closed]

4

Edited code I'm having trouble removing function

#include<stdio.h>
#include<stdlib.h>
#define MAX_NOME 50

typedef struct pessoa{
    char nome[MAX_NOME];
    int idade;

}Pessoa;

struct celula{
    Pessoa *conteudo;
    struct celula*ant;
    struct celula*seg;
};
typedef struct celula cel;
/*inseri entre a seguinte e null ou seja na ultima antes de null*/

void inserir(cel **lst, Pessoa *p){
     cel *nova;
     cel *aux;
     nova = (cel*)malloc(sizeof(cel*));
     nova->conteudo = p;
     nova->seg = NULL ;
     nova->ant = (*lst);



     if((*lst)->seg == NULL){
        (*lst)->seg=nova;

     }
     else{
        aux = (*lst)->seg;
        while(aux->seg != NULL){
            aux= aux->seg;
        }
        aux->seg=nova;
        nova->ant= aux;

     }


}
/* inseri entre lst  e a seguinte ou seja no inicio dps da cabeça*/

void inserir_inicio(cel **lst, Pessoa *p){
     cel *nova;
     nova = (cel*)malloc(sizeof(cel*));
     nova->conteudo = p;
     nova->seg = (*lst) ;
     nova->seg = (*lst)->seg;
     (*lst)->seg = nova;
     if(nova->seg !=NULL){
        nova->seg->ant=nova;
     }
}
void deletar( cel **lst){
   cel *p;
   p = (*lst);
   if((*lst)->seg ==NULL){
    printf("lista vazia");
   }
   else
    {
        p->seg->ant = lst;
        p->ant->seg = p->seg;
        free(p);
   }
}
void imprimir(cel*lst){
    cel*p;
    p = lst->seg;
    while(p != NULL){
        printf("%s  %d", p->conteudo->nome, p->conteudo->idade);
        p = p->seg;
    }
}



main(){
    cel*lst;

    lst = (cel*)malloc(sizeof(cel*));
    lst->seg = NULL;
    lst->ant = NULL;
    lst->conteudo = 0;

     Pessoa p1,p2,p3;

    p1.idade = 30;
    strcpy(p1.nome, "matheus");

    p2.idade = 18;
    strcpy(p2.nome, "mayara");

    p3.idade = 19;
    strcpy(p3.nome, "juca");

    int menu =1;
    while ( menu != 0)
    {
        printf(
        "\n-----------------------------------------------------\n"
        "Selecione opcao que deseja, veja nosso menu:\n"
        "-----------------\n"
        "0 - Sair \n"
        "1 - Inserir no Inicio\n"
        "3 - exibir \n"
        "2 - Inserir \n"
        "4 - Remover \n"
        "5 - Remover ini\n"
        "6 - Buscar \n"
        "-----------------\n"
        "0 - SAIR DO PROGRAMA.\n"
        "-----------------\n"
        );
        scanf("%d", &menu);
        switch (menu)
        {

            case 0:
                printf("Voce fechou.");
            break;
            case 1:
                 inserir(&lst,&p1);
                 inserir(&lst,&p2);
            break;
            case 2:
                 inserir_inicio(&lst, &p3);
                 inserir_inicio(&lst, &p2);

            break;
            case 3:
                imprimir(lst);

            break;
            case 4:
        deletar(lst);
                    break;
            case 5:

            break;
            case 6:


            break;
            default:
                printf("Opcao inexistente.");
             break;
            }
       }
}
    
asked by anonymous 27.09.2015 / 23:30

1 answer

5

To delete a node you must first get to it (this is something you would also need to do in a "fetch" function). Assuming your deletar function also receives a Pessoa as a parameter:

void deletar( cel **lst, Pessoa *pessoa){
   cel *p;
   p = (*lst);
   if((*lst)->seg ==NULL){
    printf("lista vazia");
   }
   else
    {
        /**** Acha a pessoa que quer deletar ****/
        while ( p != NULL && p->conteudo != pessoa )
            p = p->seg;
        if ( p == NULL ) {
            printf("a pessoa nao esta na lista");
            return;
        }

        /**** O resto do seu código está quase ok ****/
        if ( p->seg != NULL )
            p->seg->ant = p->ant;
        p->ant->seg = p->seg;
        free(p);
   }
}
  

Warning: I do not have much experience with C, this comparison of conteudo with pessoa may be incorrect (but the general idea is this), / em>.

For this to work, however, you must also correct a problem with your inserir_inicio function. Where do you do it:

nova->seg = (*lst) ;

Probably what you want is:

nova->ant = (*lst) ;

Otherwise, the ant of the new cell would be null, violating the double-chained list structure.

    
28.09.2015 / 01:23