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;
}
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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP