Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

thinkabout

Consultório Médico

Mensagens Recomendadas

thinkabout

Boas Pessoal,

A função funciona mas não liga nenhuma a ordem :(.

Problema:

Considerando o exercício anterior, nem todos os pacientes necessitam de ser atendidos com a mesma urgência. Considere que existem três graus de urgência:

Grávidas (nível 1), idosos e crianças (nível 2) e restantes pacientes (nível 3).

Só serão atendidos pacientes do nível 2 se não existirem pacientes do nível 1 e só serão atendidos pacientes do nível 3 se não existirem pacientes dos níveis 1 e 2.

Pretende-se que modifique a função de inserção de um novo paciente de modo a ter em conta estes três níveis de prioridade. A fila de espera deve continuar a ser única e a função de atendimento não deve ser alterada (o próximo paciente a ser atendido é o que se encontra noinício da fila)

Função em questão.


pno RetiraPaciente(pno lista) // O cliente está a ser atendido
{
pno aux1=lista;
pno aux2=lista;
pno aux3=lista;

if (lista==NULL)
{
printf("A lista esta vazia");
}
else

if (aux3!=NULL && lista->graurgencia == 3 )
{
printf("\n\nProximo paciente tem urgencia nivel 3 e tem o nome %s\n",lista->nome);
aux3=lista->prox;
free(lista);
return aux3;
}
else
{
if (aux2!=NULL && lista->graurgencia == 2 )
{
printf("\n\nProximo paciente tem urgencia nivel 2 e tem o nome %s\n",lista->nome);
aux2=lista->prox;
free(lista);
return aux2;
}
else
{
if (aux1!=NULL && lista->graurgencia == 1 )
{
printf("\n\nProximo paciente tem urgencia nivel 1 e tem o nome %s\n",lista->nome);
aux1=lista->prox;
free(lista);
return aux1;
}
}
}
}
[/Code]

Código Completo

[Code=c]
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ST_TAM 50

typedef struct pessoa no, *pno;

// Estrutura para armazenar informacao sobre uma pessoa
struct pessoa{
char nome[sT_TAM]; // Nome da pessoa
int graurgencia;
pno prox; // Ponteiro para proximo no da lista
};



int menu()
{
int op;

printf("\n\n1 - Novo paciente");
printf("\n2 - Atendimento");
printf("\n3 - Visualizar fila de espera");
printf("\n4 - Desistencia");
printf("\n5 - Terminar");
do{
printf("\nEscolha uma opcao: ");
scanf("%d", &op);
}while(op<1 || op>5);
fflush(stdin);
return op;
}


pno NovoPaciente(pno lista)
{
pno aux;
pno novo;
aux=lista;

if (aux!=NULL) // Se aux diferente de NULL existe pelo menos uma pessoa
{
while (aux->prox!=NULL) aux=aux->prox; // Vou percorrendo as pessoas até chegar ao final da linha.
}

// Vou agora arranjar espaço para a nova pessoa. (neste caso no fim da fila se a mesma existir se não irei arranjar espaço no começo da fila.).
if ((novo=(pno)malloc(sizeof(no)))==NULL)
{
printf("Erro na alocacao de memoria");
}
else
{
novo->prox=NULL; // No espaço que arranjei vou meter o campo prox a NULL

if (aux==NULL) // Se não existir ninguem na lista ou seja aux seria NULL
{
lista=novo;
}

else // Serve para os pacientes depois do primeiro.
{
aux->prox=novo;
}

printf("Novo Paciente\nNome:");
fgets(novo->nome,ST_TAM,stdin);
printf("Grau de urgência\n:"); // Não posso usar o fgets porque o mesmo só suporta strings
scanf("%d", &novo->graurgencia);

}
return lista;
}

pno RetiraPaciente(pno lista) // O cliente está a ser atendido
{
pno aux1=lista;
pno aux2=lista;
pno aux3=lista;

if (lista==NULL)
{
printf("A lista esta vazia");
}
else

if (aux3!=NULL && lista->graurgencia == 3 )
{
printf("\n\nProximo paciente tem urgencia nivel 3 e tem o nome %s\n",lista->nome);
aux3=lista->prox;
free(lista);
return aux3;
}
else
{
if (aux2!=NULL && lista->graurgencia == 2 )
{
printf("\n\nProximo paciente tem urgencia nivel 2 e tem o nome %s\n",lista->nome);
aux2=lista->prox;
free(lista);
return aux2;
}
else
{
if (aux1!=NULL && lista->graurgencia == 1 )
{
printf("\n\nProximo paciente tem urgencia nivel 1 e tem o nome %s\n",lista->nome);
aux1=lista->prox;
free(lista);
return aux1;
}
}
}
}


void ListaPaciente(pno lista)
{
if (lista==NULL)
{
printf("A lista esta vazia");
} else
{
printf("Nome dos pacientes\n");
printf("=================================");
while (lista!=NULL)
{
printf("\n O paciente chama-se %s e o grau de urgencia e %d \n",lista->nome,lista->graurgencia);

lista=lista->prox;
}
printf("=================================\n");
}
}



pno DesistenciaPaciente(pno lista) // Podemos escolher o paciente que vai desistir.
{
pno q=NULL;
pno p=lista;

char nome[sT_TAM];

if (lista==NULL) // Não existe ninguem.
{
puts("Nao ha ninguem para desistir");
}
else
{
puts("Insere o nome da pessoa que se vai embora");
fgets(nome,ST_TAM,stdin);

while (p!=NULL && strcmp(nome,p->nome)!=0)
{
q=p;
p=p->prox;
}
if (p==NULL)
{
printf("Paciente nao foi encontrado");
}
else
if (p==lista) // Serve para o primeiro da lista
{
lista=p->prox;
printf("Achei o primeiro com o free, e vou eliminar o primeiro e meto o ponteiro a apontar para o segundo");
}
else
{
// Não verificado ainda este comment -> printf("O paciente %s, esta farto de estar a espera e vai embora", p->nome);
q->prox=p->prox;
}

free(p);
}


return lista;
}

//libertar memoria
pno Libertar(pno lista)
{
pno aux=lista;
pno next=NULL;
if (aux!=NULL)
{
next=aux->prox;
free(aux);
aux=next;
}
return NULL;
}


int main(int argc, char *argv[])
{
int i;
// Ponteiro de lista
pno lista = NULL;
// Ciclo principal do programa
do{
i=menu();
switch(i){
case 1: lista=NovoPaciente(lista);
break;
case 2: lista=RetiraPaciente(lista);
break;
case 3: ListaPaciente(lista);
break;
case 4: lista=DesistenciaPaciente(lista);
break;
}
}while(i!=5);
lista=Libertar(lista);
return 0;
}
[/Code]

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

Estava a por os pés pelas as mãos e tenho é que alterar a função de inscrição e não de atendimento.

Vou trabalhar nisso.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

Mesmo assim, não estou a conseguir nada.

pno NovoPaciente(pno lista)
{
pno aux;
pno novo;
aux=lista;


if (aux!=NULL)  // Se aux diferente de NULL existe pelo menos uma pessoa
{ 
	while (aux->prox!=NULL && lista->graurgencia >= aux->graurgencia) aux=aux->prox;  // Vou percorrendo as pessoas até  ao nivel que quero.. 
}

// Vou agora arranjar espaço para a nova pessoa. (Tendo em conta o nível de prioridade).
if ((novo=(pno)malloc(sizeof(no)))==NULL) 
{
	printf("Erro na alocacao de memoria"); 
} 
else
{
	novo->prox=NULL; // No espaço que arranjei vou meter o campo prox a NULL

	if (aux==NULL) // Se não existir ninguem na lista ou seja aux seria NULL, seria o primeiro paciente.
	{
		lista=novo;
	} 

	else // Serve para os pacientes depois do primeiro.
	{
		aux->prox=novo;
	}

	printf("Novo Paciente\nNome:");
	fgets(novo->nome,ST_TAM,stdin);
	printf("Grau de urgência\n:"); // Não posso usar o fgets porque o mesmo só suporta strings
	scanf("%d", &novo->graurgencia);

}
return lista;
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

Não consigo fazer lógica disto:(, está difícil de entrar no esquema de memória dinâmica.

Para mim era aqui

if (aux!=NULL)  // Se aux diferente de NULL existe pelo menos uma pessoa
       { 
               while (aux->prox!=NULL && lista->graurgencia >= aux->graurgencia) aux=aux->prox;  // Vou percorrendo as pessoas até  ao nivel que quero.. 
       }

Mas mesmo que fosse depois não sei bem como partir o nó, meter esse no meio e depois refazer os ponteiros.

Já andei a tentar fazer outras aventuras mas sem cá em baixo no último else, mas todas sem sucesso.

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Trinkes

Para inserir um nó no meio da lista basta redireccionar os ponteiros prox:

tens o nó 1->2 e queres inserir o nó 3 no meio deles. Tens de primeiro apontar o prox do nó 3 para o nó 2, depois apontar o prox do nó 1 para o nó 3. Assim ficas com a seguinte lista: 1->3->2.

Entendeste a mecânica?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

Vou-me dedicar a pesca... Já tenho pesadelos com ponteiros / listas.

pno NovoPaciente(pno lista)
{
   pno aux;
   pno novo;



   if ((novo=(pno)malloc(sizeof(no)))==NULL) 
   {
       printf("Erro na alocacao de memoria"); 
   } 

   printf("Novo Paciente\nNome:");
   fgets(novo->nome,ST_TAM,stdin);
   printf("Grau de urgência\n:"); // Não posso usar o fgets porque o mesmo só suporta strings
   scanf("%d", &novo->grau);



if(lista==NULL || novo->grau < lista->grau)   //caso a lista esteja vazia ou o primeiro elemento seja de grau superior ao novo doente, coloca lá a nova inscrição
   {
       novo->prox=lista;
       lista=novo;
   }
       else
   {
       while(aux->prox != NULL && novo->grau > aux->prox->grau)
           aux=aux->prox;
       novo->prox=aux->prox;
       aux->prox=novo;
   }

   return lista;
}

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

Já mudei os sinais de maior e menor e já trabalha, contudo não fiquei minimamente convencido, isto foi mais tentativa erro do que lógica, ou seja continuo a ver navios.

Tenho dificuldades em perceber como se parte os nós a meio e depois religam-se.

Editado por thinkabout

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

Tenho visto muita documentação na net a ver se começo a entender isto, mas este tópico está mais difícil que os outros.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Trinkes

Percebes, por exemplo esta imagem?

trabalho.jpg

acho que essa imagem representa muito bem as listas.

o que tu precisas de fazer para inserir um nó é mudar a seta que liga os nós(os ponteiros).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
waza

entras no elemento da fila que queres... depois copias esse elemento para uma variavel auxiliar temporaria..

em seguida preenches com os dados que queres (na posição actual) e metes a apontar (no que guarda o endereço da proxima ocurrencia para a auxiliar !

acho que é assim

nao te esqueças de alocar a auxiliar

Editado por waza

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout

Segue o meu pensamento.

if(lista==NULL || novo->grau > lista->grau)   //caso a lista esteja vazia ou o primeiro elemento seja de grau superior ao novo doente, coloca lá a nova inscrição
{
	novo->prox=lista; // O ponteiro do que chega (novo bloco de memória), aponta onde eu quero ligar
	lista=novo; // Desloco o ponteiro do bloco que foi ligado que era a cabeça da lista para a noav cabeça da lista.
}

else
{
	aux=lista; // Não posso mexer na cabeça da lista, logo tenho que arranjar um ponteiro auxilar.
	while(aux->prox != NULL && novo->grau < aux->prox->grau) // O aux->prox->grau é porque o ponteiro aponta para o novo bloco de memória e lá dentro aponta para o grau.
		aux=aux->prox; // Aqui aponto o ponteiro para a próxima posição de memória (andar como AUX para a frente)
	novo->prox=aux->prox; // O ponteiro do novo bloco passa para o bloco actual a onde ja está também o ponteiro AUX.
	aux->prox=novo; // Aqui ligo a posição que estou a verificar ao novo bloco de memória.
}
return lista;

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.