RS25 Postado Abril 13, 2011 Denunciar Share Postado Abril 13, 2011 Fazer uma função para inverter uma listaEstou com problemas para inverter uma lista#include <stdio.h> #include <stdlib.h> typedef struct lista { int info; struct lista* prox; } Lista; Lista* lista_cria() { return NULL; } Lista* lista_insere (Lista* l, int i) { Lista* novo = (Lista*) malloc(sizeof(Lista)); novo->info = i; novo->prox = l; return novo; } void lista_imprime (Lista* l) { Lista* p; /* variavel auxiliar para percorrer a lista */ for (p = l; p != NULL; p = p->prox) printf("info = %d\n", p->info); } /* função separa */ Lista* inverte (Lista* l) { Lista* p; /* variável auxiliar para percorrer a lista */ Lista* q; /* variável auxiliar para nova lista */ int aux; for (p = l; p != NULL; p = p->prox) if (p->info == NULL) { aux = p->prox; p->prox = NULL; return p; } } main() { Lista* l; int n; l = lista_cria(); l = lista_insere(l, 23); l = lista_insere(l, 45); l = lista_insere(l, 67); l = lista_insere(l, 89); l = lista_insere(l, 1011); printf("\nLista:\n"); lista_imprime(l); printf("\n***Invertendo a lista***\n"); Lista_inverte(l); printf("\nLista depois da inversao:\n"); lista_imprime(l); getch(); }Alguém poderia me ajudar? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 N a T a N Postado Abril 16, 2011 Denunciar Share Postado Abril 16, 2011 (editado) Consegui fazer compilar, fazendo algumas alterações na função inverte, e na chamada na main, mas não sei como inverter a lista.#include <stdio.h>#include <stdlib.h>typedef struct lista { int info; struct lista* prox;} Lista;Lista* lista_cria() { return NULL;}Lista* lista_insere (Lista* l, int i) { Lista* novo = (Lista*) malloc(sizeof(Lista)); novo->info = i; novo->prox = l; return novo;}void lista_imprime (Lista* l) { Lista* p; /* variavel auxiliar para percorrer a lista */ for (p = l; p != NULL; p = p->prox) printf("info = %d\n", p->info);}/* função separa */void inverte (Lista* l) { Lista* p; /* variável auxiliar para percorrer a lista */ Lista* q; /* variável auxiliar para nova lista */ q=lista_cria(); for (p = l; p != NULL; p = p->prox){ q=lista_insere(q,p->info); q=q->prox; }}main() { Lista* l; int n; l = lista_cria(); l = lista_insere(l, 23); l = lista_insere(l, 45); l = lista_insere(l, 67); l = lista_insere(l, 89); l = lista_insere(l, 1011); printf("\nLista:\n"); lista_imprime(l); printf("\n***Invertendo a lista***\n"); inverte(l); printf("\nLista depois da inversao:\n"); lista_imprime(l); getch(); }Pelo que a profer tinha ensinado, desse jeito, teria invertido a lista, mas, pelo visto não, anw, esperarei alguém com maior conhecimento passar aqui, até porque, só tive 2 aulas de lista até hoje... Editado Abril 16, 2011 por N a T a N Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 geleiask8 Postado Abril 20, 2011 Denunciar Share Postado Abril 20, 2011 Também sei pouco sobre listas encadeadas mas uma ideia que posso te dar é adicionar mais um campo na sua struct para armazenar o endereço do anteriortypedef struct lista { int info; struct lista* prox; struct lista* ant;} Lista;Ai você usa o for que você usou para imprimir armazenando o p numa lista auxiliar e passando esse p para o p ant do prox ! meio confusoexemplolista* invertelista (Lista *l){ lista* p lista* aux for (p = l; p != NULL; p = p->prox){ p->ant = aux; printf("info = %d\n", p->info); aux = p; } return p;}OBS: Caso você inverta a lista a função de impressão vai mudar, ao invés de usar p = p->prox no for usa-se o p = p->ant Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 N a T a N Postado Abril 20, 2011 Denunciar Share Postado Abril 20, 2011 Também sei pouco sobre listas encadeadas mas uma ideia que posso te dar é adicionar mais um campo na sua struct para armazenar o endereço do anteriortypedef struct lista { int info; struct lista* prox; struct lista* ant;} Lista;Ai você usa o for que você usou para imprimir armazenando o p numa lista auxiliar e passando esse p para o p ant do prox ! meio confusoexemplolista* invertelista (Lista *l){ lista* p lista* aux for (p = l; p != NULL; p = p->prox){ p->ant = aux; printf("info = %d\n", p->info); aux = p; } return p;}OBS: Caso você inverta a lista a função de impressão vai mudar, ao invés de usar p = p->prox no for usa-se o p = p->antAcho que isso é pra duplamente encadeada... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Felipe Amadio Postado Abril 27, 2011 Denunciar Share Postado Abril 27, 2011 Cara, é bem facil isso...não vou escrever em termos de linguagem c, porque tou enferrujado e não trabalho com listas encadeadas faz tempo, mas escrevo em portugues e você traduz pra c, ok?loop passando por toda a listadeclara um *p_ant, e *p_prox, que são um apontadores temporariosno primeiro elemento, você não faz nada, só armazena o valor do endereco dele em *p_ante passa pro proximo elemento com p=p->proxnos outros elementos,armazena o valor do p->prox do elemento atual em *p_prox, o p->prox do elemento atual vira o *p_ant, e passa ao proximo elemento com p = p_proxdeve funcionar! Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
RS25
Fazer uma função para inverter uma lista
Estou com problemas para inverter uma lista
Alguém poderia me ajudar?
Link para o comentário
Compartilhar em outros sites
4 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.