DAS5102 - Filas - Exemplo em C

De Aulas

Links relacionados: DAS5102 Fundamentos da Estrutura da Informação

Observações

Aconselho fortemente a não olhar o código antes de tentar fazer por si mesmo, tentando entender a lógica das operações.

Arquivo fila.h

  1#include <stdlib.h>
  2#include <stdio.h>
  3#include "fila.h"
  4
  5typedef struct no No;
  6
  7struct no
  8{
  9	int info;
 10	No* prox;
 11};
 12
 13struct fila
 14{
 15	int tamanho;
 16	No* inicio;
 17	No* cabeca;
 18};
 19
 20Fila* fila_criar()
 21{
 22	Fila* f = malloc (sizeof(Fila));
 23	f->tamanho = 0;
 24	f->inicio = NULL;
 25	f->cabeca = NULL;
 26	return f;
 27}
 28
 29void fila_inserir(Fila* f, int info)
 30{
 31	No* n = malloc (sizeof(No));
 32	n->info = info;
 33	n->prox = NULL;
 34	if (f->tamanho == 0)
 35	{
 36		f->cabeca = n;
 37		f->inicio = n;
 38	}
 39	else
 40	{
 41		n->prox = f->inicio;
 42		f->inicio = n;
 43	}
 44	f->tamanho++;
 45}
 46
 47int fila_verifica_cabeca(Fila* f)
 48{
 49	if (f->tamanho == 0)
 50	{
 51		return -1;
 52	}
 53	return f->cabeca->info;
 54}
 55
 56int fila_vazia(Fila* f)
 57{
 58	return (f->tamanho == 0);
 59}
 60
 61int fila_tamanho(Fila* f)
 62{
 63	return f->tamanho;
 64}
 65
 66int fila_retira(Fila* f)
 67{
 68	if (f->tamanho == 0)
 69	{
 70		return -1;
 71	}
 72	if (f->tamanho == 1)
 73	{
 74		int aux = f->cabeca->info;
 75		free (f->cabeca);
 76		f->inicio = NULL;
 77		f->cabeca = NULL;
 78		f->tamanho = 0;
 79		return aux;
 80	}
 81	No* local = f->inicio;
 82	while (local->prox->prox != NULL)
 83	{
 84		local = local->prox;
 85	}
 86	int aux = f->cabeca->info;
 87	free(f->cabeca);
 88	f->cabeca = local;
 89	f->cabeca->prox = NULL;
 90	f->tamanho--;
 91	return aux;
 92}
 93
 94void fila_imprimir_tudo(Fila* f)
 95{
 96	No* local = f->inicio;
 97	printf("[ ");
 98	while (local != NULL)
 99	{
100		printf("%d ", local->info);
101		local = local->prox;
102	}
103	printf(" ]\n");
104}

Arquivo fila.h

 1#ifndef FILA_H_INCLUDED
 2#define FILA_H_INCLUDED
 3
 4typedef struct fila Fila;
 5
 6Fila* fila_criar();
 7void fila_inserir(Fila* f, int info);
 8int fila_verifica_cabeca(Fila* f);
 9int fila_vazia(Fila* f);
10int fila_tamanho(Fila* f);
11int fila_retira(Fila* f);
12void fila_imprimir_tudo(Fila* f);
13
14#endif // FILA_H_INCLUDED

Arquivo main.h

 1#include <stdio.h>
 2#include <stdlib.h>
 3#include "fila.h"
 4
 5int main()
 6{
 7    Fila* f = fila_criar();
 8    printf("Tamanho: %d\n", fila_tamanho(f));
 9    fila_inserir(f, 5);
10    printf("Tamanho: %d\n", fila_tamanho(f));
11    fila_inserir(f, 6);
12    printf("Tamanho: %d\n", fila_tamanho(f));
13    fila_inserir(f, 7);
14    printf("Tamanho: %d\n", fila_tamanho(f));
15    fila_inserir(f, 8);
16    printf("Tamanho: %d\n", fila_tamanho(f));
17    fila_imprimir_tudo(f);
18    printf("Elemento: %d\n", fila_retira(f));
19    printf("Tamanho: %d\n", fila_tamanho(f));
20    printf("Elemento: %d\n", fila_retira(f));
21    printf("Tamanho: %d\n", fila_tamanho(f));
22    printf("Elemento: %d\n", fila_retira(f));
23    printf("Tamanho: %d\n", fila_tamanho(f));
24    printf("Elemento: %d\n", fila_retira(f));
25    printf("Tamanho: %d\n", fila_tamanho(f));
26    printf("Elemento: %d\n", fila_retira(f));
27    printf("Tamanho: %d\n", fila_tamanho(f));
28    fila_inserir(f, 3);
29    fila_inserir(f, 2);
30    fila_inserir(f, 1);
31    fila_imprimir_tudo(f);
32    return 0;
33}