Ir para conteúdo

POWERED BY:

Arquivado

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

Selem Afonso

Inserir Ordenado em Lista Encadeada

Recommended Posts

Boa Tarde Galera fiz uma função pra inserir ordenado em minha lista principal, só que está dando pau... será que alguem pode me dar uma ajuda??? Essa é minha função:: void InsereLista (TipoLista *lista, TipoItem x) { apontador aux,inicio,troca,pos,p; aux = (apontador) malloc (sizeof(celula)); aux -> item = x; aux -> prox = NULL; lista -> ultimo = lista -> ultimo -> prox; if(Lvazia(lista)) { lista -> ultimo = aux; lista -> ultimo -> prox = NULL; } pos = lista -> primeiro; while (pos -> prox != NULL) { if (strcmp(aux ->item.nome,pos -> prox-> item.nome) > 0) { break; } pos = pos -> prox; } aux -> prox = pos -> prox; pos -> prox = aux; } Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

aí está meu programa completo!! obrigado#include <stdio.h> typedef struct celula_str *apontador; typedef struct { char nome [40]; char tel [20]; char mail [100]; int idade; } TipoItem; typedef struct celula_str { TipoItem item; apontador prox; } celula; typedef struct { TipoItem item; apontador primeiro; apontador ultimo; } TipoLista; void FLvazia (TipoLista *lista); int Lvazia (TipoLista *lista); void InsereLista (TipoLista *lista, TipoItem x); apontador pesquisa (TipoLista *lista, TipoItem x); void RemoveLista (TipoLista *lista, TipoItem *x, apontador p); void ImprimeLista (TipoLista *lista); void OrdenaDesc (TipoLista *lista); void OrdenaCres (TipoLista *lista); main () { TipoLista lista; TipoItem item; apontador p; int opc; FLvazia (&lista); do{ system ("cls"); if (Lvazia (&lista)) printf ("Lista Vazia!!\n"); printf ("BEM VINDO A SUA AGENDA\n"); printf ("\n::: MENU PRINCIPAL :::\n"); printf ("\n1.Inserir;\n2.Pesquisar;\n3.Remover;\n4.Imprimir;\n"); printf ("5.Sair.\n"); printf ("Opcao Desejada: "); scanf ("%d",&opc); switch (opc) { case 1: system ("cls"); printf ("Nome: "); fflush (stdin); gets (item.nome); printf ("Idade: "); scanf ("%d",&item.idade); printf ("Telefone: "); fflush (stdin); gets (item.tel); printf ("E-mail: "); fflush (stdin); gets (item.mail); InsereLista(&lista,item); break; case 2: system ("cls"); printf ("Nome: "); fflush (stdin); gets (item.nome); p = pesquisa (&lista,item); break; case 3: RemoveLista (&lista, &item, p); break; case 4: ImprimeLista (&lista); break; case 5: printf ("ADEUS !!!!\n"); system ("PAUSE"); break; default: printf("\nOPCAO INVALIDA!!\n"); system ("PAUSE"); break; } }while (opc!=5); } void FLvazia (TipoLista *lista) { lista -> primeiro = (apontador) malloc (sizeof(celula)); lista -> ultimo = lista -> primeiro; lista -> ultimo -> prox = NULL; } int Lvazia (TipoLista *lista) { return lista -> primeiro == lista -> ultimo; } void InsereLista (TipoLista *lista, TipoItem x) { apontador aux,inicio,troca,pos,p; aux = (apontador) malloc (sizeof(celula)); aux -> item = x; aux -> prox = NULL; lista -> ultimo = lista -> ultimo -> prox; if(Lvazia(lista)) { lista -> ultimo = aux; lista -> ultimo -> prox = NULL; } pos = lista -> primeiro; while (pos -> prox != NULL) { if (strcmp(aux ->item.nome,pos -> prox-> item.nome) > 0) { break; } pos = pos -> prox; } aux -> prox = pos -> prox; pos -> prox = aux; } apontador pesquisa (TipoLista *lista, TipoItem x) { apontador aux; aux = lista -> primeiro; while (aux -> prox != NULL) { if (strcmp(aux -> prox -> item.nome, x.nome) == 0) { printf ("Nome Encontrado!!\n"); system ("PAUSE"); return (aux); } aux = aux -> prox; } return (aux -> prox); } void RemoveLista (TipoLista *lista, TipoItem *x, apontador p) { apontador aux; if (Lvazia(lista)) return; aux = p -> prox; *x = aux -> item; p -> prox = aux -> prox; if (aux -> prox == NULL) lista -> ultimo = p; free (aux); } void ImprimeLista (TipoLista *lista) { apontador aux; int opc; system ("cls"); printf ("1.Ordem Crescente;\n2.Ordem Decrescente."); printf ("Opcao Desejada: "); scanf ("%d",&opc);/* if (opc == 1) { OrdenaCres (lista); } */ if (opc == 2) { OrdenaDesc (lista); } aux = lista -> primeiro -> prox; while(aux!=NULL) { printf ("Nome: "); puts (aux -> item.nome); printf ("Idade: %d\n",aux -> item.idade); printf ("Telefone: "); puts (aux -> item.tel); printf ("E-Mail: "); puts (aux -> item.mail); printf ("\n"); aux = aux -> prox; } system ("PAUSE"); } void OrdenaDesc (TipoLista *lista) { apontador i,j; TipoItem aux; i=lista->primeiro; while (i -> prox != NULL) { j= i -> prox; while(j != NULL) { if (strcmp(i->item.nome,j->item.nome) < 0) { aux = j -> item; j -> item = i -> item; i -> item = aux; } j = j-> prox; } i = i -> prox; } } /* void OrdenaCres (TipoLista *lista) { apontador i,j; TipoItem aux; i=lista->primeiro; while (i -> prox != NULL) { j= i -> prox; while(j != NULL) { if (strcmp(i->item.nome,j->item.nome) > 0) { aux = i -> item; i -> item = j -> item; j -> item = aux; } j = j-> prox; } i = i -> prox; } } */

