View
219
Download
0
Category
Preview:
Citation preview
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
1/51
Estrutura de DadosCarlos Eduardo Batista
Centro de Informática - UFPB
bidu@ci.ufpb.br
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
2/51
Estruturas de Dados
Listas e Filas
2
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
3/51
Estrututuras de dados
lineares
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
4/51
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
5/51
Pilhas
Operações◦ Empilhar ( push) Insere um novo elemento no topo da pilha
◦ Desempilhar (pop) Recupera e remove um elemento do topo da pilha
5
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
6/51
Listas
6
Lista sequencial
Lista encadeada
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
7/51
Listas
Lista sequencial◦ Acesso a qualquer elemento em tempo
constante◦ Movimentação e inserção custosa◦ Tamanho máximo definido◦ Ideal para: Listas de tamanho conhecido (pequenas),inserção remoção no fim
7
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
8/51
Listas
Lista encadeada◦ Não precisa deslocar elementos nas operações
de inserção e remoção◦ Crescimento em tempo de execução◦ Limite é a memória disponível◦ Acesso a elementos, porém, requer busca
prévia◦ Ideal para: Listas grandes, inserção/remoção no meio, semtamanho máximo definido
8
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
9/51
Listas encadeadas
Ponteiros
9
typedef struct no {
t_elemento dado; // elemento contendo os dadosstruct no * prox; // ponteiro para o proximo elemento
} t_no; // tipo da estrutura
t_no * p;
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
10/51
Listas encadeadas10
free(P);
P = NULL;
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
11/51
Lista encadeada11
// Tipo base dos elementos da lista
typedef struct elementos {char nome[50];
// Outros elementos} t_elemento;
// Estrutura listatypedef struct no {
t_elemento dado; // elemento contendo os dados
struct no * prox; // ponteiro para o proximo elemento
} t_no; // tipo da estrutura
// define t_lista como sendo um outro nome para "t_no *"
typedef t_no* t_lista;
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
12/51
12
t_no * criaNo() {
t_no * no = (t_no*) malloc(sizeof(t_no));
if (no)
no->prox = NULL;
return no;
}
int isVazia(t_lista lista) {
return (lista == NULL);
}
int getTamanho(t_lista lista) {
int n = 0;
while (lista != NULL) {
lista = lista->prox;
n++;}
return n;
}
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
13/51
Lista encadeada13
t_no * getNo(t_lista lista, int pos) {int n = 0;
if (posprox;n++;
}return 0;
}
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
14/51
Lista encadeada14
t_elemento * getElemento(t_lista lista, int pos)
{
t_no * no = getNo(lista, pos);
if (no != NULL)return &(no->dado);
else
return NULL;
}
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
15/51
Lista encadeada15
int getPosicao(t_lista lista, t_elemento dado) {
int n = 0; while (lista != NULL) {
if (compara(lista->dado, dado)==0)return n;
lista = lista->prox;
n++;
}return -1;
}
int compara(t_elemento dado1, t_elemento dado2) {
return strcmp(dado1.nome, dado2.nome);
}
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
16/51
Lista encadeada: implementação16
int inserir(t_lista *lista, int pos, t_elemento dado) {
t_no * p, * novo;
if (pos == 0) {
novo = criaNo();if (novo == NULL)
return 0;
novo->dado = dado;
novo->prox = *lista;
*lista = novo;
return 1;
}
p = getNo(*lista, pos-1);
if (p == NULL)return 0;
novo = criaNo();
if (novo == NULL)
return 0;
novo->dado = dado;novo->prox = p->prox;
p->prox = novo;
return 1;
}
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
17/51
Lista encadeada17
int remover(t_lista *lista, int pos) {
t_no *anterior, *p;
if (isVazia(*lista)) return 0; // erro: lista vazia
if (posprox;
} else { // remocao em qualquer posicao
anterior = getNo(*lista, pos-1);
if (anterior == NULL)return 0; // erro: posicao invalida
p = anterior->prox;
if (p == NULL)
return 0; // erro: posicao invalida
anterior->prox = p->prox;
}
free(p);return 1;
}
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
18/51
Listas
Distribuição na memória◦ Sequencial
◦ Encadeada Tamanho
◦ Estática◦ Dinâmica
Ordenamento◦ Ordenada◦ Desordenada
18
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
19/51
Listas ordenadas
Implementação sequencial ou encadeada Nós ordenados de acordo com os dados
que possuem e uma lógica de ordenação Complexidade de implementação
comparável com as não ordenadas
Diferente apenas na operação de inserção◦ Não é necessário passar a posição de inserção◦ É efetuada uma busca pela posição correta
19
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
20/51
Lista encadeada ordenada20
int getPosicaoInsercaoOrdenada(t_lista lista, t_elemento dado)
{
int n = 0; while (lista != NULL) {
if (compara(lista->dado, dado)>=0)
return n;
lista = lista->prox;
n++;
}
// lista vazia, ou nao achou elemento, retorna posicao zero
return n;
}
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
21/51
Listas encadeadas
Listas circulares
21
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
22/51
Listas circulares
Último elemento aponta para o primeiro, enão mais para NULL
É possível atingir qualquer elemento dalista a partir de qualquer nó.
Convencionalmente utiliza-se como
ponteiro para a lista um ponteiro para oúltimo elemento.◦ Tem-se acesso direto ao “último” e “primeiro”elemento.
22
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
23/51
Lista encadeada23
Lista duplamente encadeada
Lista circular duplamente encadeada
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
24/51
Lista duplamente encadeada24
// Tipo base dos elementos da lista
typedef struct elementos {
char nome[50];
} t_elemento;
// Estrutura lista
typedef struct no {
struct no * anterior; // ponteiro para o proximo elemento
t_elemento dado; // elemento contendo os dados
struct no * prox; // ponteiro para o proximo elemento
} t_no; // tipo da estrutura
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
25/51
Lista duplamente encadeada
É possível percorrer a lista em ordeminversa
O nó atual acessa o antecessor e osucessor
Último e primeiro nós são equivalentes
Desvantagem: Mais memória com oponteiro extra
25
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
26/51
Filas
Conjunto de itens onde o acesso aelementos é feito em uma extremidade
(início da fila) e as inserções deelementos são realizadas na outraextremidade (final da fila)
First in, first out (FIFO) Lista linear em que a inserção é feitanuma extremidade e a eliminação na
outra.
26
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
27/51
Filas
Fila de um banco Fila do cinema
Fila de atendimento◦ Quem primeiro entrar na fila, é o primeiro a seratendido (a sair da fila).
Grupo de carros esperando sua vez para passarno pedágio
Gerenciador de impressão num ambientemultiusuário (impressora compartilhada) Escalonamento de tarefas: fila de processos
aguardando os recursos do sistema operacional. Fila de pacotes a serem transmitidos numa rede
de computadores
27
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
28/51
Filas
Implementação◦ Realizada a partir de uma lista com duas
cabeças (ponteiros).◦ A implementação encadeada dinâmica tornamais simples as operações de inserção eremoção.
◦ Já a implementação sequencial é um poucomais complexa, mas pode ser usada quandohá previsão do tamanho máximo da fila.
28
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
29/51
Filas
Fila sequencial◦ Um vetor de elementos
◦ Um campo para controlar o início da fila◦ Outro campo para controlar o final da fila
29
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
30/51
Filas30
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
31/51
Filas
Existem mais dois elementos livres na fila,mas nenhum outro elemento pode ser
inserido Fila.final chegou à condição de limite (MAX -1)
Podemos chegar à situação absurda em quea fila está vazia, mas nenhum elemento novopode ser inserido
A representação sequencial descritaanteriormente não é adequada
31
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
32/51
Filas
Problemas… Existem mais dois elementos livres na fila,
mas nenhum outro elemento pode serinserido
Fila.final chegou à condição de limite (MAX -1)
Podemos chegar à situação absurda em que
a fila está vazia, mas nenhum elemento novopode ser inserido. Conclusão: A representação sequencial
descrita anteriormente não é adequada!
32
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
33/51
Fila circular33
Forçar final a usar oespaço liberado na
frente Para permitir a
reutilização dasposições já ocupadas,usa-se o conceito deFila Circular
x x x x x
fim inicio
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
34/51
Fila circular
Fila cheia? Quando o fim == (inicio-1) ou Se o inicio for zero? Quando o fim == (MAX-1); O ponteiro do fim não pode passar pelo
do inicio;
34
x x x x x
fim inicio
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
35/51
Filas - Implementação
Operações◦ Criar fila
◦ Verificar se fila está vazia◦ Verificar se fila está cheia◦ Inserir item na fila◦ Remover item da fila
◦ Exibir fila◦ Esvaziar fila
35
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
36/51
Fila sequencial36
// tamanho maximo da fila
#define MAX 5
// Tipo base dos elementos da filatypedef struct elementos {
char nome[50];
} t_elemento;
typedef struct fila {
t_elemento vetor[MAX]; // vetor que armazena a fila
int inicio; // posicao do primeiro elemento
int fim; // posicao do ultimo elemento
int quant_element; // numero de elementos da fila
} t_fila;
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
37/51
Fila sequencial37
t_fila criar()
{
t_fila fila;
fila.inicio = 0;
fila.fim = -1;
fila.quant_element = 0;
return fila;
}
int isVazia (t_fila * fila){
return (fila->quant_element == 0);
}
int isCheia(t_fila * fila)
{return (fila->quant_element == MAX);
}
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
38/51
Fila sequencial38
int inserir (t_fila * fila, t_elemento valor)
{
if (isCheia(fila))return 0;
(fila->quant_element)++;fila->fim = (fila->fim + 1) % MAX;
fila->vetor[fila->fim] = valor;
return 1;
}
t_elemento remover(t_fila * fila)
{
t_elemento valor = { "" } ;if (isVazia(fila))
return valor; // Erro: fila vazia
valor = fila->vetor[fila->inicio];
fila->vetor[fila->inicio].nome[0] = '\0';// zera, opcional
(fila->quant_element)--;
fila->inicio = (fila->inicio + 1) % MAX;return valor;
}
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
39/51
Fila sequencial39
void exibir(t_fila * fila) {
int i;
if (isVazia(fila)) {
printf("Fila vazia\n");
return;}
printf("\nExibindo fila:\n");
printf("inicio: %d\n", fila->inicio);
printf("fim: %d\n", fila->fim);
for (i=0 ; ivetor[i].nome);
}
}
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
40/51
Fila encadeada
Lista simplesmente encadeada “especial” Para remover da fila, implementa-se uma
função que retira sempre do início Para inserir na fila, implementa-se uma
função que acrescenta sempre no final
40
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
41/51
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
42/51
Fila encadeada
Características◦ Ponteiro para o primeiro nó;
◦ Ponteiro para o último nó;◦ Informação sobre a quantidade de elementosda lista.
42
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
43/51
Fila encadeada
Operações◦ Criar fila
◦ Verificar se fila está vazia◦ Inserir item na fila◦ Remover item da fila◦ Exibir fila
◦ Esvaziar fila
43
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
44/51
Fila encadeada44
// Tipo base dos elementos da lista
typedef struct elementos {
char nome[50];
} t_elemento;
typedef struct no {
t_elemento dado;
struct no * prox;
} t_no;
typedef struct fila {t_no* inicio;
int quant_element;
t_no* final;
} t_fila;
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
45/51
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
46/51
Fila encadeada46
int isVazia (t_fila * fila)
{
return (fila->quant_element == 0);
}
int inserir (t_fila *fila, t_elemento valor) {
t_no *novo;
novo = criaNo();
if (novo == NULL)
return 0; // Erro: memoria insuficiente
novo->dado = valor;if (isVazia(fila))
fila->inicio = novo;
else
(fila->final)->prox = novo;
fila->final = novo;
fila->quant_element++;
return 1;}
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
47/51
Fila encadeada47
t_elemento remover (t_fila *fila)
{
t_no *aux;
t_elemento valor = { "" } ;
if (isVazia(fila))return valor; // Erro: fila vazia
valor = (fila->inicio)->dado;
if (fila->inicio == fila->final)
fila->final = NULL;
aux = fila->inicio;
fila->inicio = (fila->inicio)->prox;
free(aux);
fila->quant_element--;
return valor;
}
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
48/51
Fila de prioridade
Filas de prioridade – A fila fica ordenada por ordem de prioridade. – A operação de inserção não insere somente no final, pode
ser em qualquer posição obedecendo a ordem deprioridade. – A operação de remoção remove sempre o primeiro
elemento. – Implementação:
• Remoção rápida: O(1)• Inserção lenta: O(n), ou O(log n). Depende da
implementação. Para atingir O(log n) teria que serimplementada usando árvores na implementaçãoencadeada; ou busca binária na implementaçãosequencial.
48
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
49/51
Próximas aulas
Estruturas de dados não lineares
49
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
50/51
Referências
Notas de Aula do Prof. Bruno B. Boniati Notas de Aula do Prof. João Luís Garcia
Rosa Notas de Aula do Prof. Derzu Omaia
50
https://code.google.com/p/learnc/
8/17/2019 Estrutura de Dados Listas e Filas - .pdf
51/51
Estrutura de DadosCarlos Eduardo Batista
Centro de Informática - UFPBbidu@ci.ufpb.br
Recommended