Ir ao conteúdo
  • Cadastre-se
Dexterpk

C criar fila em c

Recommended Posts

OLÁ, GOSTARIA DE ENTENDER MELHOR COMO ESSE CÓDIGO FUNCIONA, ALGUÉM PODERIA COMENTA-LO POR GENTILEZA?

	#include <stdio.h>
    #include <stdlib.h>
    #define LIM 5
    #define FALSE 0
    #define TRUE 1
    
    #define FIM 0
    #define INSERIR 1
    #define RETIRAR 2
	#define LISTAR 3
   
   int obterOpcao(void)
   {
      int opcao;
   	 
		printf("*****************************************************\n");
		printf("**********************BEM VINDO**********************\n");
		printf("*****************************************************\n");
      
		printf("MENU\n");
    	printf("%2d - ENCERRAR APLICAÇÃO\n", FIM);
    	printf("%2d - ADICIONAR CLIENTE\n", INSERIR);
    	printf("%2d - CHAMDAR DA FILA\n", RETIRAR);
    	printf("%2d - EXIBIR LISTA DE CHAMADA\n", LISTAR);
    	printf("Opcao: ");
    	scanf("%d", &opcao);
    	return opcao;
	}
   
	int vazia(int inicio)
	{
	return inicio == -1;
	}
   
	int esgotada(int inicio, int fim)
	{
		if (vazia(inicio)) return FALSE;
    	return (fim + 1) % LIM == inicio;
	}

	int inserir(int valor, int *pInicio, int *pFim, int fila[])
	{
		if (esgotada(*pInicio, *pFim)) return FALSE;
		if (vazia(*pInicio)) *pInicio = *pFim = 0;
		else *pFim = (*pFim + 1) % LIM;
		fila[*pFim] = valor;
		return TRUE;
   }
   
	int retirar(int *pValor, int *pInicio, int *pFim, int fila[])
   {
		if (vazia(*pInicio)) return FALSE;
		*pValor = fila[*pInicio];
		if (*pInicio == *pFim) *pInicio = -1; // lista vazia apos retirada
		else *pInicio = (*pInicio + 1) % LIM;
		return TRUE;
   }
   
	int listar(int inicio, int fim, int fila[])
	{
		int i;
		if (vazia(inicio)) return FALSE;
		printf("< ");
		for (i = inicio; i != fim; i = (i + 1) % LIM)
    	printf("%d ", fila[i]);
    	printf("%d ", fila[fim]);
    	printf("<\n");
    	return TRUE;
	}

	int main(void)
	{
    	int inicio, fim, fila[LIM], opcao, valor;
    	inicio = -1; // fila vazia
    	while ((opcao = obterOpcao()) != FIM)
    	{
    		switch (opcao)
    		{
    		case INSERIR:
    			printf("Valor a ser inserido na fila: ");
        		scanf("%d", &valor);
        		if (inserir(valor, &inicio, &fim, fila))
            		printf("Operacao concluida com sucesso\n");
            	else printf("Operacao frustrada - fila esgotada...\n");
				break;
        	case RETIRAR:
            	if (retirar(&valor, &inicio, &fim , fila))
                	printf("Valor %d retirado da fila\n", valor);
            	else printf("Operacao frustrada - fila vazia...\n");
            	break;
        	case LISTAR:
            	if (listar(inicio, fim, fila)) putchar('\n');
            	else printf("Operacao frustrada - fila vazia...\n");
        		break;
        	}
        	putchar('\n');
       }
      return 0;
  }

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include <stdio.h>
#include <stdlib.h>

#define LIM 10

void inserir(int n, int *inicio, int *fim, int fila[], int *q){
	if(*q == LIM){
        printf("Fila cheia\n");
        return;
    }

    fila[*fim] = n;

	*fim = (*fim + 1) % LIM;
	(*q)++;
}

int retirar(int *inicio, int *fim, int fila[], int *q){
	int n;
	if (*q==0){
        printf("Fila vazia\n");
        return;
	}

	n = fila[*inicio];
	*inicio = (*inicio + 1) % LIM;
	(*q)--;

	return n;
}

void listar(int inicio, int fim, int fila[], int q){
    if (q==0){
        printf("Fila vazia\n");
        return;
    }
	for (int i = inicio, j = 0; j<q; i = (i + 1) % LIM, j++){
    	printf("%d, ", fila[i]);
	}
	printf("\n");
}

int main(){
    int inicio = 0, fim = 0, q = 0;
    int *fila=(int*)malloc(LIM*sizeof(int));

    listar(inicio, fim, fila, q);

    inserir(1, &inicio, &fim, fila, &q);
    inserir(2, &inicio, &fim, fila, &q);
    inserir(3, &inicio, &fim, fila, &q);
    inserir(4, &inicio, &fim, fila, &q);
    inserir(5, &inicio, &fim, fila, &q);
    inserir(6, &inicio, &fim, fila, &q);
    inserir(7, &inicio, &fim, fila, &q);
    inserir(8, &inicio, &fim, fila, &q);
    inserir(9, &inicio, &fim, fila, &q);
    inserir(10, &inicio, &fim, fila, &q);
    inserir(11, &inicio, &fim, fila, &q);

    listar(inicio, fim, fila, q);

    printf("Retirado %d\n", retirar(&inicio, &fim, fila, &q));
    printf("Retirado %d\n", retirar(&inicio, &fim, fila, &q));
    printf("Retirado %d\n", retirar(&inicio, &fim, fila, &q));

    inserir(11, &inicio, &fim, fila, &q);

    listar(inicio, fim, fila, q);

    return 0;
}

assim é mais simples

a unica coisa importante que tu realmente deve entender disso é como o código utiliza o resto da divisão

*inicio = (*inicio + 1) % LIM;

*fim = (*fim + 1) % LIM;

 

LIM = 5;

0%LIM = 0;

1%LIM = 1;

2%LIM = 2;

3%LIM = 3;

4%LIM = 4;

5%LIM = 0;  // como tu esta utilizando uma fila em vetor, tu deve entender que ela tem um comportamento circular

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×