Ir para conteúdo
Fórum Script Brasil
  • 0

Ajuda em manipulação de lista ordenada


muttleydm

Pergunta

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

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

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

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...