TransWikia.com

Parar de aceitar dados para colocar em fila dinâmica

Stack Overflow em Português Asked by Paulo Roberto on January 3, 2021

Preciso parar de enfileirar quando o usuário digitar um numero negativo (-1), verificar se a fila esta vazia para que ao digitar o numero negativo não dê nenhum erro e o principal, preciso que o usuário informe qual valor em especifico ele quer desenfileirar.

#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

One Answer

Vou arriscar responder o que eu entendi que você quer pontualmente (estou analisando outros posts seus, o que não deveria ser necessário). Depois você vê os outros problemas. Se não for isto, a pergunta não está clara.

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

Veja funcionando no ideone. E no repl.it. Também coloquei no GitHub para referência futura.

Esta forma pega os dados e os trata antes de usá-los. A forma como normalmente é ensinado o uso do cin é útil para fins didático ou quando não importa se há algum problema na entrada, mas ela não funciona na prática em grande parte dos casos.

Pelo menos desta forma está pegando a entrada de dados corretamente. Depois de conseguir esta parte aí você vai ver os outros problemas que ocorrerão no resto do código.

Correct answer by Maniero on January 3, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP