Algoritmos e Estruturas de Dados I

Documentos relacionados
Algoritmos e Estruturas de Dados I

A regra de acesso aos dados de uma fila é a seguinte: O primeiro elemento que entra (na fila) é o primeiro que sai (FIFO first in, first out).

1. Listas sequenciais versus listas ligadas. Lista sequencial

Estruturas de Dados Aula 10: Listas (parte 2) 19/04/2011

REVISÃO DE PILHAS E FILAS. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Algoritmos e Estruturas de Dados I

Listas - Outras. Listas Circulares Nós Cabeça Listas Duplamente Ligadas/Encadeadas Aplicações

Pilhas e Filas. Algoritmos e Estruturas de Dados Flavio Figueiredo (

SCC 202 Prova 1. 28/9/2010 Resolução e Comentários

Estruturas de Dados Filas

Listas Estáticas. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.

Fila e Deque. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.

Atividade de laboratório listas encadeadas simples

Estrutura de Dados. Carlos Eduardo Batista. Centro de Informática - UFPB

Curso de Programação C em Ambientes Linux Aula 05

Aula 14 Listas Duplamente Encadeadas. prof Leticia Winkler

TAD: Tipo Abstrato de Dados (parte 2)

TAD: Tipo Abstrato de Dados (parte 2)

Listas Ligadas (Encadeadas) Listas Simplesmente Encadeadas

12. Filas Interface do tipo fila

Tipos abstratos de dados; pilhas e filas

Lista Encadeada (Linked List)

struct Nodo { int struct Nodo struct Nodo typedef struct Nodo *PNodo; int ConstruirLista (PNodo *H, PNodo *T) { int Criar

Módulo 10 Listas Encadeadas

Algoritmos e Estruturas de Dados: Lista Duplamente Encadeada

REVISÃO DE C. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

LISTAS ENCADEADAS OU NÃO- SEQÜENCIAIS. Estrutura de Dados

INF 1620 P2-01/11/03 Questão 1 Nome:

AULA 12 ESTRUTURA DE DADOS

Algoritmos e Estruturas de Dados I

Introdução a Programação. Listas Encadeadas

Estrutura de Dados Listas

Matrizes Esparsas. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista

Linguagem C: Listas Encadeadas

Algoritmos e Estruturas de Dados II IEC013

Aplicações de listas e outras estruturas. SCC-502 Algoritmos e Estruturas de Dados I

Estruturas de Dados Aula 11: TAD Pilha

Filas. Prof. Rui Jorge Tramontin Jr. UDESC - Rui J. Tramontin Jr. 1

Árvores Binárias Balanceadas Estrutura de Dados I

Pilhas e Filas Encadeadas. Algoritmos e Estruturas de Dados I

Estruturas de Dados. Módulo 11 Pilhas. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Programação II. Listas Encadeadas (Linked Lists) Bruno Feijó Dept. de Informática, PUC-Rio

Listas Lineares. continuando...

Tipos Abstratos de Dados

Tipos Abstratos de Dados TADs

INF 1007 Simulado P2 Nome: Instruções

Algoritmos e Estruturas de dados

Instituto de C. Linguagem C: Listas. Luis Martí Instituto de Computação Universidade Federal Fluminense -

CES-11. Pilhas Definição Operações Filas. Operações Deques. Definição. Operações

Tipos Abstratos de Dados

Tipos Abstratos de Dados

Listas: nós de cabeçalho, listas não homogêneas, listas generalizadas

Programação de Computadores II. Cap. 9 Tipos Abstratos de Dados (TAD)

Fila. Algoritmos e Estruturas de Dados I

Filas. Nesta aula veremos o ADT fila Em um computador existem muitas filas esperando pela impressora, acesso ao disco ou, num sistema timesharing,

Filas Implementação Sequencial

Fila. 26 e 31/8/2008 Representação/Implementação: Seqüencial estática Encadeada dinâmica Exercícios/Aplicações

UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 5 Pilhas

Computação 2. Aula Profª. Fabiany Listas Duplamente Encadeadas

Filas. Prof. Túlio Toffolo BCC202 Aula 12 Algoritmos e Estruturas de Dados I

Aula 10 Alocação Dinâmica de Memória Listas Encadeadas. prof Leticia Winkler

INF1007: Programação 2 8 Listas Encadeadas. (c) Dept. Informática - PUC-Rio 1

Listas Encadeadas. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

Carlos Eduardo Batista. Centro de Informática - UFPB

Alocação de Memória. Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR)

Transcrição:

Algoritmos e Estruturas de Dados I Prof. Daniel M. Martin (daniel.martin@ufabc.edu.br) Aula 6

Modularização Método que consiste em organizar programas grandes em pequenas partes (módulos) Cada módulo tem uma interface bem definida Em C é feita por meio de um arquivo.h Possui as estruturas (structs) utilizadas Possui cabeçalho (declaração) de funções Cada módulo tem uma implementação Em C é feita por meio de um arquivo.c

Vantagens da modularização: Módulos podem ser reusados em vários projetos Mudar a implementação de um módulo não afeta o programa principal (desde que a interface não mude) Mais rápido de recompilar o projeto quando apenas um módulo (ou apenas o programa principal) for modificado Mais fácil de debugar (você pode testar cada módulo separadamente)

Modularização em C main.c compilador executável Interface: modulo1.h Implementação: modulo1.c Interface: modulo2.h Implementação: modulo2.c

Lista Ligada Interface Deve conter as estruturas: typedef struct s_no *p_no; struct s_no { item dado; p_no prox; }; Deve conter as funções: p_no cria_no(item a); void libera(p_no x); void insere_inicio(p_no *pl, p_no y); p_no remove_inicio(p_no *pl); p_no busca(p_no L, item a);

Item Interface Deve conter a declaração de tipo: typedef int item;

Interface: item.h #ifndef ARQUIVO_ITEM_H #define ARQUIVO_ITEM_H typedef int item; #endif

Interface: lista.h #include "item.h" #ifndef ARQUIVO_LISTA_H #define ARQUIVO_LISTA_H typedef struct s_no *p_no; struct s_no { item dado; p_no prox; };

Interface: lista.h (cont.) p_no cria_no(item a); void libera(p_no x); void insere_inicio(p_no *pl, p_no y); p_no remove_inicio(p_no *pl); p_no busca(p_no L, item a); #endif

Implementação: lista.c #include <stdio.h> #include <stdlib.h> #include "item.h" #include "lista.h" void insere_inicio(p_no *pl, p_no y) { y->prox = *pl; *pl = y; } void libera(p_no x) { if (x!= NULL) free(x); }

Implementação: lista.c (cont.) p_no cria_no(item a) { p_no x = (p_no) malloc(sizeof(struct s_no)); if (x == NULL) { printf("memória insuficiente.\n"); exit(exit_failure); } x->dado = a; } return x;

Implementação: lista.c (cont.) p_no remove_inicio(p_no *pl) { p_no x = *pl; if (*pl!= NULL) *pl = (*pl)->prox; } return x;

Implementação: lista.c (cont.) p_no busca(p_no L, item a) { p_no t; for (t = L; t!= NULL; t = t->prox) if (t->dado == a) return t; } return NULL;

Implementação: main.c #include <stdio.h> #include <stdlib.h> #include "item.h" #include "lista.h" int main() { p_no t, L = NULL, x, y, z; x = cria_no(20); y = cria_no(17); z = cria_no(23);

Implementação: main.c (cont.) insere_inicio(&l, x); insere_inicio(&l, y); insere_inicio(&l, z); for (t = L; t!= NULL; t = t->prox) printf("%d ", t->dado); } printf("\n"); libera(x); libera(y); libera(z); return 0;

Compilando e excutando o código Num terminal linux faça: gcc lista.c main.c -o proglistas./proglistas Usando o Code::Blocks ou o Dev C++ faça: Adicione no projeto todos os arquivos.h Adicione no projeto todos os arquivos.c Compile e execute normalmente

Listas Ligadas Uso de Memória Chamar malloc para criar cada nó é lento Alternativa: manter uma lista ligada de nós "livres" ou disponíveis A mudança na interface lista.h é acrescentar void inicializa_lista(int n); O programa principal main.c deve chamar inicializa_lista(10); antes de chamar a função cria_no(...);

Implementação: lista.c A implementação lista.c também cresce: p_no disp; void inicializa_lista(int n) { disp = (p_no) malloc(n * sizeof(struct s_no)); if (disp == NULL) { /* testa falha */ } for (i = 0; i < n; i ++) disp[i].prox = &disp[i + 1]; } disp[n - 1].prox = NULL;

Implementação: lista.c p_no cria_no(item a) { p_no t = disp; disp = disp->prox; t->dado = a; return t; } void libera(p_no x) { x->next = disp; disp = x; }

Simulação p_no x, y, L = NULL; inicializa_lista(7); x = cria_no(20); y = cria_no(17); insere_inicio(&l, x); insere_inicio(&l, y); libera(x); libera(y);

Listas Circulares São listas ligadas onde o último elemento não aponta para NULL, mas aponta de volta para o primeiro elemento da lista. Se a lista tem um único elemento, o campo prox dele deve apontar para si mesmo.

Listas Circulares Operações primeira inserção de um nó t na lista: L = t; L->prox = L; demais inserções: t->prox = L->prox; L->prox = t; percorrer a lista: t = L; do {... t = t->prox;} while (t!= L); remover L->prox da lista: if (L!= NULL && L->prox!= L) L->prox = L->prox->prox; else L = NULL;

Listas Duplamente Ligadas São listas que possuem, além do ponteiro para o próximo nó, um ponteiro para o nó anterior Ocupam mais memória, mas dependendo da aplicação permite a utilização de algoritmos mais rápidos

Listas Duplamente Ligadas São listas que possuem, além do ponteiro para o próximo nó, um ponteiro para o nó anterior Ocupam mais memória, mas dependendo da aplicação permite a utilização de algoritmos mais rápidos NULL L NULL

Filas

Filas Seqüência dinâmica de objetos Todos os objetos são do mesmo tipo (assim como nos vetores e listas ligadas) O que caracteriza a fila é a ordem de remoção dos elementos: Se algum elemento é removido, deve ser aquele que está na fila a mais tempo

Filas Seqüência dinâmica de objetos Todos os objetos são do mesmo tipo (assim como nos vetores e listas ligadas) O que caracteriza a fila é a ordem de remoção dos elementos: Se algum elemento é removido, deve ser aquele que está na fila a mais tempo FIFO first-in first-out o primeiro elemento a entrar numa fila é também o primeiro a sair

Como implementar uma fila? Se você sabe que não mais do que n elementos serão inseridos (e removidos) da fila, você pode usar um vetor v de n elementos Dois inteiros in e fn podem ser usados para indicar o início e o final da fila in fn

Simulação (na lousa) aloca v com espaço para 10 elementos insere 23 insere 18 remove insere 13 insere 34 remove insere 55

Outra implementação de fila Se você sabe que, em qualquer instante durante a execução do programa, a fila não tem mais que n elementos (embora o número de inserções possa ser muito maior que n), então você pode usar um vetor circular v com n posições

Outra implementação de fila Se você sabe que, em qualquer instante durante a execução do programa, a fila não tem mais que n elementos (embora o número de inserções possa ser muito maior que n), então você pode usar um vetor circular v com n posições Como assim? Vetor circular?

Implementação com vetor circular Aloca um vetor v com capacidade para n + 1 elementos Usa in e fn como feito antes Trata v como um vetor circular, ou seja etc... v[n + 1] = v[0] v[n + 1] = v[1]

Implementação com vetor circular 13 14 0 12 1 in 11 10 2 3 9 4 8 7 6 5 fn

Simulação (na lousa) aloca v[10] insere 23 insere 18 remove insere 13 insere 34 remove insere 55 insere 78 insere 41 remove remove insere 16 insere 12 insere 98 insere 45 remove remove insere 5 insere 37

Interface: fila.h #include "item.h" #ifndef ARQUIVO_FILA_H #define ARQUIVO_FILA_H struct s_fila { int N; // capacidade da fila + 1 item *v; // vetor circular de itens int in, fn; }; typedef struct s_fila *p_fila;

Interface: fila.h (cont.) void inicializa_fila(p_fila F, int n); int fila_vazia(p_fila F); void enfileira(p_fila F, item a); item desenfileira(p_fila F); #endif

Implementação: fila.c #include <stdio.h> #include <stdlib.h> #include "item.h" #include "fila.h" int fila_vazia(p_fila F) { return F->in % F->N == F->fn; }

Implementação: fila.c (cont.) void inicializa_fila(p_fila F, int n) { F->v = (item *) malloc((n + 1) * sizeof(item)); if (F->v == NULL) { /* testa falha */} } F->N = n + 1; F->in = F->N; F->fn = 0; // pode ser 0 também

Implementação: fila.c (cont.) void enfileira(p_fila F, item a) { F->v[F->fn ++] = a; F->fn %= F->N; } item desenfileira(p_fila F) { F->in %= F->N; return F->v[F->in ++]; }

Outra implementação de fila Se o tamanho de uma fila pode crescer indefinidamente, você pode usar uma lista ligada para implementar uma fila Mas como?

Outra implementação de fila Se o tamanho de uma fila pode crescer indefinidamente, você pode usar uma lista ligada para implementar uma fila Mas como? Usando uma lista duplamente ligada?

Outra implementação de fila Se o tamanho de uma fila pode crescer indefinidamente, você pode usar uma lista ligada para implementar uma fila Mas como? Usando uma lista duplamente ligada? NÃO PRECISA!!!

Outra implementação de fila Matenho um ponteiro il para o primeiro nó da lista e um nó fl para o último nó da lista. No início: il = fl = NULL;

Outra implementação de fila Matenho um ponteiro il para o primeiro nó da lista e um nó fl para o último nó da lista. No início: il = fl = NULL; Para inserir item a numa fila vazia faça: il = fl = cria_no(a); Para demais inserções faça: fl->prox = cria_no(a); fl = fl->prox; Para remover um item faça: y = il; il = il->prox; // devolve y

Aplicação de Fila Calcular a distância entre pessoas no Facebook

Aplicação de Fila Calcular a distância entre pessoas no Facebook Amanda Paul