Ir ao conteúdo
  • Cadastre-se

C++ Exercicio de fila em C++


Posts recomendados

Boa tarde, estou tentando fazer esse exercicio , mas estou tendo dificuldade, tem funções que travam o programa de vez e outras que o encerram abruptamente, poderiam me dizer o que está errado por favor, não consigo enxergam o que seja. Colei os 3 arquivos que estou usando.

#ifndef FILA_H_INCLUDED
#define FILA_H_INCLUDED
#include <list>
using namespace std;

class Fila {
    private:
        struct elemento {
            int valor;
            elemento *proximoElemento;
        };
        typedef elemento *PonteiroElemento;
        PonteiroElemento inicio;
        PonteiroElemento fim;
        int tamfila;

    public:
        list <int> listafila,listafilacopia;
        Fila();
        bool vazia();
        bool cheia();
        bool inserir(int x);
        bool remover(int &x);
        //implementar:
        bool primeiro(int &x);
        bool ultimo(int &x);
        bool esvaziar();
        int tamanho();
        bool inverter();
        //string listar();
        void listar();
        bool estaNaFila(int x);
        Fila* interseccao(Fila* auxFila);
        Fila* uniao(Fila* auxFila);
};
#include <cstdlib>
#include "Fila.h"
#include <list>



Fila::Fila() {
    inicio = NULL;
    fim = NULL;
    tamfila = 0;
}

bool Fila::vazia() {
    return (inicio == NULL);
}

bool Fila::cheia() {
    return false;
}

bool Fila::inserir(int x) {
    PonteiroElemento p;
    p = new elemento;
    p->valor = x;
    if (vazia()) {
        inicio = p;
        fim = p;
    } else {
        fim->proximoElemento = p;
        fim = p;
    }
    tamfila++;
    p->proximoElemento = NULL;
    listafila.push_back(x);
    return true;
}

bool Fila::remover(int &x) {
    PonteiroElemento p;
    if (vazia())
        return false;
    x = inicio->valor;
    p = inicio;
    inicio = inicio->proximoElemento;
    delete p;
    tamfila--;
    if (inicio == NULL)
        fim = NULL;
    return true;
}


bool Fila::primeiro(int &x) {
	// caso a lista esteja vazia retornar falso
	// retornar em x o valor do primeiro elemento da lista
	// seu código aqui:


   x = inicio->valor;
   return true;
}

bool Fila::ultimo(int &x) {
	// caso a lista esteja vazia retornar falso
	// retornar em x o valor do último elemento da lista
	// seu código aqui:

    x = fim->valor;
    return true;

}

bool Fila::esvaziar() {
	// caso a lista esteja vazia retornar falso
	// remover todos os elementos da lista
	// seu código aqui:
    PonteiroElemento p;
    if (vazia())
        return false;
    p = inicio;
    while(p != NULL){
       p = inicio;
       inicio = inicio->proximoElemento;
       delete p;
    }

    while(!listafila.empty()){
        listafila.pop_front();
    }

    if (inicio == NULL)
        fim = NULL;
    return true;

}

int Fila::tamanho() {
	// retornar o tamanho da lista, 0 se estiver vazia
	// seu código aqui:

    return tamfila;

}

bool Fila::inverter() {
	// caso a lista esteja vazia retornar falso
	// inverter a ordem dos elementos da lista
	// seu código aqui:
    listafilacopia = listafila;
	if(vazia()){return false;}
    else{
      Fila* reverter = new Fila();
      while(!listafilacopia.empty()){
      reverter->inserir(listafilacopia.back());
      }

      esvaziar();
      PonteiroElemento r = reverter->inicio;
      while(r != NULL){
         inserir(r->valor);
         r = r->proximoElemento;
      }

      return true;
    }

}

//string
void Fila::listar() {
	// retornar string com todos os elementos da lista separados por ;
	// exemplo: 1 ; 3 ; 5
	// string vazia se a lista estiver vazia
	// seu código aqui:
    string aux = "";

    //if(vazia()){
    //    aux = "Fila Vazia";
    //}else{
    PonteiroElemento p;
    p = inicio;
    while(p != NULL){
        aux = aux + to_string(p->valor) + " ; ";

    }
    cout << aux;
  //  }

    //return aux;


}

