Estrutura de Dados Listas e Filas - .pdf

download Estrutura de Dados Listas e Filas - .pdf

of 51

Transcript of Estrutura de Dados Listas e Filas - .pdf

  • 8/17/2019 Estrutura de Dados Listas e Filas - .pdf

    1/51

    Estrutura de DadosCarlos Eduardo Batista

    Centro de Informática - UFPB

    [email protected]

  • 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 - [email protected]