Ir para conteúdo

Arquivado

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

joaoviniciuss

[Resolvido] Bom pessoal, meu professor pediu um trabalho para lis

Recommended Posts

Bom pessoal, meu professor pediu um trabalho para listar invertido numa lista duplamente encadeada em C, mas não do conseguindo fazer, sera que alguem aki poderia me ajudar. Desde ja agradeço

 

Me perdoeem o flood, mas é que este trabalho eu preciso entregar hoje, e ja tentei fazer de todo jeito, to tentando com essa função

 

void list (no* L){	  no* aux; no* ant; for (aux=L;aux!=NULL;aux=aux->prox) for(ant=aux;ant!=NULL;ant=ant->prox)    {   printf ("\nCod = %d", aux->info.cod);   printf ("\nMarca = %s", aux->info.marca);   printf ("\nModelo = %s", aux->info.modelo);   printf ("\nAno de Fabricacao = %d",aux->info.anofab);   printf ("\nAno do Modelo = %d",aux->info.anomod);   printf ("\nValor = %f",aux->info.valor);   printf ("\n");  }}

se alguem puder me ajudar a arrumar eu agradeço, o meu maior problema, é q a lista ta exibindo assim:

 

Se eu cadastrar 5 elemetos, ela exibe cinco vezes o ultimo elemento.

 

Abaixo o prog completo, acima so a função que ta com problema

 

#include <stdlib.h>#include <stdio.h>#include <conio.h>#include <string.h>struct carro{int cod,anofab,anomod; char marca[50], modelo[50]; float valor;}; typedef struct carro carro;	   struct regno{ carro info; struct regno * prox; struct regno * ant;}; typedef struct regno no; carro lerdados (){ carro c; printf ("\nCodigo: "); fflush (stdin); scanf ("%d", & c.cod); printf ("Modelo: "); fflush (stdin); scanf ("%s", & c.modelo); printf ("Marca: "); fflush (stdin); scanf ("%s", & c.marca); printf ("Ano de Fabricacao: "); fflush (stdin); scanf ("%d", & c.anofab); printf ("Ano do Modelo: "); fflush (stdin); scanf ("%d", & c.anomod); printf ("Valor: "); fflush (stdin); scanf ("%f", & c.valor); return c;}int exibirmenu(){ int opcao; printf("\n1. Inserir\n"); printf("2. Listar\n"); printf("3. Verificar se existe conteudo\n"); printf("4. Buscar\n"); printf("5. Remover\n"); printf("6. Sair\n"); printf ("\nDigite uma opcao: "); fflush (stdin); scanf ("%d", & opcao); return opcao;}	   no * init (){ return NULL;}	   int isempty (no* L){ return (L==NULL);}	   void list (no* L){	  no* aux; no* ant; for (aux=L;aux!=NULL;aux=aux->prox) for(ant=aux;ant!=NULL;ant=ant->prox)    {   printf ("\nCod = %d", aux->info.cod);   printf ("\nMarca = %s", aux->info.marca);   printf ("\nModelo = %s", aux->info.modelo);   printf ("\nAno de Fabricacao = %d",aux->info.anofab);   printf ("\nAno do Modelo = %d",aux->info.anomod);   printf ("\nValor = %f",aux->info.valor);   printf ("\n");  }}no* add (no* L, carro c){ no* ant =NULL;	   no* aux=L;	 no* novo =(no*) malloc (sizeof (no)); novo->info.cod=c.cod; novo->info.anofab=c.anofab; novo->info.anomod=c.anomod; strcpy(novo->info.marca,c.marca); strcpy(novo->info.modelo,c.modelo); novo->info.valor=c.valor; novo->ant=NULL; if (L!=NULL)  L->ant=novo;  return novo;}	   no* find (no* L, int cod){ no* aux=L; while (aux != NULL) {  if (aux-> info.cod==cod)   return aux;  aux=aux->prox; } return NULL;} no* del (no* L, int cod){ no* aux = find (L, cod); if (aux==NULL) {  L=aux->prox;  if (L!= NULL)   L->ant=NULL;  free(aux);  return L; } else  {   aux->ant->prox=aux->prox;   if (aux->prox!=NULL)	aux->prox->ant=aux->ant;  } free (aux); return L;}	   no* destroy (no*L){ no*aux=L; while (aux->prox!=NULL) {  aux=aux->prox;  free(aux->ant); } free (aux); return NULL;}	   int main(){ no*L; no*aux; carro c; int opc,cod; system("cls"); L=init(); do {  opc=exibirmenu();  switch(opc)  {   case 1:c=lerdados();		  L=add(L,c);		  printf("\nCadastro efetuado com sucesso.\n");		  break;   case 2:list(L);		  printf("\n Lista feita com sucesso.\n");		  break;   case 3:if(isempty(L))		   printf("\n Lista vazia.\n");		  else		   printf("\n Lista nao vazia.\n");		  break;   case 4:printf("\n Informe o codigo:\n");		  scanf("%d",&cod);		  aux=find(L,cod);		  if(aux!=NULL)		  {		   printf("\n Codigo:%d ",aux->info.cod);		   printf("\n Marca: %s", aux->info.marca);		   printf("\n Modelo: %s", aux->info.modelo);		   printf("\n Ano: %s", aux->info.anofab);		   printf("\n Ano Modelo: %s", aux->info.anomod);		   printf("\n Valor: %f",aux->info.valor);		  }		  else		   printf("\n\n Codigo nao encontrado.\n");		  break;	case 5: printf("\nCodigo: ");			scanf("%d",&cod);			L=del(L,cod);			printf(" Codigo removido com sucesso.\n");			break;	case 6:printf(" Saindo.");		   L=destroy(L);		   break;	default: printf(" Opcao Invalida\n");		   break;   }  }while(opc!=6);   system("pause");   return 0;}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se é só listar, uma funcão recursiva resolve.

