#include "fila.h" #define new(type,count) (type *) calloc(count,sizeof(type)) #define alocaverifica(elemento,tipo,numero,nfuncao) if ( (elemento = new(tipo,numero)) == NULL) comTrataErro(MSG1,nfuncao); /* Cria fila vazia. */ Fila *filCria() { Fila *f = NULL; alocaverifica(f,Fila,1,"filCria") else { f->prox = f; } return f; } /* Destrói fila. */ void filDestroi(Fila **f) { Fila *n, *o; n = (*f)->prox; while ( n != (*f) ) { o = n; n = n->prox; free(o); } free(*f); } /* Insere elemento x. */ void filInsere(Fila **f, int x) { Fila *n = NULL; Fila *tmp = NULL; if ( f == NULL ) comAviso(AVS1,"filInsere"); else { alocaverifica(n,Fila,1,"filInsere") else { n->info = x; tmp = (*f)->prox; (*f)->prox = n; n->prox = tmp; (*f) = (*f)->prox; } } } /* Remove elemento do início da fila. */ int filRemove(Fila **f) { int itmp = INT_MIN; Fila *ftmp = NULL; if ( f == NULL ) comAviso(AVS1,"filRemove"); else { if ( (*f)->prox == (*f) ) comAviso(AVS2,"filRemove"); else { itmp = (((*f)->prox)->prox)->info; ftmp = (((*f)->prox)->prox); ((*f)->prox)->prox = ftmp->prox; if ( ftmp == (*f) ) { (*f) = (*f)->prox; } free(ftmp); } } return itmp; } /* Retorna true se a fila estiver vazia e false no caso contrário. */ bool filVazia(Fila *f) { return ( f->prox == f ); } /* Retorna o ponteiro para o elemento x, se este for encontrado, e NULL no caso contrário. Usa busca linear obviamente e o nó-cabeça como sentinela. */ Fila *filBusca(Fila *f, int x) { Fila *n = NULL; if ( f == NULL ) comAviso(AVS1,"filBusca"); else { if ( f->prox != f ) { n = (f->prox)->prox; while ((n != (f->prox)) && (n->info != x)) { n = n->prox; } if (n->info != x) n = NULL; } } return n; } /* author: Gustavo Sverzut Barbieri (http://www.gustavobarbieri.com.br) */