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

thinkabout

Consultório Médico

Mensagens Recomendadas

thinkabout    0
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


Link para a mensagem
Partilhar noutros sites
thinkabout    0
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


Link para a mensagem
Partilhar noutros sites
thinkabout    0
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


Link para a mensagem
Partilhar noutros sites
thinkabout    0
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


Link para a mensagem
Partilhar noutros sites
Trinkes    0
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


Link para a mensagem
Partilhar noutros sites
thinkabout    0
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


Link para a mensagem
Partilhar noutros sites
thinkabout    0
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


Link para a mensagem
Partilhar noutros sites
thinkabout    0
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


Link para a mensagem
Partilhar noutros sites
Trinkes    0
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


Link para a mensagem
Partilhar noutros sites
waza    1
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


Link para a mensagem
Partilhar noutros sites
thinkabout    0
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


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