Tente assim:

 

int list (no* L){   no* aux;   no* ant;   if(L == NULL)	  return 0;   list(L->prox);   printf ("\nCod = %d", aux->info.cod);   printf ("\nMarca = %s", aux->info.marca);   printf ("\nModelo = %s", aux->info.modelo);   printf ("\nAno de Fabricacao = %d",aux->info.anofab);   printf ("\nAno do Modelo = %d",aux->info.anomod);   printf ("\nValor = %f",aux->info.valor);   printf ("\n");}

Teste e veja se funciona.

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se é só listar, uma funcão recursiva resolve.Tente assim:

int list (no* L){   no* aux;   no* ant;   if(L == NULL)	  return 0;   list(L->prox);   printf ("\nCod = %d", aux->info.cod);   printf ("\nMarca = %s", aux->info.marca);   printf ("\nModelo = %s", aux->info.modelo);   printf ("\nAno de Fabricacao = %d",aux->info.anofab);   printf ("\nAno do Modelo = %d",aux->info.anomod);   printf ("\nValor = %f",aux->info.valor);   printf ("\n");}
Teste e veja se funciona. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif
Bom, valew pela dica, mas so posso testar quando chegar em ksa, espero q essa função q você me passou liste INVERTIDO, caso não liste, você poderia postar alguma outra pra eu testar depois, é que so vou pra ksa as 4 da tardePor enquanto muito obrigado, e parabens pelo forum é muito bom.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, valew pela dica, mas so posso testar quando chegar em ksa, espero q essa função q você me passou liste INVERTIDO, caso não liste, você poderia postar alguma outra pra eu testar depois, é que so vou pra ksa as 4 da tardePor enquanto muito obrigado, e parabens pelo forum é muito bom.

Obrigado. http://forum.imasters.com.br/public/style_emoticons/default/grin.gif Voce pode fazer uma função que inverta o encadeamento da lista.Não é coisa tão simples de fazer, pois tem que ter muito cuidado para não se perder a referência.A dica é:o primeiro elemento será o último, então voce precisa apontar algo como:primeiro -> NULLa referencia pra quem ele está apontando poderá ser guardada em um ponteiro auxiliar.até o fim a lógica é:elemento atual -> auxaux -> elemento atualaté que chegue ao último elemento.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou ver se consigo fazer, o maiot problema é q ja to de cabeça quente com isso, e quando se fica assim, ai parece q nada da certo, mas pode deixar qualquer coisa aviso aqui, e Obrigado novamente.*EDITNo código da função List que postei la em cima, eu tentei andar com a variavel aux ate o ultimo elemento com aquele primeiro for, e depois no segundo for (for (aux=L;aux!=NULL;aux=aux->prox), peguei outra variavel e tentei voltar do ultimo ate o primeiro usando o ant (for(ant=aux;ant!=NULL;ant=ant->prox) , acho q esse ultimo prox deve ser trocado pelo ant, e pra não dar confusão trquei tb essa cariavel ant, por uma de nome inv, so pra não me confundir. Mas assim o prog não vai, vou tentar fazer o q você me disse, caso você ache alguma solução simples, oe menos complexa, eu agradeceria mais ainda.Se você puder me add no msn pra gente conversar direito joao_vinicius@msn.com

Compartilhar este post


Link para o post
Compartilhar em outros sites

Melhor tomar uma água e esquecer do problema um pouco. Devo ficar online aqui no fórum até as 18:00, se não conseguir resolver até esse horário posso te ajudar. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Vou ver se consigo fazer, o maiot problema é q ja to de cabeça quente com isso, e quando se fica assim, ai parece q nada da certo, mas pode deixar qualquer coisa aviso aqui, e Obrigado novamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Melhor tomar uma água e esquecer do problema um pouco. Devo ficar online aqui no fórum até as 18:00, se não conseguir resolver até esse horário posso te ajudar. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Vou ver se consigo fazer, o maiot problema é q ja to de cabeça quente com isso, e quando se fica assim, ai parece q nada da certo, mas pode deixar qualquer coisa aviso aqui, e Obrigado novamente.

Ok, vou realxar um poko, tenho q entregar esse trabalho hoje na facu, e saio de ksa as 18:30h, caso eu não consiga, não tem problema, falo pro professor q fiz o máximo q pude, valew

Compartilhar este post


Link para o post
Compartilhar em outros sites

void list (no* L)

{

no* aux;

no* ant;

for (aux=L;aux->prox!=NULL;aux=aux->prox)

for(ant=aux;ant!=NULL;ant=ant->prox)

{

printf ("\nCod = %d", aux->info.cod);

printf ("\nMarca = %s", aux->info.marca);

printf ("\nModelo = %s", aux->info.modelo);

printf ("\nAno de Fabricacao = %d",aux->info.anofab);

printf ("\nAno do Modelo = %d",aux->info.anomod);

printf ("\nValor = %f",aux->info.valor);

printf ("\n");

}

}

Cara resolvi o problema, da uma olhada no que ta escrito em vermelho no código, era isso q faltava, mo porcaria, e tava me dando o maior trabalho

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.