FilasEncadeadas
Estruturas de Dados I
Universidade Luterana do Brasil
Prof Fabiana Lorenzi
Filas
● FIFO - First in first out
● O primeiro a entrar é o primeiro a sair
● Dentre os elementos que ainda permanecem no conjunto, o
primeiro elemento a ser retirado é o primeiro que foi
inserido
● Toda fila deve ter uma começo e um final (usar variáveis
para indicar cada um deles)
2
Exemplosdefilas
fila de impressão
fila de banco
3
Operaçõespossíveisemumafila
O acesso a uma fila é realizado somente de 2 formas:
Enfileirar
(inserir um novo elemento no final da fila).
Desenfileirar
(remover o elemento do início da fila).
4
Filasencadeadas
Registro tfila
inteiro dado
registro tfila *próximo
fim
5
FilasencadeadascomHeader
Registro tfila
inteiro dado
registro tfila *próximo
fim
Registro header
registro tfila *começo
inteiro qtde
registro tfila *final
fim 6
Enfileiras-filasencadeadas
Procedimento Enfileira (ref registro header *F; inteiro
valor; ref inteiro sinal);
inicio
registro tfila *aux, *p
aloca(p);
se (p = nulo)
entao sinal = 0
senao inicio
p->dado = valor
p->próximo = nulo
aux = F->final
F->final = p
se (F->começo = nulo) {Se fila estiver vazia....}
entao
F->começo = p
senao sinal = 1
aux->próximo = p; fim
F->qtde++ fim 7
Enfileirarsemheader-emC
void enfileirar(nodo **fila, int valor) {
nodo *aux;
nodo *p = (nodo *)malloc(sizeof(nodo));
p->dados = valor;
p->proximo = NULL;
if(*fila == NULL)
{ // Fila vazia
*fila = p;
} else {
aux = *fila;
while(aux->proximo != NULL)
{
aux = aux->proximo;
}
aux->proximo = p;
}
} 8
Desenfileirar-filasencadeadascom
HeaderFuncao Desenfileira (ref registro header *F; ref inteiro
sinal)
inicio
inteiro valor=0
registro tfila *aux
se (F->comeco = nulo)
entao sinal = 0
senao inicio
aux = F->comeco
valor = aux->dado
F->comeco = aux->proximo
se (aux = F->final)
entao F->final = nulo
libera(aux)
F->qtde--
sinal = 1
fim
retorna valor
fim
9
Desenfeileirarsemheader-emC
int desenfileirar(nodo **fila) {
int valor;
struct nodo *aux;
aux = *fila;
valor = aux->dados;
*fila = aux->proximo;
free(aux);
return valor;
}
10
Exercício
1) Escrever as seguintes subrotinas para a manipulação de
uma fila encadeada (sem header):
a) Procedimento para a inclusão de um novo na fila;
b) Função para a remoção de um valor da fila
c) Procedimento para exibir o conteúdo da fila;
d) Função que retorna true se a fila estiver vazia;
2) Faça um programa em C que utilize as subrotinas criadas
na questão anterior.
11
Exercício
3) Escreva um programa que recebe um número indeterminado de
valores positivos e negativos (sai quando o usuário digitar
0) e:
- se o valor digitado for negativo, remove o primeiro
elemento da fila;
- se o valor digitado já existir na fila, remover a
primeira ocorrência dele na fila.
12

Filas encadeadas

  • 1.
    FilasEncadeadas Estruturas de DadosI Universidade Luterana do Brasil Prof Fabiana Lorenzi
  • 2.
    Filas ● FIFO -First in first out ● O primeiro a entrar é o primeiro a sair ● Dentre os elementos que ainda permanecem no conjunto, o primeiro elemento a ser retirado é o primeiro que foi inserido ● Toda fila deve ter uma começo e um final (usar variáveis para indicar cada um deles) 2
  • 3.
  • 4.
    Operaçõespossíveisemumafila O acesso auma fila é realizado somente de 2 formas: Enfileirar (inserir um novo elemento no final da fila). Desenfileirar (remover o elemento do início da fila). 4
  • 5.
  • 6.
    FilasencadeadascomHeader Registro tfila inteiro dado registrotfila *próximo fim Registro header registro tfila *começo inteiro qtde registro tfila *final fim 6
  • 7.
    Enfileiras-filasencadeadas Procedimento Enfileira (refregistro header *F; inteiro valor; ref inteiro sinal); inicio registro tfila *aux, *p aloca(p); se (p = nulo) entao sinal = 0 senao inicio p->dado = valor p->próximo = nulo aux = F->final F->final = p se (F->começo = nulo) {Se fila estiver vazia....} entao F->começo = p senao sinal = 1 aux->próximo = p; fim F->qtde++ fim 7
  • 8.
    Enfileirarsemheader-emC void enfileirar(nodo **fila,int valor) { nodo *aux; nodo *p = (nodo *)malloc(sizeof(nodo)); p->dados = valor; p->proximo = NULL; if(*fila == NULL) { // Fila vazia *fila = p; } else { aux = *fila; while(aux->proximo != NULL) { aux = aux->proximo; } aux->proximo = p; } } 8
  • 9.
    Desenfileirar-filasencadeadascom HeaderFuncao Desenfileira (refregistro header *F; ref inteiro sinal) inicio inteiro valor=0 registro tfila *aux se (F->comeco = nulo) entao sinal = 0 senao inicio aux = F->comeco valor = aux->dado F->comeco = aux->proximo se (aux = F->final) entao F->final = nulo libera(aux) F->qtde-- sinal = 1 fim retorna valor fim 9
  • 10.
    Desenfeileirarsemheader-emC int desenfileirar(nodo **fila){ int valor; struct nodo *aux; aux = *fila; valor = aux->dados; *fila = aux->proximo; free(aux); return valor; } 10
  • 11.
    Exercício 1) Escrever asseguintes subrotinas para a manipulação de uma fila encadeada (sem header): a) Procedimento para a inclusão de um novo na fila; b) Função para a remoção de um valor da fila c) Procedimento para exibir o conteúdo da fila; d) Função que retorna true se a fila estiver vazia; 2) Faça um programa em C que utilize as subrotinas criadas na questão anterior. 11
  • 12.
    Exercício 3) Escreva umprograma que recebe um número indeterminado de valores positivos e negativos (sai quando o usuário digitar 0) e: - se o valor digitado for negativo, remove o primeiro elemento da fila; - se o valor digitado já existir na fila, remover a primeira ocorrência dele na fila. 12