Ir ao conteúdo
  • Cadastre-se

Ajude-me a comentar o código.


kassuy
Ir à solução Resolvido por ScreenBlack,

Posts recomendados

  • Solução

Segue:

#include<stdio.h>#include<malloc.h>#include<stdlib.h> typedef struct tCaixa{    int valor;    int status;    struct tCaixa* prox;} Caixa; typedef struct tFila{    int quantidade;    int ativos;    struct tCaixa *inicio;} Fila;  /*    Cria um elemento fila e define valores padrões*/Fila * inicializar_fila(void){    Fila *fila = malloc( sizeof(Fila) );     if ( fila == NULL )    {        printf("Memoria insuficiente\n");        exit(1);    }     fila->quantidade = 0;    fila->ativos = 0;    fila->inicio = NULL;     return fila;} /*    Remove todas os elementos da fila circular (geralmente só o sobrevivente)*/Fila * finalizar_fila(Fila *fila){    int tmp = 0;    Caixa *tmpCaixa = NULL;     for ( tmp = 0; tmp < fila->quantidade; tmp++ ) // Remoção dos elementos da fila    {        tmpCaixa = fila->inicio;        fila->inicio = fila->inicio->prox;         free(tmpCaixa);    }     free(fila); // Liberação do controlador da fila     return NULL;} /*    Insere elementos na fila circular*/void enfileirar(Fila *fila){    Caixa *caixa = NULL;    Caixa *tmpCaixa = fila->inicio;     if ( fila->inicio == NULL ) // Insere primeiro elemento caso fila esteja vazia    {        fila->inicio = malloc( sizeof(Caixa) );         fila->quantidade++;        fila->ativos++;         fila->inicio->valor = fila->quantidade;        fila->inicio->status = 1;        fila->inicio->prox = fila->inicio;    }    else // Insere novos elementos na última posição controlada pela variável quantidade    {        while ( tmpCaixa->valor < fila->quantidade )            tmpCaixa = tmpCaixa->prox;         caixa = malloc( sizeof(Caixa) );         fila->quantidade++;        fila->ativos++;         caixa->valor = fila->quantidade;        caixa->status = 1;        caixa->prox = tmpCaixa->prox;        tmpCaixa->prox = caixa;    }} /*    Remoção dos elementos da fila baseada na quantidade de passos, até sobrar um sobrevivente*/void desenfileirar(Fila * fila, int qtdPassos){    int passos = 0;     Caixa *tmpCaixa = fila->inicio;     while ( fila->ativos > 1 ) // Enquanto tiver mais de um sobrevivente    {        if ( tmpCaixa->status == 1 ) // Se a pessoa estiver viva, conta o passo a ser dado            passos++;         while ( passos < qtdPassos + 1 ) // Percorre a fila até alcançar a quantidade de passos        {                tmpCaixa = tmpCaixa->prox;                 if ( tmpCaixa->status == 1 )                    passos++;        }         if ( fila->ativos == 1 ) // Se houver apenas uma pessoa ativa (viva), será a sobrevivente            printf("Pessoa %d sobreviveu\n", tmpCaixa->valor );        else        {            printf("Pessoa %d morreu\n", tmpCaixa->valor );            tmpCaixa->status = 0;             fila->ativos--;        }         passos = 0;    }} /*    Lista o estado das pessoas (vivas ou mortas)*/void mostrar_fila(Fila *fila){    int tmp = 0;     Caixa *tmpCaixa = fila->inicio;     for ( tmp = 0; tmp < fila->quantidade; tmp++ ) // Percorre a fila baseado na quantidade    {        printf("Pessoa: %d - Status: %d \n", tmpCaixa->valor, tmpCaixa->status ); // Status 1: Viva - Status 0: Morta        tmpCaixa = tmpCaixa->prox;    }} /*    Lista apenas as pessoas vivas*/void mostrar_fila_ativa(Fila *fila){    int tmp = 0;     Caixa *tmpCaixa = fila->inicio;     for ( tmp = 0; tmp < fila->quantidade; tmp++ )    {        if ( tmpCaixa->status == 1 )            printf("Caixa: %d\n", tmpCaixa->valor);        tmpCaixa = tmpCaixa->prox;    }} /*    Demonstração de que a fila realmente está circular    Lista as 20 posições sequenciais*/void mostrar_fila_20(Fila *fila){    int tmp = 0;    int tmp_2 = 0;     Caixa *tmpCaixa = fila->inicio;     for ( tmp = 0; tmp < 4; tmp++ ) // Mostra 4 linhas    {        for ( tmp_2 = 0; tmp_2 < 5; tmp_2++ ) // Mostra 5 pessoas por linha (5 x 4 = 20)        {            if ( tmp != 4 && tmp_2 != 5 )                printf(" Caixa: %d -> ", tmpCaixa->valor);            else                printf(" Caixa: %d", tmpCaixa->valor);             tmpCaixa = tmpCaixa->prox;        }         printf("\n");    }} int main(void){    int qtdPessoas = 0;    int qtdPassos = 0;    int tmp = 0;     Fila *fila = inicializar_fila();     printf("Quantidade de participantes: ");    scanf("%d", &qtdPessoas);     printf("Quantidade de passos: ");    scanf("%d", &qtdPassos);     for ( tmp = 0; tmp < qtdPessoas; tmp++ )        enfileirar( fila );     printf("-- Inicio --\n");    mostrar_fila( fila );     desenfileirar(fila, qtdPassos);     printf("-- Fim --\n");    mostrar_fila( fila );     fila = finalizar_fila(fila);     return 0;}

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!