Ir ao conteúdo

Posts recomendados

Postado

Fiz um programa para um exercício da faculdade, ele consiste em simular uma lista de espera de um hospital, aparentemente ele está certo, porém depois da terceira repetição do while ele fecha sem nenhum aviso

#include <iostream>
#include <locale.h>
#include <stdlib.h>
#include <string>

using namespace std;

//========== dados que vou guardar dentro da lista
struct paciente{
    int prioridade;
    string nome;
};

//========== criando a estrutura de lista encadeada
struct elemento{
    struct paciente dados;      // estrutura guardada dentro da lista
    struct elemento *prox;      // ponteiro de ponteiro
};
typedef struct elemento elem;
typedef struct elemento* lista;

//========== criar lista
lista* lista_cria(){
    lista* li = (lista*) malloc(sizeof(lista));     // criando nó de inicio
    if(li != NULL){
        *li = NULL;
    }
    return li;
}

//========== imprimir pacientes
void lista_imprime_E(lista* li){
    cout << "Atendimento emergencial: " << endl;
    elem *no = *li;
    while(no != NULL){
        cout << no->dados.nome << endl;
        no = no->prox;
    }
    cout << endl;
}

void lista_imprime_P(lista* li){
    cout << "Atendimento prioritário: " << endl;
    elem *no = *li;
    while(no != NULL){
        cout << no->dados.nome << endl;
        no = no->prox;
    }
    cout << endl;
}

void lista_imprime_N(lista* li){
    cout << "Atendimento comum: " << endl;
    elem *no = *li;
    while(no != NULL){
        cout << no->dados.nome << endl;
        no = no->prox;
    }
    cout << endl;
}

//========== insere final
int lista_insere_final(lista* li, struct paciente pacienteX){
    if(li == NULL){
        return 0;
    }
    elem* no = (elem*) malloc(sizeof(elem));
    if(no == NULL){
        return 0;
    }

    no->dados = pacienteX;
    no->prox == NULL;

    if((*li) == NULL){
        *li = no;
    }else{
        elem *aux = *li;
        while(aux->prox != NULL){
            aux = aux->prox;
        }
        aux->prox = no;
    }
    return 1;
}

//========== ver se a lista está vazia
int lista_vazia(lista* li){
    if(li == NULL){
        return -1;
    }
    if(*li == NULL){
        return -1;
    }
    return 0;
}

//========== função para remover o paciente já atendido da fila
int lista_remove(lista* li){
    if(li == NULL){
    return 0;
    }
    if(lista_vazia(li)){
        return 0;
    }

    elem *no = *li;
    *li = no->prox;
    free(no);

    return 1;
}

int main(){
    setlocale (LC_ALL, "portuguese");

    int op, op3, i=0;

    lista *lip;
    lip = lista_cria();
    lista *lin;
    lin = lista_cria();
    lista *lie;
    lie = lista_cria();


    paciente pacienteX = {0, "a"};

    while(i != 13){
    cout << "========================================" << endl;
    cout << "==   Qual operação deseja realizar?   ==" << endl;
    cout << "==   1 - Imprimir fila de pacientes   ==" << endl;
    cout << "==   2 - Adicionar novo paciente      ==" << endl;
    cout << "==   3 - Remover paciente atendido    ==" << endl;
    cout << "==   4 - Sair                         ==" << endl;
    cout << "========================================" << endl;
    cout << endl << endl;

    cin >> op;
    

    if(op == 1){
    cout << endl << endl;
    lista_imprime_E(lie);
    lista_imprime_P(lip);
    lista_imprime_N(lin);
    system("pause");
    cout << endl;
    }

    if(op == 2){
        cout << "Digite o nome do paciente: " << endl;
        cin >> pacienteX.nome;
        cout << endl;

        cout << "Digite a prioridade do paciente:       (1 - Emergência, 2 - Prioritário, 3 - Normal)" << endl;
        cin >> pacienteX.prioridade;
        cout << endl; 

        if(pacienteX.prioridade == 1){
            lista_insere_final(lie, pacienteX);
        }
        if(pacienteX.prioridade == 2){
            lista_insere_final(lip, pacienteX);
        }
        if(pacienteX.prioridade == 3){
            lista_insere_final(lin, pacienteX);
        }
    }

    if(op == 3){
        cout << "Informe a prioridade do paciente atendido: (1 - Emergência, 2 - Prioritário, 3 - Normal)" << endl;
        cin >> op3;
        if(op3 == 1){
            lista_remove(lie);
        }
        if(op3 == 2){
            lista_remove(lip);
        }
        if(op3 == 3){
            lista_remove(lin);
        }

    }

    if(op == 4){
        i=13;
    }
};

    system("pause");
    return 0;
}

 

