Stop accepting data to queue dynamically

Asked

Viewed 542 times

1

I need to stop queuing when the user enters 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 one, I need the user to indicate which value in specific he wants to unmrow.

#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;
}

Lista Dinâmica

  • Is your problem in the queue or in the logic of typing the values? If you should stop when you type a negative why ask "Quantos valores deseja enfileirar? "?

  • @Bigown always you in saving with this C++... My problem is with the logic to treat the empty queue, the typing of the value to be removed and the interruption of the queuing of the values by typing a negative number.

  • @bigown the user needs to have the possibility to give up entering the values he himself chose... Do you think it best to take the question with the quantity limitation?

  • 1

    It is not easy to solve something so wide. It would be better to isolate the problems, solved one at a time, if possible a question by problem. If you try to do this you may even notice some mistakes. Your main() doesn’t make any sense to me. The rest also seems to have problems, I don’t know if serious, I didn’t read it carefully. Unless I don’t understand the question, it’s hard to answer it the way it is. Regarding the end of typing I prefer to always adopt only a strategy and in case would have a value that ends and not the time count.

  • @bigown thanks, I’ll review the code and post my doubts again.

1 answer

2


I will risk answering what I understood that you want punctually (I am analyzing others posts yours, which should not be necessary). Then you see the other problems. If it is not this, the question is not clear.

#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
    }
}

Behold working in the ideone. And in the repl it.. Also put on the Github for future reference.

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

At least this way is getting the data input correctly. After getting this part you will see the other problems that will occur in the rest of the code.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.