Voce pode postar o código da struct lista pra gente?Antes de inserir qualquer elemento da lista voce inicializa a lista?Se sim, como?aguardo. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

aí estaá o meu código todo:: obrigado#include <stdio.h> typedef struct celula_str *apontador; typedef struct { char nome [40]; char tel [20]; char mail [100]; int idade; } TipoItem; typedef struct celula_str { TipoItem item; apontador prox; } celula; typedef struct { TipoItem item; apontador primeiro; apontador ultimo; } TipoLista; void FLvazia (TipoLista *lista); int Lvazia (TipoLista *lista); void InsereLista (TipoLista *lista, TipoItem x); apontador pesquisa (TipoLista *lista, TipoItem x); void RemoveLista (TipoLista *lista, TipoItem *x, apontador p); void ImprimeLista (TipoLista *lista); void OrdenaDesc (TipoLista *lista); void OrdenaCres (TipoLista *lista); main () { TipoLista lista; TipoItem item; apontador p; int opc; FLvazia (&lista); do{ system ("cls"); if (Lvazia (&lista)) printf ("Lista Vazia!!\n"); printf ("BEM VINDO A SUA AGENDA\n"); printf ("\n::: MENU PRINCIPAL :::\n"); printf ("\n1.Inserir;\n2.Pesquisar;\n3.Remover;\n4.Imprimir;\n"); printf ("5.Sair.\n"); printf ("Opcao Desejada: "); scanf ("%d",&opc); switch (opc) { case 1: system ("cls"); printf ("Nome: "); fflush (stdin); gets (item.nome); printf ("Idade: "); scanf ("%d",&item.idade); printf ("Telefone: "); fflush (stdin); gets (item.tel); printf ("E-mail: "); fflush (stdin); gets (item.mail); InsereLista(&lista,item); break; case 2: system ("cls"); printf ("Nome: "); fflush (stdin); gets (item.nome); p = pesquisa (&lista,item); break; case 3: RemoveLista (&lista, &item, p); break; case 4: ImprimeLista (&lista); break; case 5: printf ("ADEUS !!!!\n"); system ("PAUSE"); break; default: printf("\nOPCAO INVALIDA!!\n"); system ("PAUSE"); break; } }while (opc!=5); } void FLvazia (TipoLista *lista) { lista -> primeiro = (apontador) malloc (sizeof(celula)); lista -> ultimo = lista -> primeiro; lista -> ultimo -> prox = NULL; } int Lvazia (TipoLista *lista) { return lista -> primeiro == lista -> ultimo; } void InsereLista (TipoLista *lista, TipoItem x) { apontador aux,inicio,troca,pos,p; aux = (apontador) malloc (sizeof(celula)); aux -> item = x; aux -> prox = NULL; lista -> ultimo = lista -> ultimo -> prox; if(Lvazia(lista)) { lista -> ultimo = aux; lista -> ultimo -> prox = NULL; } pos = lista -> primeiro; while (pos -> prox != NULL) { if (strcmp(aux ->item.nome,pos -> prox-> item.nome) > 0) { break; } pos = pos -> prox; } aux -> prox = pos -> prox; pos -> prox = aux; } apontador pesquisa (TipoLista *lista, TipoItem x) { apontador aux; aux = lista -> primeiro; while (aux -> prox != NULL) { if (strcmp(aux -> prox -> item.nome, x.nome) == 0) { printf ("Nome Encontrado!!\n"); system ("PAUSE"); return (aux); } aux = aux -> prox; } return (aux -> prox); } void RemoveLista (TipoLista *lista, TipoItem *x, apontador p) { apontador aux; if (Lvazia(lista)) return; aux = p -> prox; *x = aux -> item; p -> prox = aux -> prox; if (aux -> prox == NULL) lista -> ultimo = p; free (aux); } void ImprimeLista (TipoLista *lista) { apontador aux; int opc; system ("cls"); printf ("1.Ordem Crescente;\n2.Ordem Decrescente."); printf ("Opcao Desejada: "); scanf ("%d",&opc);/* if (opc == 1) { OrdenaCres (lista); } */ if (opc == 2) { OrdenaDesc (lista); } aux = lista -> primeiro -> prox; while(aux!=NULL) { printf ("Nome: "); puts (aux -> item.nome); printf ("Idade: %d\n",aux -> item.idade); printf ("Telefone: "); puts (aux -> item.tel); printf ("E-Mail: "); puts (aux -> item.mail); printf ("\n"); aux = aux -> prox; } system ("PAUSE"); } void OrdenaDesc (TipoLista *lista) { apontador i,j; TipoItem aux; i=lista->primeiro; while (i -> prox != NULL) { j= i -> prox; while(j != NULL) { if (strcmp(i->item.nome,j->item.nome) < 0) { aux = j -> item; j -> item = i -> item; i -> item = aux; } j = j-> prox; } i = i -> prox; } }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso aqui funciona corretamente?

 

