Arrange search function in double-chained circular list

1

Is there a way to get the error? I have to search for the name of the person who is inserted in the list and the function remove this with a bug

vlw hug.

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>


#define MAX_NOME 50

typedef struct pes
{
    char nome[MAX_NOME];
    int num;
} pessoa;

typedef struct cel
{
    pessoa *conteudo;
    struct cel *seg;
    struct cel *ant;
} celula;

pessoa *CriaPessoa(char *nome, int num)
{
    pessoa *nova = (pessoa*) malloc(sizeof(pessoa));
    strcpy(nova->nome, nome);
    nova->num = num;

    return nova;
}


void Inserir(celula* p, pessoa *x)
{

    celula* elemento = (celula*) malloc (sizeof(celula));
    elemento->conteudo = x;

        elemento->seg = p->seg;
        elemento->ant = p;
        if(p->seg == p)
            p->ant = elemento;
        if(p->seg)
            p->seg->ant = elemento;
        p->seg = elemento;
        printf("inseriu %s\n", p->seg->conteudo->nome);
}

pessoa * Remover(celula* p)
{
    pessoa *aux = NULL;
    celula *rem = p;
    aux = p->conteudo;

    if(p->seg)
        p->seg->ant = p->ant;
    p->ant->seg = p->seg;

    free(rem);
    return aux;
}

celula * Buscar(celula *lista, char nome[])
{
    for(;lista->seg!=NULL;lista = lista->seg);
        if(lista->seg->conteudo->nome == nome)
                return nome;

    return NULL;


    }


void Imprime(celula *lista)
{
    printf("\n\n");
    celula *aux = lista;

    for( ;lista->seg!=aux; lista = lista->seg){/* lista->seg*/
            if(lista->seg->conteudo->nome)
                printf("nome: %s -- numero: %d\n", lista->seg->conteudo->nome, lista->seg->conteudo->num);
            else
                printf("Cabeca\n");
                system("pause");
        }
}



int main()
{
    celula *lista = (celula*) malloc( sizeof(celula));
    lista->seg = lista->ant = lista;

    Inserir(lista ,CriaPessoa("eduardo",10));
    Inserir(lista ,CriaPessoa("andrei",12));
    Inserir(lista ,CriaPessoa("luiz",13));
    Inserir(lista ,CriaPessoa("caio",14));
    Inserir(lista ,CriaPessoa("daniel",15));
    Inserir(lista ,CriaPessoa("joao",16));
    Inserir(lista ,CriaPessoa("pedro",17));

    Imprime(lista);
    celula *x = Buscar(lista, "pedro");
    printf("Achou %s na lista\n", x->conteudo->nome);
    /*Remover(x);*/

    Imprime(lista);
system("pause");
}
    
asked by anonymous 29.09.2015 / 06:32

1 answer

2

As I said @mgibsonbr, in the search function the return type and name verification were wrong.

celula *Busca(celula *lista, char nome[])
{
        celula *achado = NULL;
        celula *aux = lista;
        while(lista->seg != aux)
        {
                if(strcmp(lista->elemento->nome, nome) == 0)
                        achado = lista;
                lista = lista->seg;
        }
        return achado;
}

For removal it is important to check if the element to be removed is the first and update the value of the list in the main function.

celula *Remover(celula *lista, celula *p)
{
    celula *rem = p;

    if(lista == p)
        lista = p->seg;

    p->seg->ant = p->ant;
    p->ant->seg = p->seg;

    free(rem);
    return lista;
}

Main function.

celula *x = Buscar(lista, "pedro");
printf("Achou %s na lista\n", x->conteudo->nome);
lista = Remover(lista, x);

NOTE: The remove function is correct if the insert function is following the concept of double-threaded circular list correctly.

    
29.09.2015 / 16:25