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

Ajuda Para Entender Estrutura De Dados (pilhas, Filas E Listas)


hanndre

Pergunta

1 resposta a esta questão

Posts Recomendados

  • 0

Ei!

alguém pode mi ajudar a fazer uma função clonar fila?!?

Meu script é esse:

#include <stdlib.h>

#include <stdio.h>

#include <iostream>

#include <conio.h>

using namespace std;

#define MAX 100

typedef struct CelulaFila * Apontador;

/*Registro para armazenar os dados da fila*/

struct Dados

{

int CHAVE;

/* outros dados */

};

//Todo elemento da fila é um TipoCelula

struct CelulaFila

{

Dados REG;

Apontador PROX;

}TipoCelula;

//Uma fila é composta de um apontador para a frente da fila

//um tras para o final da fila e uma variável para armazenar seu tamanho.

struct Fila

{

Apontador FRENTE;

Apontador TRAS;

int TAMANHO;

};

/*Usado quando for criar ou destruir uma Fila*/

void FFvazia (Fila *p,Fila *c)

{

p->FRENTE = NULL;

p->TRAS = p->FRENTE;

p->TAMANHO = 0;

}

/*Verifica se a Fila esta vazia

poderia ser implementada perguntando se tamanho é igual a zero

*/

int vazia (Fila p)

{

return (p.FRENTE == NULL);

}

/*

Retorna o numero de elementos da Fila

*/

int tamanho (Fila p)

{

return (p.TAMANHO);

}

/*

Metodo que enfileira os dados em uma Fila

*/

void enfileirar (Dados reg, Fila *p)

{

Apontador aux; //apontador auxiliar

/*Criando a nova celula*/

aux = (Apontador) malloc (sizeof(TipoCelula));

//se não conseguiu alocar memória para o elemento da Fila

if(aux == NULL)

cout<<"Erro, sem memoria para enfileirar";

//aloca os dados na Fila

aux->REG = reg;

aux->PROX = NULL;

if(vazia(*p))

{

p->TRAS = aux;

p->FRENTE = p->TRAS;

}

else

{

p->TRAS->PROX = aux; //ligando a nova celula a fila

//Atualiza o TRAS

p->TRAS = aux;

}

//incrementa o numero de elementos da Fila

p->TAMANHO = p->TAMANHO + 1;

}

/*Desenfileira um elemento da Fila*/

void desenfileirar(Fila *p)

{

Apontador aux;

if (vazia (*p)) //se a Fila estiver vazia

cout<<"Erro! Fila Vazia!";

else

{

aux = p->FRENTE; //aux recebe o item a ser retirado da Fila

p->FRENTE = aux->PROX; //atualizamos o FRENTE

aux->PROX = NULL; //desliga a celula a ser removida

if(p->FRENTE==NULL)//colocar FRENTE e TRAS apontando para o mesmo lugar

p->TRAS = p->FRENTE;

free (aux); //liberamos o espaco de memória

p->TAMANHO = p->TAMANHO - 1; //diminuimos um elemento

}

}

/*Metodo para mostrar os elementos da Fila*/

void mostrar(Fila *p){

Apontador aux;

aux = p->FRENTE;

while(aux!=NULL){

cout<<aux->REG.CHAVE<<"\n";

aux = aux->PROX;

}

}

/*Metodo para clonar uma fila*/

void clonar(Dados reg, Fila *c, Fila *p){

Apontador aux;

Dados e;

if (vazia (*p)) //se a Fila estiver vazia

cout<<"Erro! Fila Vazia!";

else

{

aux = (Apontador) malloc (sizeof(TipoCelula));

aux = p->FRENTE; //aux recebe o item a ser retirado da Fila

e.CHAVE=aux;

//se não conseguiu alocar memória para o elemento da Fila

if(aux == NULL){

cout<<"Erro, sem memoria para enfileirar";

}

else{

//aloca os dados na Fila

aux->REG = e;

aux->PROX = NULL;

if(vazia(*c))

{

c->TRAS = aux;

c->FRENTE = c->TRAS;

}

else

{

c->TRAS->PROX = aux; //ligando a nova celula a fila

//Atualiza o TRAS

c->TRAS = aux;

}

//incrementa o numero de elementos da Fila

c->TAMANHO = c->TAMANHO + 1;

}

}

}

//Desempilha toda a fila!

void desenfileirartodos(Fila *p)

{

Apontador aux;

if (vazia (*p)) //se a Fila estiver vazia

cout<<"Erro! Fila Vazia!";

else

{

do{

aux = p->FRENTE; //aux recebe o item a ser retirado da Fila

p->FRENTE = aux->PROX; //atualizamos o FRENTE

aux->PROX = NULL; //desliga a celula a ser removida

if(p->FRENTE==NULL)//colocar FRENTE e TRAS apontando para o mesmo lugar

p->TRAS = p->FRENTE;

free (aux); //liberamos o espaco de memória

p->TAMANHO = p->TAMANHO - 1; //diminuimos um elemento

}while(!vazia (*p));

}

}

//-----------------------------------------------------------PROGRAMA PRINCIPAL

int main()

{

int op;

Dados d;

Fila p,c;

//criando a Fila

FFvazia(&p);

FFvazia(&c);

do{

system("cls");

cout<<"\n1-Enfileirar";

cout<<"\n2-Desenfileirar";

cout<<"\n3-Vazia";

cout<<"\n4-Fazer Vazia";

cout<<"\n5-Tamanho";

cout<<"\n6-Mostrar";

cout<<"\n7-Clonar";

cout<<"\n8-Desenfileirar Todos";

cout<<"\n9-Sair";

cout<<"\nDigite a sua opcao:" ;

cin>>op;

switch(op){

case 1:

cout<<"\nDigite uma chave: ";

cin>>d.CHAVE;

enfileirar(d,&p);

break;

case 2:

desenfileirar(&p);

cout<<"\nDesenfileirado!";

getch();

break;

case 3:

if(vazia(p))

cout<<"\nVazia!";

else

cout<<"\nExistem elementos!";

getch();

break;

case 4:

FFvazia(&p);

cout<<"Destruida!";

getch();

break;

case 5:

cout<<"\nTamanho: "<<tamanho(p);

getch();

break;

case 6:

mostrar(&p);

getch();

break;

case 7:

clonar(&p, &c);

cout<<"\nClonada!";

getch();

break;

case 8:

desenfileirartodos(&p);

cout<<"\nDesenfileirado Todos!";

getch();

break;

case 9:

cout<<"\n\t\t\t\tAdios Mutchatcho!\n\n\n\t\t";

system("PAUSE");

return EXIT_SUCCESS;

break;

default:

cout<<"opcao invalida!";

break;

}

}while(op!=7);

return 0;

}

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...