int Lvazia (TipoLista *lista){   return lista -> primeiro == lista -> ultimo;}

Amigo está bem confuso seu código, vou ter que estudar melhor e para atrapalhar um pouco mais o texto está vindo todo errado.

Outra coisa, é sempre bom o uso de comentário.

Vou tentar comentar a função que está com dúvidas.

 

void InsereLista (TipoLista *lista, TipoItem x){   apontador aux,inicio,troca,pos,p;   aux = (apontador) malloc (sizeof(celula)); // aloca memoria para aux   aux -> item = x; // prepara aux para ser inserido   aux -> prox = NULL;   lista -> ultimo = lista -> ultimo -> prox; // passa para o proximo elemento de lista   if(Lvazia(lista)) //verifica se a lista está vazia   {	  lista -> ultimo = aux; // ponteiro para ultimo recebe aux	  lista -> ultimo -> prox = NULL;  //isso é redundante, pois aux-> prox já aponta pta NULL   }   pos = lista -> primeiro; // pos recebe primeiro elemento da lista   while (pos -> prox != NULL) // faca equanto o proximo elemento é diferente de NULL   {	  if (strcmp(aux ->item.nome,pos -> prox-> item.nome) > 0) // sao diferentes?	  { 		 break; //sai do laço	  }	  pos = pos -> prox; // incrementa pos   }    aux -> prox = pos -> prox;    pos -> prox = aux;}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou apontar o porque do erro.

Eu não sei a lógica que voce está usando para desenvolver isso, portanto não posso resolver seu código.

Se tivesse que corrigi-lo ou entenderia sua lógica ou faria outra função.

 

A primeira vez que a função InsereLista é executada a saída de lista é:

 

lista -> ultimo = NULLlista -> ultimo -> prox = ninguém sabelista -> primeiro = NULLlista -> primeiro -> prox = elemento1

elemento1 significa os dados que voce digitou.

Na segunda inserção olha o que acontece:

 

lista -> ultimo = lista -> ultimo -> prox; // passa para o proximo elemento de lista

como voce pode ver acima

lista -> ultimo -> prox aponta para uma área da memória que voce não sabe qual é.

Por isso o erro.

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.