• 0
Sign in to follow this  
muttleydm

Ajuda em manipulação de lista ordenada

Question

Oi pessoal, queria pedir a ajuda de vocês para resolver meu problema.

Estou fazendo um trabalho para a faculdade que consiste em uma simulação de atendimento de hospital.

Estou fazendo uma lista ordenada para o cadastro dos pacientes.

Cada paciente tem ID de identificação, string Nome e SobreNome e grau de Prioridade para atendimento.

Fiz uma classe Paciente para criar os pacientes e uma classe Lista(com herança de paciente) para tratar a inserção dos pacientes nele.

Estou com problema na função cadastro. Consigo cadastrar pacientes no inicio da lista, esteja ela vazia ou sendo o ID a ser inserido menor que o primeiro ID cadastrado.

Porém, não estou conseguindo cadastrar no meio dela. Fiz um while para posicionar poonteiros para indicar a posição correta para o cadastro, mas sempre que tento adicionar um paciente da erro de execução quando ele esta antes deste while.

Vou passar os códigos que fiz, espero que alguém possa me ajudar.

Paciente: (deixei tudo na Paciente.h porque não teria muito código para inserir na .cpp)

/* 
 * File:   Paciente.h
 * Author: mutiley
 *
 * Created on 11 de Junho de 2012, 22:11
 */

#ifndef PACIENTE_H
#define    PACIENTE_H
#include "string.h"
#include "iostream"
using namespace std;

class Paciente {
private:
    string Nome;
    string SobreNome;
    int Prioridade; //prioridade de atendimento
    int ID; //código de cadastro do paciente; todo cliente possui um código diferente.
    // Usado para ordenação na lista de cadastro de atendimento

public:

    Paciente() {
    };

    Paciente(int id, string nome, string sobrenome, int prioridade) {
        this->Nome = nome;
        this->ID = id;
        this->SobreNome = sobrenome;
        this->Prioridade = prioridade;
    }

    string GetNome() {
        return Nome;
    }

    void SetNome(string Nome) {
        this->Nome = Nome;
    }

    string GetSobreNome() {
        return SobreNome;
    }

    void SetSobreNome(string SobreNome) {
        this->SobreNome = SobreNome;
    }

    int GetID() {
        return ID;
    }

    void SetID(int ID) {
        this->ID = ID;
    }

    int GetPrioridade() {
        return Prioridade;
    }

    void SetPrioridade(int Prioridade) {
        this->Prioridade = Prioridade;
    }

    void imprimirPaciente() {
        cout << "ID: " << GetID();
        cout << "   Nome: " << GetNome() << " " << GetSobreNome();
        cout << "   Prioridade: " << GetPrioridade() << endl;
    }
};

#endif    /* PACIENTE_H */
Lista.h:
/* 
 * File:   Lista.h
 * Author: mutiley
 *
 * Created on 11 de Junho de 2012, 22:19
 */

#ifndef LISTA_H
#define    LISTA_H
#include "Paciente.h"
#include "string.h"
#include "iostream"

using namespace std;

//classe que representa uma lista com a relação de
//todos os atendimentos do hospital, portanto todo 
//paciente cadastrado deve ser atendido.

class Lista : public Paciente{
private:
    Paciente info;
    Lista *next;

public:

    Lista() {
        Paciente p0(0,"null", "null", 0);
        this->info = p0;
        this->next = NULL;
        
    }
    void remover(Paciente, bool&);//remove um paciente
    void cadastrar(Paciente, bool&); //cadastra um novo paciente
    bool consultar(Paciente); //consulta se o paciente está cadastrado
    void imprimir(); //imprime toda a lista
    bool listaVazia(); //verifica se a lista está vazia
    void buscaLocalParaInsercao(); //encontra o local apropriado para cadastrar um novo paciente de acordo com a ID;

};

#endif    /* LISTA_H */
Lista.cpp:
#include "Lista.h"
#include "Paciente.h"

bool Lista::listaVazia() {
    if (this->info.GetID() == 0) {
        return true;
    } else
        return false;
}

void Lista::cadastrar(Paciente P, bool &deuCerto) {
    Lista *aux, *proximo; //aux é o novo elemento a ser cadastrado e proximo um ponteiro para elementos da lista
    aux = new Lista();
    aux->info = P;
    aux->next = NULL;

    if (listaVazia()) {//lista vazia, insere na primeira posição
        this->info = aux->info;
        this->next = NULL;
        deuCerto = true;
    } else {
        proximo = this; //proximo aponta para primeiro elemento
        if (aux->info.GetID() < proximo->info.GetID()) {//id a ser inserido é menor do que o primeiro id da lista
            aux->next = proximo;
            proximo = aux;
            deuCerto = true;
        } else {//enquanto ID da lista for maior que ID a ser inserido, percorre a lista
            Lista *anterior = NULL;

            while (aux->info.GetID() > proximo->info.GetID()) {
                cout<<"asd"<<endl;
                anterior = proximo;
                proximo = proximo->next;
            }

            if (proximo != NULL) {//ou seja, achou a posição e ela não é a última
                //verifica se são iguais. Se forem não cadastra
                if (aux->info.GetID() == proximo->info.GetID()) {
                    cout << "já esta cadastrado." << endl;
                    deuCerto = false;
                } else { //caso contrário cadastra
                    aux->next = proximo;
                    anterior->next = aux;
                    deuCerto = true;
                }
            } else {//insere na última posição da lista
                anterior->next = aux;
                proximo  = aux;
                deuCerto = true;
            }
        }
    }
    if (deuCerto)
        cout << "true" << endl;
    else
        cout << "false" << endl;
}

