Ir ao conteúdo
  • Cadastre-se

Inserção ordenada em lista simplesmente encadeada


Ir à solução Resolvido por Ansi C,

Posts recomendados

Tô com um problema bem simples mas que está me dando dor de cabeça. Tô tentando fazer uma base de contatos em que cada contato seja um elemento de uma lista encadeada,cada contato tem nome,telefone e email. Eu já tinha uma lista pronta,o problema é que ela suportava apenas um caractere,e essa tem que armazenar nome,num e email. Tentei "converter" as listas, ela até está ordenando,porém o programa fecha ao final com uma mensagem de erro,o mesmo acontece se eu começo inserindo já ordenadamente( ex: Alana,Bruno). Não tenho tanta certeza,mas creio que o erro esteja na própria função de inserir. Obrigado desde já.

#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct lista_{    char nome[50];    char num[15];    char email[50];    struct lista_ *prox;} contato;contato *criar(contato dados){    contato *tmp;    tmp=(contato*)malloc(sizeof(contato));    fgets(dados.nome,50,stdin);    strcpy(tmp->nome,dados.nome);    /*fgets(dados.num,15,stdin);    strcpy(tmp->num,dados.num);    fgets(dados.email,50,stdin);    strcpy(tmp->email,dados.email);    tmp->prox=NULL; */    return tmp;}void imprimir(contato *cab){    contato *tmp;    tmp=cab;    while(tmp!=NULL){        printf("---------------------------");        printf("\n%s\n", tmp->nome);        //printf("%s \n", tmp->num);        //printf("%s \n", tmp->email);        printf("---------------------------");        tmp=tmp->prox;    }}void remover(contato *cab, contato dado){    contato *tmp = cab;    contato *ant;    while (tmp != NULL){        ant = tmp;        tmp = tmp->prox;        if (dado.nome == tmp->nome){            ant->prox = tmp->prox;            break;        }    }}void desalocar(contato **cab){    while(*cab!=NULL){        free(*cab);        *cab = (**cab).prox;    }}void insereordenado(contato **cab,contato *novo){    contato *tmp = *cab, *ant;    contato dado;    novo = criar(dado);    if (*cab == NULL)    {        *cab = novo;    }    else{        ant=NULL;        while ((tmp!=NULL) && strcmp(tmp->nome,novo->nome) < 0 ){            ant =tmp;            tmp =tmp->prox;        }        if (ant == NULL){            novo->prox = *cab;            *cab = novo;        }        else {            novo->prox = tmp;            ant->prox = novo;        }    }}void buscar(contato **cab,char *busca){    contato *elm = *cab;    int frag=0;    while(elm != NULL){        if (strcmp(elm->nome,busca) == 0){            frag =1;        }        elm = elm->prox;    }    if (frag==1){        printf("Achou!");    }    else{        printf("Não Achou!");    }}int main(){        contato *test = NULL;        insereordenado(&test,test);        insereordenado(&test,test);        insereordenado(&test,test);        insereordenado(&test,test);        system("cls");        imprimir (test);}
Link para o comentário
Compartilhar em outros sites

Cara tem uns negócios estranhos nesse código: 

void insereordenado(contato **cab, contato *novo) {    contato *tmp = *cab, *ant;    contato dado;    novo = criar(dado);    ...}
Você criou essa função insereOrdenado com dois parâmetros, no entanto logo na terceira linha você tá jogando fora o valor de "novo" e passando pra ele outro endereço.

Ou seja, se essa função tivesse apenas um parâmetro, ela seria exatamente igual. 

void insereordenado(contato **cab) {    contato *tmp = *cab, *ant, *novo;    contato dado;    novo = criar(dado);    ...}
A segunda coisa estranha: 

contato *criar(contato dados) {    contato *tmp;    tmp = (contato*)malloc(sizeof(contato));    fgets(dados.nome,50,stdin);    strcpy(tmp->nome,dados.nome);    ...    return tmp;}
Você tá armazenando uma string em dados.nome, em seguida copiando essa string pra tmp->nome e no final devolve tmp pro usuário.

Não seria mais simples armazenar a string direto em tmp->nome? 

contato *criar() {    contato *tmp;    tmp = (contato*)malloc(sizeof(contato));    fgets(tmp->nome,50,stdin);    ...    return tmp;}
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!