Ir para conteúdo

POWERED BY:

Arquivado

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

ricardo gomes araujo

Inverter fila - recursividade

Recommended Posts

Pessoal,

 

Como eu faço a seguinte função

 

Implemente, utilizando apenas as funções da biblioteca fila.h, uma função que receba uma fila e a inverta

 

Biblioteca fila.h

 

struct lista {
   float info;
   struct lista* prox;
};
typedef struct lista Lista;

struct fila{
   Lista* ini;
   Lista* fim;
};
typedef struct fila Fila;

Fila* fila_cria(void) {
   Fila* f = (Fila*)malloc(sizeof(Fila));
   f->ini = f->fim = NULL;
   return f;
}

int fila_vazia (Fila* f) {
   return (f->ini == NULL);
}

void fila_insere (Fila* f, float v) {
   Lista* n = (Lista*)malloc(sizeof(Lista));
   n->info = v;
   n->prox = NULL;
   if (f->fim != NULL)
       f->fim->prox = n;
   else
       f->ini = n;
   f->fim = n;
}

float fila_retira (Fila* f) {
   Lista* t;
   float v;
   if(fila_vazia(f)) {
       printf("Fila vazia.\n");
       getch();
       exit(1);
   }
   t = f->ini;
   v = t->info;
   f->ini = t->prox;
   if (f->ini == NULL)
       f->fim = NULL;
   free(t);
   return v;
}

void fila_libera (Fila* f) {
   Lista* q = f->ini;
   while (q != NULL) {
       Lista* t = q->prox;
       free(q);
       q = t;
   }
   free(f);
}

void fila_imprime (Fila* f) {
   Lista* q;
   for (q = f->ini; q != NULL; q = q->prox)
       printf("%.1f\n", q->info);
}

 

Eu não estou conseguindo implementar esta função alguém poderia me ajudar?

 

 

fila.c

Fila* inverte_fila (Fila* E1){

Fila* f2 = fila_cria();
   Fila* f3 = fila_cria();
   Fila* f4 = fila_cria();
   fila_insere(f2, fila_retira(E1));
   fila_insere(f3, fila_retira(E1));
   fila_insere(f4, fila_retira(E1));

   fila_insere(f4, fila_retira(f3));
   fila_insere(f4, fila_retira(f2));
 return f4;
}

 

A função que eu criei e para valores fixos quero para valores não fixos

 

alguém poderia me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

int Inverter(Fila *inicio)
{
   Lista *aux_1,*aux_2,*aux_3;
   percorre=*inicio;
   if(percorre==NULL)
   {
       return 1;//Caso a lista esteja vazia.
   }
   else if(percorre->prox==NULL)
   {
       return 0;//Caso a lista tenha apenas um nó.
   }
   else
   {
       aux_1       = f->ini;        //O ponteiro aux_1 aponta para o primeiro nó, uma vez que o ponteiro "ini" passará a apontar para o último.
       aux_2       = aux_1->prox;    //O ponteiro aux_2 passa a apontar para o segundo nó da lista.
       aux_3       = aux_2->prox;    //O ponteiro aux_3 passa a apontar para o terceiro nó da lista.
       aux_1->prox = NULL;           //O primeiro nó da lista passa a ser o último, apontando para NULL.
       aux_2->prox = aux_1;          //O segundo nó da lista passa a apontar para o primeiro, começando a inversão da lista.
                                     //Início - Processo de inversão.
       while(aux_3!=NULL)
       {
           aux_1 = aux_2;             //O ponteiro aux_1 pega o valor do nó a sua frente na lista.
           aux_2 = aux_3;             //O ponteiro aux_2 pega o valor do nó a sua frente na lista.
           aux_3 = aux_3->prox;       //O ponteiro aux_3 pega o valor do nó a sua frente na lista.

           aux_2->prox=aux_1;         //O nó para o qual aux_p está apontado passa a apontar para o nó anterior a ele na lista.
       }
                                      //Fim - Processo de inversão.
       *inicio = aux_2;               // atualização do ponteiro de inicio
   }

   return 0;

}

 

Espero ter ajudado =D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Arieh

 

Deu erro dizendo que o percorre=*inicio; não esta declarado

 

#include <stdio.h>
#include <stdlib.h>
#include "fila.h" 