bool Fila::estaNaFila(int x) {
	// retornar verdadeiro caso o valor x seja localizado na fila
	// seu código aqui:
    PonteiroElemento aux;
    aux = inicio;
    bool achou = false;

    while(aux != NULL || achou != true){
     if(aux->valor == x){
        achou = true;
     }
     aux = aux->proximoElemento;
    }
    if(achou){return true;}else{return false;}


}

Fila* Fila::interseccao(Fila* auxFila) {
	// retornar objeto Fila contendo a intersecção com a lista atual
	// elementos em comum com as 2 listas
	// sem repetição de elementos
	// seu código aqui:
    listafilacopia = listafila;
    Fila *intersec = new Fila();
    PonteiroElemento in = auxFila->inicio;
    PonteiroElemento aux = inicio;
    while(in != NULL){
        while(aux != NULL){
            if(aux->valor == in->valor){
              while(!listafilacopia.empty()){
                if(aux->valor != listafilacopia.front()){
                 intersec->inserir(aux->valor);
                 }
                 listafilacopia.pop_front();
              }
            }
            aux = aux->proximoElemento;
        }
        in = in->proximoElemento;
    }

   return intersec;

}

Fila* Fila::uniao(Fila* auxFila) {
	// retornar objeto Fila contendo a união com a lista atual
	// elementos das 2 listas
	// sem repetição de elementos
	// seu código aqui:

	Fila *uniao = new Fila();
	PonteiroElemento un = inicio;
	while(un != NULL){
      uniao->inserir(un->valor);
      un = un->proximoElemento;
	}

	PonteiroElemento af = auxFila->inicio;
	while(af != NULL){
        uniao->inserir(af->valor);
        af = af->proximoElemento;
	}

	return uniao;

}


#include <iostream>
#include "Fila.cpp"
#include <exception>

using namespace std;

