Ir para conteúdo
Fórum Script Brasil
  • 0

Lista encadeada - Inverter lista


RS25

Pergunta

Fazer uma função para inverter uma lista

Estou 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?

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

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 por N a T a N
Link para o comentário
Compartilhar em outros sites

  • 0

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 anterior

typedef 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 confuso

exemplo

lista* 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

Link para o comentário
Compartilhar em outros sites

  • 0
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 anterior

typedef 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 confuso

exemplo

lista* 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

Acho que isso é pra duplamente encadeada...

Link para o comentário
Compartilhar em outros sites

  • 0

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 lista

declara um *p_ant, e *p_prox, que são um apontadores temporarios

no primeiro elemento, você não faz nada, só armazena o valor do endereco dele em *p_ant

e passa pro proximo elemento com p=p->prox

nos 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_prox

deve funcionar!

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...