int inverter(Fila *inicio)
{

   Lista *aux_1,*aux_2,*aux_3;
   percorre=*inicio;
   if(percorre==NULL)
   {
       return 1;
   }
   else if(percorre->prox==NULL)
   {
       return 0;
   }
   else
   {
       aux_1= f->ini;       
       aux_2= aux_1->prox;    
       aux_3= aux_2->prox;    
       aux_1->prox = NULL;           
       aux_2->prox = aux_1;          

       while(aux_3!=NULL)
       {
           aux_1 = aux_2;             
           aux_2 = aux_3;            
           aux_3 = aux_3->prox;       

           aux_2->prox=aux_1;        
       }

       *inicio = aux_2;               
   }

   return 0;

}

main() 
{
   Fila* f1 = fila_cria();
   Fila* finverte;

   fila_insere(f1, 2.1);
   fila_insere(f1, 4.5);
   fila_insere(f1, 1.0);

   printf("********");
   printf("\n\nFila f1:\n");
   fila_imprime(f1);

   inverte_filas(f1);

   finverte = inverte_filas(f1);

   printf("\n\nFila invertida:\n"); 
   fila_imprime(finverte);

   fila_libera(f1);

   fila_libera(finverte);
   getch();
}


 

int Inverter(Fila *inicio)
{
   Lista *aux_1,*aux_2,*aux_3;
   percorre=*inicio;
   if(percorre==NULL)
   {
       return 1;//Caso a lista esteja vazia.
   }
   else if(percorre->prox==NULL)
   {
       return 0;//Caso a lista tenha apenas um nó.
   }
   else
   {
       aux_1       = f->ini;        //O ponteiro aux_1 aponta para o primeiro nó, uma vez que o ponteiro "ini" passará a apontar para o último.
       aux_2       = aux_1->prox;    //O ponteiro aux_2 passa a apontar para o segundo nó da lista.
       aux_3       = aux_2->prox;    //O ponteiro aux_3 passa a apontar para o terceiro nó da lista.
       aux_1->prox = NULL;           //O primeiro nó da lista passa a ser o último, apontando para NULL.
       aux_2->prox = aux_1;          //O segundo nó da lista passa a apontar para o primeiro, começando a inversão da lista.
                                     //Início - Processo de inversão.
       while(aux_3!=NULL)
       {
           aux_1 = aux_2;             //O ponteiro aux_1 pega o valor do nó a sua frente na lista.
           aux_2 = aux_3;             //O ponteiro aux_2 pega o valor do nó a sua frente na lista.
           aux_3 = aux_3->prox;       //O ponteiro aux_3 pega o valor do nó a sua frente na lista.

           aux_2->prox=aux_1;         //O nó para o qual aux_p está apontado passa a apontar para o nó anterior a ele na lista.
       }
                                      //Fim - Processo de inversão.
       *inicio = aux_2;               // atualização do ponteiro de inicio
   }

   return 0;

}

 

Espero ter ajudado =D

Compartilhar este post


Link para o post
Compartilhar em outros sites

int inverter(Fila *f) 
{ 

   Lista *percorre,*aux_1,*aux_2,*aux_3; //Esqueci de declarar o percorre
   percorre = f->ini; //Esqueci de colocar o f->ini no percorre
   if(percorre==NULL) 
   { 
       return 1; 
   } 
   else if(percorre->prox==NULL) 
   { 
       return 0; 
   } 
   else 
   { 
       aux_1 = f->ini;        
       aux_2 = aux_1->prox;     
       aux_3 = aux_2->prox;     
       aux_1->prox = NULL;            
       aux_2->prox = aux_1;           

       while(aux_3!=NULL) 
       { 
           aux_1 = aux_2;              
           aux_2 = aux_3;             
           aux_3 = aux_3->prox;        

           aux_2->prox=aux_1;         
       } 

       f->ini = aux_2;                
   } 

   return 0; 

} 

main()  
{ 
   Fila* f1 = fila_cria(); 
   //Na minha função, n necessita da finverte

   fila_insere(f1, 2.1); 
   fila_insere(f1, 4.5); 
   fila_insere(f1, 1.0); 

   printf("********"); 
   printf("\n\nFila f1:\n"); 
   fila_imprime(f1); 

   inverter(f1);

   printf("\n\nFila invertida:\n");  
   fila_imprime(f1); 

   fila_libera(f1); 
   //Tirei o finverte
   getch(); 
}

 

Desculpe pelos meus erros anteriores

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.