int main()
{
    int fazer,el,removido,pri,ult,pesquisa;
    Fila *principal = new Fila();
    Fila *inter = new Fila();
    Fila *uni = new Fila();
    Fila *teste = new Fila();

    teste->inserir(1);teste->inserir(4);teste->inserir(20);teste->inserir(8);
    teste->inserir(100);teste->inserir(223);teste->inserir(1000);teste->inserir(12);

    do{
    cout << "Tarefa D Estrutura de dados\n" << endl;
    cout << "Menu*******\n\n";
    cout << "O que deseja fazer?\n";
    cout << "1 - Inserir elementos na fila\n";
    cout << "2 - Remover elementos da fila\n";
    cout << "3 - Ver primeiro elemento da fila\n";
    cout << "4 - Ver ultimo elemento da fila\n";
    cout << "5 - Esvaziar toda fila\n";
    cout << "6 - Ver tamanho da fila\n";
    cout << "7 - Inverter ordem da fila\n";
    cout << "8 - Listar elementos da fila\n";
    cout << "9 - Pesquisar valor\n";
    cout << "10 - Interseccao lista\n";
    cout << "11 - Uniao lista\n";
    cout << "12 - Mostrar fila principal\n";
    cout << "13 - Sair\n\n";
    cin >> fazer;
    if(fazer < 1||fazer > 12){fazer = 13;}

    switch(fazer){
    case 1: {
    cout << "\n\nInserir elemento: "; cin >> el;

    try{
    if(principal->inserir(el)){
        cout << "Elemento " << el << " inserido\n\n";
    }else{cout << "Elemento " << el<< " nao inserido\n\n";}


    }catch(exception& excp){
        cout << "\nErro: " << excp.what() << endl;
    }

    system("pause");
    break;
    }

    case 12:{//Mostar fila principal
    cout << "\nFila principal:\n";
    try{
    if(!principal->vazia()){
    principal->listar();
    cout << endl << endl;
    }else{cout << "\nLista principal vazia\n\n";}

    }catch(exception& excp){
       cout << "\nErro: " << excp.what() << endl;
    }

    system("pause");
    break;
    }

    case 2: {
    try{
    if(!principal->vazia()){
      if(principal->remover(removido)){
        cout << "\n\nElemento " << removido << " removido com sucesso\n\n";
      }else{cout << "\n\nElemento" << removido << " nao removido\n\n";}
    }else{
       cout << "\nFila vazia!\n\n";
    }
    }catch(exception& excp){
        cout << "\nErro: " << excp.what() << endl;
    }


    system("pause");
    break;
    }

    case 3: {//Primeiro elemento

    try{
     if(!principal->vazia()){
      if(principal->primeiro(pri)){
          cout << "\n\nPrimeiro elemento e " << pri << endl << endl;
      }else{cout << "\n\nHouve erro\n\n";}
     }else{cout << "\nFila Vazia!\n\n";}
    }catch(exception& excp){
        cout << "\nErro: " << excp.what() << endl;
    }

    system("pause");
    break;
    }

    case 4: {//Ultimo elemento

    try{

    if(!principal->vazia()){
    if(principal->ultimo(ult)){
        cout << "\n\nUltimo elemento e " << ult << endl << endl;
    }else{cout << "\n\nHouve erro\n\n";}
    }else{cout << "\nFila Vazia!\n\n";}

    }catch(exception& excp){
        cout << "\nErro: " << excp.what() << endl;
    }

    system("pause");
    break;
    }

    case 5: {//Esvaziar fila
    try{

    if(!principal->vazia())  {
    if(principal->esvaziar()){cout << "\n\nFila esvaziada\n\n";}
    else{cout << "\n\nHouve erro\n\n";}
    }else{cout << "\nFila ja Vazia!\n\n";}
    }catch(exception& excp){
        cout << "\nErro: " << excp.what() << endl;
    }

    system("pause");
    break;
    }

    case 6: {//Ver tamanho da fila

    try{
    int tam = principal->tamanho();

    cout << "\n\nLista tem " << tam << " elementos\n\n";

    }catch(exception& excp){
        cout << "\nErro: " << excp.what() << endl;
    }

    system("pause");
    break;
    }

    case 7: {//Inverter ordem

    try{

    if(!principal->vazia()){
    principal->inverter();
    if (principal->inverter()){
        cout << "\nOrdem invertida da fila\n";
        principal->listar();
    }
    }else{cout << "\nFila Vazia!\n\n";}

    }catch(exception& excp){
        cout << "\nErro: " << excp.what() << endl;
    }

    system("pause");
    break;
    }

    case 8: {//Listar elementos

    try{
    cout << "\n\nElementos da fila\n";
    principal->listar();

    }catch(exception& excp){
        cout << "\nErro: " << excp.what() << endl;
    }

    system("pause");
    break;
    }

    case 9: {//Pesquisar valor

    try{

    if(!principal->vazia()){
    cout << "\n\nPesquisar qual valor inteiro: ";cin >> pesquisa;
    if(principal->estaNaFila(pesquisa)){
      cout << "\n\nElemento " << pesquisa << " se encontra na fila\n\n";
    }else{
      cout << "\n\nNao se encontra na fila\n\n";
    }
    }else{cout << "\nFila Vazia!\n\n";}

    }catch(exception& excp){
        cout << "\nErro: " << excp.what() << endl;
    }

    system("pause");
    break;
    }

    case 10: {//Intersecção
    string filainter;
    try{



    if(!principal->vazia()){
    inter = principal->interseccao(teste);

    cout << "\n\nInterseccao\n" << endl;

    inter->listar();
    cout << endl;
    }else{cout << "\nFila Vazia!\n\n";}


    }catch(exception& excp){
        cout << "\nErro: " << excp.what() << endl;
    }

    system("pause");
    break;
    }

    case 11: {//União

    try{
    if(!principal->vazia()){
    string filauniao;
    uni = principal->uniao(teste);


    cout << "\n\nUniao das listas: " << endl;
    uni->listar();

    cout  << endl<< endl;
    }else{
       cout << "\n\nFila auxiliar: " << endl;

       teste->listar();

       cout << endl;
    }
    }catch(exception& excp){
        cout << "\nErro: " << excp.what() << endl;
    }

    system("pause");
    break;
    }

    }

     system("cls");

    }while(fazer != 13);
    return 0;
}


  
  

 

Link para o comentário
Compartilhar em outros sites

45 minutos atrás, Diego Dreossi disse:

#include <list>

 

Se vai usar a classe list então use os métodos certos, os de list.

 

