1
resposta

Lista com prioridade em C [trabalho faculdade]

bom dia, estou fazendo um trabalho para faculdade de uma lista de clientes com prioridades, bem parecido com atendimento de um banco por exemplo, entao fiz um modelo em que se cadastra cliente com sua prioriadade e no final eles ficam ordenados, primeiro clientes com prioridade e depois clientes normais. Até ai consegui. Mas meu professor quer que tenha alguma regra, pois se for assim clientes normais que chegarem depois nunca serão atendidos. Ai queria adptar pra lista ser composta de 1 cliente prioritário, 2 clientes normais e assim sucessivamente por ordem de entrada mas nao consigo de jeito nenhum... segue abaixo meu codigo:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Cliente {
    char nome[50];
    int idade;
    int prioridade;

} Cliente;

typedef struct No {
    Cliente c;
    struct No *proximo;
} No;

typedef struct Lista {
    int qtd;
    No *topo;
} Lista;


Lista *criar() {
    Lista *li = (Lista*) malloc(sizeof(Lista));
    li->qtd = 0;
    li->topo = NULL;

    return li;
}


void inserir(Lista *l, Cliente pcliente) {
    No* start = l->topo;

    No *elemento = (No*) malloc(sizeof(No));
    elemento->c = pcliente;

    if(l->topo == NULL){
        l->topo = elemento;
        elemento->proximo = NULL;

    }

    else if(l->topo->c.prioridade < pcliente.prioridade){
        elemento->proximo = l->topo;
        l->topo = elemento;
    }
    else {

        while (start->proximo != NULL &&
            start->proximo->c.prioridade >= pcliente.prioridade) {
            start = start->proximo;
        }

        elemento->proximo = start->proximo;
        start->proximo = elemento;
    }

    l->qtd++;
}

int vazia(Lista *l) {
    return (l->topo == NULL);
}

void imprimir(Lista *l) {
    if(l == NULL)
        printf("\nLista vazia!");    
    else {
            No *q = l->topo;
            printf("Atendimento <-");
            while(q != NULL){
            printf("%s - ", q->c.nome);
            q = q->proximo;
        }
    }
}

int cadastraCliente(Lista *l) {
    if( l == NULL){
        printf("\nCrie uma lista primeiro!");
        return 0;
    }

    Cliente c;

    printf("Nome do cliente:\n");
    scanf("%s", c.nome);
    printf("Idade:\n");
    scanf("%d", &c.idade);
    printf("Possui necessidades especiais ou � gestante? [1- SIM / 0 - NAO]:\n");
    scanf("%d", &c.prioridade);

    if(c.idade >= 60){
        c.prioridade = 1;
    }

    inserir(l, c);
    return 1;

}

Main.c :

int main(void)
{

    Lista *l;
    int continuar=1;

        do
        {
            printf("\nBem vindo ao banco santo Andre\n\n");
            printf("1. Criar Lista\n");
            printf("2. Inserir cliente\n");
            printf("3. Imprimir lista de clientes\n");

            scanf("%d", &continuar);
            system("cls || clear");

            switch(continuar)
            {
                case 1:
                    l = criar();
                    printf("Lista criada com sucesso!\n");
                    break;

                case 2:
                    cadastraCliente(l);
                    break;

                case 3:
                    imprimir(l);
                    break;


                default:
                    printf("Digite uma opcao valida\n");
            }
        } while(continuar);


    return 0;
}

ficaria muito grato se alguem me ajudasse

1 resposta

Em código não consigo te ajudar. Mas uma dica seria ter duas filas, uma normal e uma prioritária, e na lógica de puxar a fila vc alterna entre elas, usando uma variável incremental que pega o resto de uma divisão, ou seja, if(var_incremental%3==0) puxaDaPrioritária() else puxaDaNormal()

Também sugiro incluir o horário de inclusão na fila e na lógica de puxar da fila garantir que um prioritário sempre seja chamado antes do normal, pois se o professor for testar na maldade e jogar primeiro 5 preferenciais e por último 1 normal, seu programa corre o risco de chamar esse normal na terceira chamada, antes dos prioritários que entraram antes na fila.

Sucesso!