bool Lista::consultar(Paciente P) {
    bool achou = false;
    Lista *aux, *auxLista;
    aux->info = P;
    aux->next = NULL;
    auxLista = this;
    cout << "con" << endl;
    if (listaVazia())
        cout << "Nenhum paciente cadastrado na lista." << endl;
    else {
        cout << "else cons" << endl;
        while ((auxLista->next != NULL) && (aux->info.GetID() != auxLista->info.GetID()))
            aux = aux->next;
        if (aux->info.GetID() == auxLista->info.GetID()) {
            achou = true;
            cout << "Achou" << endl;
        }
    }
    return achou;
}

void Lista::remover(Paciente P, bool &deuCerto) {
    Lista *aux;
    aux->info = P;


    if (!consultar(P))//não encontrou o ID na lista.
        cout << "ID não encontrada -> paciente não cadastrado." << endl;
    else {

    }

}

void Lista::imprimir() {
    Lista *aux;
    aux = this;

    if (!listaVazia()) {
        while (aux != NULL) {
            cout << "as" << endl;
            cout << "ID: " << aux->info.GetID();
            cout << "    Prioridade: " << aux->info.GetPrioridade();
            cout << "    Nome: " << aux->info.GetNome();
            cout << " " << aux->info.GetSobreNome();
            aux = aux->next;
        }
    } else
        cout << "lista vazia" << endl;
}
Main:
/* 
 * File:   main.cpp
 * Author: mutiley
 *
 * Created on 11 de Junho de 2012, 22:11
 */

#include <cstdlib>
#include "Lista.h"
#include "Paciente.h"
using namespace std;

int main(int argc, char** argv) {
    bool deuCerto;
    Paciente p1(1, "Arthur", "Giovanini", 1);
    Paciente p2(2, "Nome", "Sobrenome", 0);
    Paciente p3(3, "Nome", "Sobrenome", 0);
    Paciente p4(4, "Nome", "Sobrenome", 0);
    cout << "fez paciente" << endl;
    p1.imprimirPaciente();
    p2.imprimirPaciente();

    Lista *l = new Lista();

    l->cadastrar(p1, deuCerto);

    cout << "asm" << endl;
    l->cadastrar(p2, deuCerto);
    cout << "asmm" << endl;
    l->cadastrar(p3, deuCerto);
    l->cadastrar(p4, deuCerto);

    l->imprimir();

    return 0;
}

Share this post


Link to post
Share on other sites

2 answers to this question

Recommended Posts

  • 0

bom pessoal...eu refiz o código do cadastro e ele ficou mais curto.

ele está cadastrando no inicio, no fim e no meio.

Porém no modo que fiz, ele faz a inserção no final por último e com isso toda vez que faço a inserção no meio ele acaba inserindo no final também.

Alguém poderia dar uma idéia de como mudar o código para que isso deixe de ocorrer?

Aí segue o código que fiz:

void Lista::cadastrar(Paciente P, bool &deuCerto) {
    Lista *aux, *proximo; //aux é o novo elemento a ser cadastrado e proximo um ponteiro para elementos da lista
    Lista *anterior;
    anterior = this;
    aux = new Lista();
    aux->info = P;
    aux->next = NULL;

    if (listaVazia()) {//lista vazia, insere na primeira posição
        this->info = aux->info;
        this->next = NULL;
        deuCerto = true;
        cout << "true no inicio" << endl;
    } else {
        proximo = this;
        if (aux->info.GetID() < proximo->info.GetID()) {//inserir à esquerda
            aux->next = proximo;
            proximo = aux;
            deuCerto = true;
        } else {//inserir à direita
            //while (proximo != NULL) {

            while (proximo->next != NULL) {
                if ((aux->info.GetID() > proximo->info.GetID()) && (aux->info.GetID() < proximo->next->info.GetID())) {
                    cout << "inseriu no meio" << endl;
                    aux->next = proximo->next;
                    proximo->next = aux;
                    deuCerto = true;
                } else {//andando pela lista
                    proximo = proximo->next;
                    anterior = anterior->next;
                }
            }
            if (proximo->next == NULL) {
                if (aux->info.GetID() == proximo->info.GetID()) {
                    deuCerto = false;
                    cout << "Já cadastrado" << endl;
                } else {
                    cout << "no fim" << endl;
                    proximo->next = aux;
                    deuCerto = true;
                }
            }

        }

    }
}

Espero que alguém possa me ajudar.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this