Você escreveu um programa em C. Não consegui entender o que quer fazer.

 

    #include <cstdlib>

 

porque esse include? Evite a todo custo usar bibliotecas C

 

45 minutos atrás, Diego Dreossi disse:

#include <iostream>
#include "Fila.cpp"
#include <exception>

 

Não faça isso.

 

Inclua o HEADER. Passa isso é criado. 

 

E use todos os #include <> ANTES dos #include "" 

Nem todos seus programas vão ser assim tão simples e pode haver dependências nos user includes que precisam dos system includes antes...

Link para o comentário
Compartilhar em outros sites

Eu estou fazendo o exercicio pro meu curso, eu coloquei list para facilitar a inversão dos elementos na fila. Eu recorrigi conforme o seu comentario, está dando algum erro no listar(), cuja finalidade é mostrar os elementos, quando a função é chamada no switch o cursor trava na tela, ele pisca mas fica travado, voce tem ideia de como consertar?

 

Link para o comentário
Compartilhar em outros sites

@Diego Dreossi poste  código como esta agora.

 

Se você PODE MESMO usar list nesse problema use os métodos de list como eu disse. Se não pode tire o #include e use seus métodos. Se a sua Fila é uma fila de int em C++ você só declara isso. Não precisa de mais nada. E se precisa você deriva list. Como faria em java ou Python ou qualquer dessas linguagens que tem classes.

 

class Fila
{
	private:
		list<int> minha_lista;
          
    public:
          // os metodos, inclusive o (s) construtor (es)...

};

 

Use o #include certo. o header

 

 

 

 

 

 

 

Link para o comentário
Compartilhar em outros sites

bool Fila::estaNaFila(int x) {
	// retornar verdadeiro caso o valor x seja localizado na fila
	// seu código aqui:
    PonteiroElemento aux;
    aux = inicio;
    bool achou = false;

    while(aux != NULL || achou != true){
     if(aux->valor == x){
        achou = true;
     }
     aux = aux->proximoElemento;
    }
    if(achou){return true;}else{return false;}


}
case 9: {//Pesquisar valor

    try{

    if(!principal->vazia()){
    cout << "\n\nPesquisar qual valor inteiro: ";cin >> pesquisa;
    if(principal->estaNaFila(pesquisa)){
      cout << "\n\nElemento " << pesquisa << " se encontra na fila\n\n";
    }else{
      cout << "\n\nNao se encontra na fila\n\n";
    }
    }else{cout << "\nFila Vazia!\n\n";}

    }catch(exception& excp){
        cout << "\nErro: " << excp.what() << endl;
    }

    system("pause");
    break;
    }

Nessa parte de pesquisar valor quando um determinado valor não se encontra na fila ele encerra automaticamente o programa em vez de escrever cout << "\n\nNao se encontra na fila\n\n";, voce consegue enxergar o problema?

Link para o comentário
Compartilhar em outros sites

29 minutos atrás, Diego Dreossi disse:

Nessa parte de pesquisar valor quando um determinado valor não se encontra na fila ele encerra automaticamente o programa em vez de escrever cout << "\n\nNao se encontra na fila\n\n";, voce consegue enxergar o problema?

 

Poste o código completo. é o simples. Talvez ninguém tenha tempo de pegar a versão anterior de seu programa e depois inserir essa parte alterada e aí testar. Ou mesmo ler os dois códigos fora de contexto...

 

class Fila {
private:
    struct elemento {
        int valor;
        elemento* proximoElemento;
    };
    typedef elemento* PonteiroElemento;
    PonteiroElemento inicio;
    PonteiroElemento fim;
    int tamfila;
  // ...

 

 

