Stop accepting data to queue

1

I need to stop queuing when the user types a negative number (-1), check if the queue is empty so that when typing the negative number does not give any error and the main, I need the user to tell what specific value he

#include <iostream>
using namespace std;

// Define a Estrutura Nó
struct No {
    int valor;      // Valor armazenado
    No * prox;      // Ponteiro para próximo elemento da lista
};

// Define a Fila
struct Fila {
    No * ini;       // Início da fila
    No * fim;       // Fim da fila
};

// Insere valor da lista
int inserir(Fila &f, int valor);
// Remove elemento da lista
int remover(Fila &f, int &valor);

int main(void) {
    // Declara e inicializa fila
    Fila fila;
    fila.ini = fila.fim = NULL;

   // Variável para armazenar dado digitado
    int dado;
    int n;

    cout << "Quantos valores deseja enfileirar? ";
    cin >> n;
    cout << endl;

    while (n>0) {
        cout << "Digite um numero inteiro: ";
        cin >> dado;
        inserir(fila, dado);
        n--;
    }

        cout << endl;
        cout << "==== Imprimir todos os dados ====" << endl;

    // Agora mostra o reultado...
    while (remover(fila, dado) == 0) {

        cout << dado << endl;
    };

         cout << endl;
        cout << "===== Remover  um unico valor ====" << endl;
        cout << endl;

        cout << "Qual valor deseja desenfileirar? " << endl;

    };




// Insere um valor na fila
int inserir(Fila &f, int valor) {

    No * tmp; // Ponteiro para armazenar endereço de nó temporariamente
    // Cria nó
    tmp = new No;
    // Configura nó...
    tmp->valor = valor; // Valor do nó
    tmp->prox = NULL; // Sempre insere no fim da fila
    // Se lista vazia, insere primeiro elemento
    if (f.ini == NULL) {
        f.ini = f.fim = tmp; // O primeiro elemento é o primeiro e o último
    }
    // Se lista não está vazia, atualiza lista...
    else {
        f.fim->prox = tmp; // Pendura novo elemento no antigo fim
        f.fim = tmp; // Indica que novo elemento é o novo fim
    }
    // Retorna que inserção ocorreu com sucesso
    return 0;
}


// Remove um valor da fila
int remover(Fila &f, int &valor) {
    No * tmp; // Ponteiro temporário
    // Se a lista está vazia, vai embora
    if (f.ini == NULL) return 1;
    // Armazena valor do elemento sendo removido
    valor = f.ini->valor;
    // Armazena endereço de elemento a ser removido
    tmp = f.ini;
    // Aponta inicio da lista para segundo elemento (novo primeiro!)
    f.ini = f.ini->prox;
    // Remove o primeiro elemento da lista
    delete tmp;
    // Boa prática... se a lista ficou vazia, atualiza último ponteiro
    if (f.ini == NULL) f.fim = NULL;
    // Retorna novo início da lista
    return 0;
}

    
asked by anonymous 26.11.2014 / 12:59

1 answer

2

I'll take the time to respond to what I understand you want on time (I'm reviewing your posts, which should not be necessary). Then you see the other problems. If not, the question is unclear.

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main(void) {
    int dado = -1;
    string entrada = ""; //melhor ler uma string e tentar converter depois
    while (true) {
        cout << "Digite um numero inteiro: ";
        getline(cin, entrada); //pede um stream de uma linha toda
        cout << endl;
        stringstream myStream(entrada);
        if (!(myStream >> dado)) { //se não conseguir fazer a conversão
            cout << "Valor inválido, tente novamente" << endl;
            continue;
        }
        if (dado < 0) { //se digitar o número que determina encerrar
            break;
        }
//        inserir(fila, dado); <========== neste ponto você faz o que quiser, o valor é válido
    }
}

See running on ideone . And no Coding Ground . Also I placed GitHub for future reference .

This form takes the data and treats it before using it. The way in which cin is normally taught is useful for didactic purposes or when it does not matter if there is a problem with the input, but it does not work in practice in most cases.

At least this way you are getting data entry correctly. Once you get this part there you will see the other issues that will occur in the rest of the code.

    
29.11.2014 / 15:03