no momento está while(i != 13) porque coloquei um número aleatório para testar, mas já tentei usar while(i != 1), do-while, até mesmo um for(i=0; i<9999; i++), e nenhum deles deu certo, sinceramente não sei o que estou fazendo de errado ou se quer tem algo errado com meu código

 

raramente ele roda mais do que 3x como no caso da foto, mas no final o erro é o mesmo, ele simplesmente desiste.

 

obs: isso acontece tanto no vs code como no terminal externo, mesmo com o arquivo construído e fora do vs code ele ainda fecha enquanto o while está ativo

image.thumb.png.3593d327a3474bbacf4cc4d147d23f39.png

Postado
15 minutos atrás, ynp disse:

    lista *lip;
    lip = lista_cria();
    lista *lin;
    lin = lista_cria();
    lista *lie;
    lie = lista_cria();

 

Acho que só tem uma lista, a de pacientes. Não precisa de 3 listas e só vai complicar as coisas usando 3.

 

//========== dados que vou guardar dentro da lista struct paciente{ int prioridade; string nome; }; //========== criando a estrutura de lista encadeada struct elemento{ struct paciente dados; // estrutura guardada dentro da lista struct elemento *prox; // ponteiro de ponteiro }; typedef struct elemento elem; typedef struct elemento* lista;

 

//========== dados que vou guardar dentro da lista
struct paciente{
    int prioridade;
    string nome;
};

//========== criando a estrutura de lista encadeada
struct elemento{
    struct paciente dados;      // estrutura guardada dentro da lista
    struct elemento *prox;      // ponteiro de ponteiro
};
typedef struct elemento elem;
typedef struct elemento* lista;

 

Essa estrutura não está boa e vai ter um trabalho do inf3rn0 para usar assim.

 

Sugiro evitar esses comentários óbvios como

//========== dados que vou guardar dentro da lista

e comentar o que está fazendo e porque está fazendo

 

Porque o comentário "ponteiro de ponteiro"? Não tem sentido.

prox é struct elemento*. Acabou de declarar. É um ponteiro para uma estrutura.

 

    typedef struct elemento  elem;

 

Pouca vantagem em usar isso. Prefira a convenção comum em C e use a primeira letra em maiúscula. E use um nome qualquer para a estrutura apenas para referenciar dentro dela porque não vai mais usar em lugar nenhum...

 

    typedef struct elemento* lista;

 

Nunca escreva isso. Não defina um nome para um ponteiro, ainda mias um nome diferente e ingenuo como esse lista.

 

Entenda que do modo como escreveu, como acabou de escrever (na linha anterior!!) 

 

   typedef struct elemento  elem;

 

Então o que chamou de lista é simplesmente elem*. Só isso. 

 

A Lista

 

Uma lista é uma lista de coisas, chamadas de nós em português. Cada nó contem ou aponta para um dado. Essa é a realidade. E todas as listas são iguais: LISTAS.

 

Não deve misturar seus dados com alista ou nunca vai aproveitar nada de seu código com listas...

 

C ou C++

 

Você escreveu um programa em C. C++ é muito mais expressiva e não deveria escrever assim. Não se usa typedef em C++. Não há razão para isso.

 

De todo modo, mantendo o modo "C" que usou

 

typedef struct
{
    int    prioridade;
    string nome;

} Paciente;

 

Isso é um paciente. Convencionando a primeira leta em maiúscula para nomes definidos no programa.

 

Sua lista é de nós e cada nó tem um paciente

 

typedef struct st_no
{
    Paciente*    p;
    struct st_no prox;  // o seguinte

} No;

 

Então esse é um nó da lista. Tem o ponteiro para um Paciente e um ponteiro para o próximo nó da lista

 

E a lista?

 

typedef struct
{
    int              n; // quantos tem na lista
    No*              ini; // o primeiro

} Lista;

 

Pois é: simples assim: a lista tem um certo número de nós, e o endereço do primeiro eo contador estão dentro dela.

 

 

Percebe como é muito mais simples? Essa é a descrição, em C. Que compila em C++

 

typedef struct
{
    int    prioridade;
    string nome;

} Paciente;

typedef struct st_no
{
    Paciente*    p;
    struct st_no prox;  // o seguinte

} No;

typedef struct
{
    int              n; // quantos tem na lista
    No*              ini; // o primeiro

} Lista;

 

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!