  • Como eu te disse, não se escreve isso usando <list>. Não faz sentido. Esse que escreveu é um programa em C. Se não pode mesmo usar <list> e já te perguntei isso, então entenda que deve criar uma classe de acordo.
  • Uma lista não é um elemento nem um elemento é uma lista. Uma lista tem nós e os nós tem um elemento. E dentro do Elemento tem um campo que é a chave. No seu caso como só tem um int o elemento é a chave...
  • evite a todo custo criar typedef para ponteiros. Não é esperto. C e C++ já resolveram isso há décadas: um ponteiro tem um asterisco.
  • evite typedef em C++. Nunca é necessário. C++ não é C.

 

Sobre esse seu código

 

bool Fila::estaNaFila(int x) {
    // retornar verdadeiro caso o valor x seja localizado na fila
    // seu código aqui:
    PonteiroElemento aux;
    aux = inicio;
    bool achou = false;

    while (aux != NULL || achou != true) {
        if (aux->valor == x) {
            achou = true;
        }
        aux = aux->proximoElemento;
    }
    if (achou) { return true; }
    else { return false; }
}

 

Isso

    if(achou){return true;}else{return false;}

é o mesmo que isso:
 

	return achou;

 

prefira o simples.

 

Sobre essa condição

    while (aux != NULL || achou != true) {

 

considerando que achou começa com false acha que seu programa vai entrar nesse loop? Não vai. || significa ou.

 

 

Link para o comentário
Compartilhar em outros sites

Boa noite, consegui terminar, muito obrigado pela sua ajuda, tirei os list mesmo e substitui por vetores.

#include <iostream>
#include <exception>
#include "Fila.cpp"
#include "Fila.h"


using namespace std;

int main()
{
    int fazer,el,removido,pri,ult,pesquisa;
    Fila *principal = new Fila();
    Fila *inter = new Fila();
    Fila *uni = new Fila();
    Fila *teste = new Fila();


    teste->inserir(1);teste->inserir(4);teste->inserir(20);teste->inserir(8);
    teste->inserir(100);teste->inserir(223);teste->inserir(1000);teste->inserir(12);

    do{
    cout << "Tarefa D Estrutura de dados\n" << endl;
    cout << "Menu*******\n\n";
    cout << "O que deseja fazer?\n";
    cout << "1 - Inserir elementos na fila\n";
    cout << "2 - Remover elementos da fila\n";
    cout << "3 - Ver primeiro elemento da fila\n";
    cout << "4 - Ver ultimo elemento da fila\n";
    cout << "5 - Esvaziar toda fila\n";
    cout << "6 - Ver tamanho da fila\n";
    cout << "7 - Inverter ordem da fila\n";
    cout << "8 - Listar elementos da fila\n";
    cout << "9 - Pesquisar valor\n";
    cout << "10 - Interseccao lista\n";
    cout << "11 - Uniao lista\n";
    cout << "12 - Sair\n\n";
    cin >> fazer;
    if(fazer < 1||fazer > 11){fazer = 12;}

    switch(fazer){
    case 1: {
    cout << "\n\nInserir elemento: "; cin >> el;

    try{
    if(principal->inserir(el)){
        cout << "Elemento " << el << " inserido\n\n";
    }else{cout << "Elemento " << el<< " nao inserido\n\n";}


    }catch(exception& excp){
        cout << "\nErro: " << excp.what() << endl;
    }

    system("pause");
    break;
    }

    case 8:{//Mostar fila principal
    cout << "\nFila principal:\n";
    try{
    if(!principal->vazia()){
    cout << principal->listar();
    cout << endl << endl;
    }else{cout << "\nLista principal vazia\n\n";}

    }catch(exception& excp){
       cout << "\nErro: " << excp.what() << endl;
    }

    system("pause");
    break;
    }

    case 2: {
    try{
    if(!principal->vazia()){
      if(principal->remover(removido)){
        cout << "\n\nElemento " << removido << " removido com sucesso\n\n";
      }else{cout << "\n\nElemento" << removido << " nao removido\n\n";}
    }else{
       cout << "\nFila vazia!\n\n";
    }
    }catch(exception& excp){
        cout << "\nErro: " << excp.what() << endl;
    }


    system("pause");
    break;
    }

    case 3: {//Primeiro elemento

    try{
     if(!principal->vazia()){
      if(principal->primeiro(pri)){
          cout << "\n\nPrimeiro elemento e " << pri << endl << endl;
      }else{cout << "\n\nHouve erro\n\n";}
     }else{cout << "\nFila Vazia!\n\n";}
    }catch(exception& excp){
        cout << "\nErro: " << excp.what() << endl;
    }

    system("pause");
    break;
    }

    case 4: {//Ultimo elemento

    try{

    if(!principal->vazia()){
    if(principal->ultimo(ult)){
        cout << "\n\nUltimo elemento e " << ult << endl << endl;
    }else{cout << "\n\nHouve erro\n\n";}
    }else{cout << "\nFila Vazia!\n\n";}

    }catch(exception& excp){
        cout << "\nErro: " << excp.what() << endl;
    }

    system("pause");
    break;
    }

    case 5: {//Esvaziar fila
    try{

    if(!principal->vazia())  {
    if(principal->esvaziar()){cout << "\n\nFila esvaziada\n\n";}
    else{cout << "\n\nHouve erro\n\n";}
    }else{cout << "\nFila ja Vazia!\n\n";}
    }catch(exception& excp){
        cout << "\nErro: " << excp.what() << endl;
    }

    system("pause");
    break;
    }

    case 6: {//Ver tamanho da fila

    try{
    int tam = principal->tamanho();

    cout << "\n\nLista tem " << tam << " elementos\n\n";

    }catch(exception& excp){
        cout << "\nErro: " << excp.what() << endl;
    }

    system("pause");
    break;
    }

    case 7: {//Inverter ordem

    try{

    if(!principal->vazia()){
    //principal->inverter();
    if (principal->inverter()){
        cout << "\nOrdem invertida da fila\n";
        //principal->listar();
    }
    }else{cout << "\nFila Vazia!\n\n";}

    }catch(exception& excp){
        cout << "\nErro: " << excp.what() << endl;
    }

    system("pause");
    break;
    }



    case 9: {//Pesquisar valor

    try{

    switch(!principal->vazia()){
    case true:{
    cout << "\n\nPesquisar qual valor inteiro: ";cin >> pesquisa;

    if(principal->estaNaFila(pesquisa)){
      cout << "\n\nElemento " << pesquisa << " se encontra na fila\n\n";
    }else{
      cout << "\n\nNao se encontra na fila\n\n";
    }


    system("pause");
    break;
    }

    case false:{
    cout << "\nFila Vazia!\n\n";

    system("pause");
    break;
    }
    }

    }catch(exception& excp){
        cout << "\nErro: " << excp.what() << endl;
    }

    //system("pause");
    break;
    }

    case 10: {//Intersecção
    string filainter;
    try{



    if(!principal->vazia()){
    inter = principal->interseccao(teste);

    if(inter == NULL){cout << "\n\nNao ha interseccao nas filas\n\n";}
    else{
    cout << "\n\nInterseccao\n" << endl;

    cout << inter->listar();
    cout << endl << endl;


    }
    }else{cout << "\nFila Vazia!\n\n";}


    }catch(exception& excp){
        cout << "\nErro: " << excp.what() << endl;
    }

    system("pause");
    break;
    }

    case 11: {//União

    try{
    if(!principal->vazia()){
    string filauniao;
    uni = principal->uniao(teste);


    cout << "\n\nUniao das listas: " << endl;
    cout << uni->listar() << endl << endl;

    cout  << endl<< endl;

    }else{
       cout << "\n\nFila auxiliar: " << endl;

       cout << teste->listar() << endl << endl;

       cout << endl;
    }
    }catch(exception& excp){
        cout << "\nErro: " << excp.what() << endl;
    }

    system("pause");
    break;
    }

    }

     system("cls");

    }while(fazer != 12);
    return 0;
}
#ifndef FILA_H_INCLUDED
#define FILA_H_INCLUDED
#include <list>
#define MAX 20

using namespace std;

class Fila {
    private:
        struct elemento {
            int valor;
            elemento *proximoElemento;
        };
        typedef elemento *PonteiroElemento;
        PonteiroElemento inicio;
        PonteiroElemento fim;
        int tamfila;
        int listafila[MAX],listafilacopia[MAX];
    public:

        Fila();
        bool vazia();
        bool cheia();
        bool inserir(int x);
        bool remover(int &x);
        //implementar:
        bool primeiro(int &x);
        bool ultimo(int &x);
        bool esvaziar();
        int tamanho();
        bool inverter();
        string listar();
        //void listar();
        bool estaNaFila(int x);
        Fila* interseccao(Fila* auxFila);
        Fila* uniao(Fila* auxFila);
};


#endif // FILA_H_INCLUDED
#include <list>
#include "Fila.h"


Fila::Fila() {
    inicio = NULL;
    fim = NULL;
    tamfila = 0;
}

bool Fila::vazia() {
    return (inicio == NULL);
}

bool Fila::cheia() {
    return false;
}

bool Fila::inserir(int x) {
    PonteiroElemento p;
    p = new elemento;
    p->valor = x;
    if (vazia()) {
        inicio = p;
        fim = p;
    } else {
        fim->proximoElemento = p;
        fim = p;
    }
    tamfila++;
    p->proximoElemento = NULL;
    //listafila[tamfila-1] = x;
    return true;
}

bool Fila::remover(int &x) {
    PonteiroElemento p;
    if (vazia())
        return false;
    x = inicio->valor;
    p = inicio;
    inicio = inicio->proximoElemento;
    delete p;
    tamfila--;
    //listafila.pop_front();
    if (inicio == NULL)
        fim = NULL;
    return true;
}


bool Fila::primeiro(int &x) {
	// caso a lista esteja vazia retornar falso
	// retornar em x o valor do primeiro elemento da lista
	// seu código aqui:


   x = inicio->valor;
   return true;
}

bool Fila::ultimo(int &x) {
	// caso a lista esteja vazia retornar falso
	// retornar em x o valor do último elemento da lista
	// seu código aqui:

    x = fim->valor;
    return true;

}

bool Fila::esvaziar() {
	// caso a lista esteja vazia retornar falso
	// remover todos os elementos da lista
	// seu código aqui:
    PonteiroElemento p,e;
    if (vazia())
        return false;
    p = inicio;
    while(p != NULL){
       e = p;
       p = p->proximoElemento;
       inicio = inicio->proximoElemento;
       delete e;
       tamfila--;
       //listafila.pop_front();
    }


    return true;

}

int Fila::tamanho() {
	// retornar o tamanho da lista, 0 se estiver vazia
	// seu código aqui:

    return tamfila;

}

bool Fila::inverter() {
	// caso a lista esteja vazia retornar falso
	// inverter a ordem dos elementos da lista
	// seu código aqui:
	PonteiroElemento p = inicio;
    //listafilacopia = listafila;
    int y = 0,nelementos = tamfila;

    for(int z = 0; z < tamfila; z++){
        listafila[z] = p->valor;
        p = p->proximoElemento;
    }

    for(int z = tamfila-1; z >= 0;z--){
        listafilacopia[z] = listafila[y];
        y++;
    }
    esvaziar();

    for(int z = 0; z < nelementos;z++){
       inserir(listafilacopia[z]);
       listafila[z] = listafilacopia[z];
    }


      return true;



}

string Fila::listar() {
	// retornar string com todos os elementos da lista separados por ;
	// exemplo: 1 ; 3 ; 5
	// string vazia se a lista estiver vazia
	// seu código aqui:
    PonteiroElemento p;
    p = inicio;
    string aux = "";

    while(p != NULL){
      aux = aux + to_string(p->valor) + " ; ";
      p = p->proximoElemento;
    }

    return aux;

}

bool Fila::estaNaFila(int x) {
	// retornar verdadeiro caso o valor x seja localizado na fila
	// seu código aqui:
    PonteiroElemento aux;
    aux = inicio;
    bool achou = false;

    while(aux != NULL){
     if(aux->valor == x){
        achou = true;
     }
     aux = aux->proximoElemento;
    }


    return achou;

}

Fila* Fila::interseccao(Fila* auxFila) {
	// retornar objeto Fila contendo a intersecção com a lista atual
	// elementos em comum com as 2 listas
	// sem repetição de elementos
	// seu código aqui:
    //listafilacopia = listafila;
    Fila *intersec = new Fila();
    PonteiroElemento in = auxFila->inicio;
    PonteiroElemento aux = inicio;
    while(in != NULL){
        while(aux != NULL){
            if(aux->valor == in->valor){
                intersec->inserir(aux->valor);
            }
            aux = aux->proximoElemento;
        }
        in = in->proximoElemento;
        aux = inicio;
    }

   return intersec;


}

Fila* Fila::uniao(Fila* auxFila) {
	// retornar objeto Fila contendo a união com a lista atual
	// elementos das 2 listas
	// sem repetição de elementos
	// seu código aqui:

	Fila *uniao = new Fila();
	PonteiroElemento un = inicio;
	while(un != NULL){
      uniao->inserir(un->valor);
      un = un->proximoElemento;
	}

	PonteiroElemento af = auxFila->inicio;
	while(af != NULL){
        uniao->inserir(af->valor);
        af = af->proximoElemento;
	}

	return uniao;


}



 

Link para o comentário
Compartilhar em outros sites

33 minutos atrás, Diego Dreossi disse:

Boa noite, consegui terminar, muito obrigado pela sua ajuda, tirei os list mesmo e substitui por vetores.


#include <iostream>
#include <exception>
#include "Fila.cpp"
#include "Fila.h

 

Cuidado: tire isso daí. Como eu disse antes, você só inclui o header.

 

Muitas vezes você nem tem o cpp. Veja o caso de cout por exemplo. Você tem o header. Mas não o cpp.

 

Entendi o que quis fazer. E é uma ideia usar o vetor.

 

Mas não escreveu de fato um programa em C++. Apenas um programa em C com uma classe. E não está muito bom ainda.

 

E não implementou cheia()

 

Se pode usar <list> seria muito simples escrever isso

 

Nunca use menus em programas que está desenvolvendo. Coloque os eventuais menus e qualquer interatividade no final, depois de testar a lógica. Ou vai perder MUITO tempo.

 

class Fila {
    private:
        struct elemento {
            int valor;
            elemento *proximoElemento;
        };
        typedef elemento *PonteiroElemento;
        PonteiroElemento inicio;
        PonteiroElemento fim;
        int tamfila;
        int listafila[MAX],listafilacopia[MAX];
    public:

        Fila();
        bool vazia();
        bool cheia();
        bool inserir(int x);
        bool remover(int &x);
        //implementar:
        bool primeiro(int &x);
        bool ultimo(int &x);
        bool esvaziar();
        int tamanho();
        bool inverter();
        string listar();
        //void listar();
        bool estaNaFila(int x);
        Fila* interseccao(Fila* auxFila);
        Fila* uniao(Fila* auxFila);
};

 

 

Uma classe com um struct e um typedef dentro não vão te dar uma nota muito boa para um programa em C++.  Claro, ajuda o fato de não ser eu a corrigir

:) 

 

Sem pensar muito, uma classe em C++ para implementar isso usando list<int> seria algo como abaixo

 

class Fila
{
private:
    unsigned    limite; // maximo de elementos
    list<int>   minha_lista;
public:
    Fila(); // assume 10 como o limite
    Fila(int); // inclui o limite
    bool vazia();
    bool cheia();
    bool inserir(int x);
    bool remover(int& x);
    //implementar:
    bool primeiro(int& x);
    bool ultimo(int& x);
    bool esvaziar();
    int capacidade();
    int tamanho();
    bool inverter();
    string listar();
    bool estaNaFila(int x);
public:
    friend Fila* interseccao(Fila* uma, Fila* outra);
    friend Fila* uniao(Fila* uma, Fila* outra);
};

 

E as coisas seriam mais simples. Veja vazia e cheia() por exemplo
 

bool Fila::vazia() { return (minha_lista.empty()); };
bool Fila::cheia() { return minha_lista.size() == limite; };

 

uniao() podia ser algo como
 

 

Fila*       uniao(Fila* uma, Fila* outra)
{
    if (uma == NULL) return nullptr;
    if (outra == NULL) return nullptr;
    Fila* uniao = new Fila(uma->tamanho() + outra->tamanho());
    // copia a primeira, sem usar algorithm
    if (!uma->minha_lista.empty())
    {
        auto el{ uma->minha_lista.begin() };
        while (el != uma->minha_lista.end()) uniao->inserir(*el++);
    };
    // copia a segunda
    if (!outra->minha_lista.empty())
    {
        auto el{ uma->minha_lista.begin() };
        while (el != outra->minha_lista.end()) uniao->inserir(*el++);
    };
    return uniao;
}

 

Se vai escrever sem <list> seria melhor rever as estruturas como eu disse no primeiro post

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Redes-Wi-Fi-capa-3d-newsletter.png

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!