Métodos Computacionais. Variações de Listas Encadeadas

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

Estruturas de Dados Aula 12: Outras Implementações de Listas 18/04/2011

Fontes Bibliográficas. Listas Circulares. Função Imprime

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

Módulo 10 Listas Encadeadas

Métodos Computacionais. Listas Encadeadas

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

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

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

Aula 14 Listas Duplamente Encadeadas. prof Leticia Winkler

10. Listas Encadeadas

Professora Jeane Melo

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

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

Estrutura de Dados (DPADF 0056)

Instituto de C. Filas. Luis Martí Instituto de Computação Universidade Federal Fluminense -

ÁRVORES ABB (ÁRVORES BINÁRIAS DE BUSCAS) Sérgio Carlos Portari Júnior

Métodos Computacionais. Fila

PRIMEIRA AVALIAÇÃO IDENTIFICAÇÃO. Nome: 22/09/2010

Lista Encadeada Simples. Métodos Computacionais Victor Casé

Listas Lineares. continuando...

Lista com descritor (continuação)

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

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

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

Listas Ligadas (Encadeadas) Listas Simplesmente Encadeadas

Introdução a Programação. Tipos Abstratos de Dados Implementando Pilha e Fila

Listas Encadeadas. Fabrício J. Barth. BandTec - Faculdade de Tecnologia Bandeirantes

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

Estruturas de Dados Aula 17: Estruturas Genéricas 15/06/2011

Estruturas de Dados. Parte dos slides a seguir são adaptações, extensões e recodificações em C dos originais:

Linguagem C: Listas Encadeadas

Lista Encadeada (Linked List)

Computação I - C Prova /10/ Profs. Adriano Cruz e Valeria Bastos

Atividade de laboratório listas encadeadas simples

12. Filas Interface do tipo fila

Métodos Computacionais. Tipos Estruturados

INF 1007 Programação II

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

Algoritmos e Estruturas de Dados II IEC013

Introdução a Programação. Ponteiros para Estruturas, Outros Tipos de Estruturas

INF1007 Programação 2 9 Pilhas. (c) Dept. Informática - PUC-Rio 1

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

2ª Lista de Exercícios

Árvore Binária de Busca. Prof. César Melo

L I C R P * * V O * * A * A F * * * * *

Estruturas de Dados Aula 11: TAD Pilha

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

Departamento de Informática - PUC-Rio INF 1007 Programação 2 P3 23/06/2010

Estruturas de Dados. Módulo 17 - Busca. 2/6/2005 (c) Dept. Informática - PUC-Rio 1

INF 1620 P3-29/06/04 Questão 1 Nome:

Algoritmos e Estruturas de Dados Prof. Osório PIP/CA - Aula 05 Pag.: 1

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

Listas Duplamente Encadeadas

BCC202 - Estrutura de Dados I

Árvores Binária de Busca. Prof. César Melo DCC/ICE/UFAM

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

Estruturas de Dados Filas

INF 1007 Programação II

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches Juliana de Melo Bezerra

Estruturas. struct são coleções de dados heterogêneos agrupados em uma mesma estrutura de dados. Ex: armazenar as coordenadas (x,y) de um ponto:

Módulo 8 Tipos Estruturados

13. ALOCAÇÃO DINÂMICA DE MEMÓRIA

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

BCC202 - Estrutura de Dados I

DAS5102 Fundamentos da Estrutura da Informação

Carlos Eduardo Batista. Centro de Informática - UFPB

3. Linguagem de Programação C

/*(Atenção: Em se tratando de uma lista estaticamente alocada, temos utilizado a estratégia de passa o tamanho máximo do vetor.)*/

INF1007: Programação 2 10 Árvores Binárias. (c) Dept. Informática - PUC-Rio 1

Estruturas de Dados Aula 16: Árvores com Número Variável 13/06/2011

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

Listas ligadas/listas encadeadas

BUSCA EM LISTAS LISTAS SEQÜENCIAIS, LISTAS SIMPLESMENTE E DUPLAMENTE ENCADEADAS E LISTAS CIRCULARES

Árvores. Prof. César Melo DCC/ICE/UFAM

Lista Ordenada. Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação 1 / 35

Prof. Jesus José de Oliveira Neto

PRIMEIRA AVALIAÇÃO IDENTIFICAÇÃO. Nome: 04/05/2011

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

Árvores. Prof. César Melo DCC/ICE/UFAM

Lista com saltos - generalidades

Arvores, Percursos não recursivos, Arvores heterogêneas. Aula 19

ÁRVORE BINÁRIA DE BUSCA

Estrutura de Dados e Algoritmos e Programação e Computadores II. Aula 4: Listas Estáticas e Dinâmicas

DAINF - Departamento de Informática

ESTRUTURA DE DADOS E ALGORITMOS. Árvores Binárias de Busca. Cristina Boeres

Listas: a última das 3 estruturas lineares (Pilhas, Filas e Listas)... árvores e grafos são não lineares!

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C

Aula 05: Listas Encadeadas. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

Conceitos básicos. Computação eletrônica: Gurvan Huiban

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Programação 1. Atribuição, operadores aritméticos, entrada de dados. Técnico em Eletrônica Semestre 5 02

Estrutura de Dados Listas

Princípios de Desenvolvimento de Algoritmos MAC122 Prof. Dr. Paulo Miranda IME USP

Árvores & Árvores Binárias

Transcrição:

Métodos Computacionais Variações de Listas Encadeadas

Variações de Listas Encadeadas Listas podem variar quanto ao: Tipo de encadeamento Simples Circulares Duplas Circulares e Duplas Conteúdo Tipos Primitivos Tipos Estruturados Heterogêneas Já vimos anteriormente 2

Listas Circulares Estrutura do nó da lista é idêntica a da lista simplesmente endadeada Não há noção de primeiro e último nó da lista Para saber se toda lista foi percorrida deve-se guardar o endereço do primeiro nó a ser lido e comparar com o endereço do nó que está sendo lido lista info1 info2 info3 3

Imprimindo uma Lista Circular void lcirc_imprime (Lista* lis) { Lista* p = lis; /* faz p apontar para o nó inicial */ /* testa se lista não é vazia*/ if (p!= NULL) do { printf( %d\n,p->info);/* imprime informação */ p = p->prox; /* avança para o próximo nó */ while (p!= lis); A condição de parada do laço é quando o nó a ser percorrido for igual ao nó inicial 4

lista Lista duplamente encadeada Permite percorrer a lista em dois sentidos Cada elemento deve guardar os endereços do próximo elemento e do elemento anterior Facilita percorrer a lista em ordem inversa Retirada de elemento cujo endereço é conhecido se torna mais simples Acesso ao nó anterior para ajustar encadeamento não implica em percorrer a lista toda info1 info2 info3 info4 5

primeiro Estrutura de Listas Duplamente Encadeadas Armazena o endereço do nó anterior Armazena o endereço do próximo nó fim info1 info1 info1 struct lista2 { int info ; struct lista2 *prox; /* armazena endereço do próximo elemento */ struct lista2 *ant; /* armazena endereço do elemento anterior */ ; typedef struct lista2 Lista2 ; 6

Inserindo Elementos em Listas Duplamente Encadeadas novo lista Inserção no começo da lista info1 info2 info3 Lista2* lst2_insere (Lista2* lista, int v) { Lista2* novo = (Lista2*) malloc(sizeof(lista2)); novo->info = v; novo->prox = lista; novo->ant = NULL; /* verifica se lista não está vazia */ if (lista!= NULL) lista->ant = novo; return novo; 7

Buscando um Elemento em Listas Duplamente Encadeadas Mesma lógica aplicada a listas simplesmente encadeadas Lista2* lst_busca (Lista2* lista, int v) { Lista2* p; for (p = lista; p!= NULL; p = p->prox) if (p->info == v) return p; return NULL;/* não achou o elemento */ 8

primeiro Removendo Elementos de Listas Duplamente Encadeadas Três casos devem ser tratados para a remoção de um elemento da lista info1 info2 info3 info4 Remoção do primeiro elemento da lista primeiro info1 info2 info3 info4 Remoção de um elemento no meio da lista primeiro info1 info2 info3 info4 Remoção de um elemento do fim da lista 9

Removendo Elementos de Listas Duplamente Encadeadas Lista2* lst2_retira (Lista2* lista, int v) { Lista2* p = busca(lista, v); if (p == NULL) return lista; Usando a função de busca if (lista == p) else lista = p->prox; p->ant->prox = p->prox; if (p->prox!= NULL) free(p); p->prox->ant = p->ant; return lista; Retira elemento do começo da lista Retira do meio Só acerta o encadeamento do ponteiro para o anterior se NÃO for o último elemento 10

Lista Circular Duplamente Encadeada Permite percorrer a lista nos dois sentidos, a partir de um ponteiro para um elemento qualquer lista info1 info2 info3 11

Imprimindo no Sentido Inverso com um Lista Circular Duplamente Encadeada void l2circ_imprime_inverso (Lista2* lista){ Lista2* p = lista; if (p!= NULL) do { p = p->ant; printf( %d\n, p->info); while (p!= lista); Avança para o nó anterior 12

Lista de Tipos Estruturados Uma lista pode ser composta de elementos estruturados Considere o tipo Retangulo typedef struct retangulo { float b; /* base */ float h; /* altura */ Retangulo; Podemos definir uma lista cujos nós contenham ou um retângulo ou um ponteiro para um retângulo typedef struct lista { Retangulo info; struct lista *prox; Lista; OU typedef struct lista { Retangulo* info; struct lista *prox; Lista; 13

Alocando um Nó de uma Lista de Tipos Estruturados Nó da lista contém um retângulo Lista* aloca (float b, float h) { Lista *p; p = (Lista*)malloc(sizeof(Lista)); p->info.b = b; p->info.h = h; p->prox = NULL return p; 14

Alocando um Nó de uma Lista de Tipos Estruturados Nó da lista contém um ponteiro para um retângulo Lista* aloca (float b, float h){ Retangulo *r; r = (Retangulo*) malloc(sizeof(retangulo)); Lista* p = (Lista*)malloc(sizeof(Lista)); r->b = b; r->h = h; p->info = r; p->prox = NULL; return p; Espaço para a estrutura Retangulo deve também ser alocado 15

Lista Heterogênea São listas cujos nós possuem conteúdos de tipos distintos Ex: uma lista de figuras geométricas (retângulo, círculo, triângulo, etc.). 16

Representação de Listas Heterogêneas Cada nó da lista será então formado por três campos: identificador do tipo de objeto armazenado no nó; ponteiro para a informação; ponteiro para o próximo elemento. 17

Representação de Listas Heterogêneas /* definição dos identificadores dos tipos dos nós (Retângulo, Triângulo e Circulo) */ #define RET 0 #define TRI 1 #define CIR 2 #define PI 3.1416 /* definição do nó da estrutura */ typedef struct listahet { int tipo ; void *info ; /* Ponteiro Genérico */ struct listahet *prox ; ListaHet; Armazena endereço para qualquer tipo de dado 18

Exemplo de Lista Heterogênea Tipos de estruturas que serão armazenadas na lista heterogênea typedef struct retangulo { float b ; float h ; Retangulo ; typedef struct circulo { float r ; Circulo; typedef struct triangulo { float b ; float h ; Triangulo ; 19

Criando Nós com Retângulos ListaHet* cria_ret (float b,float h ) { Retangulo *r; ListaHet *p; /* aloca retângulo */ r = (Retangulo*) malloc(sizeof(retangulo)) ; r->b = b ; r->h = h ; /* aloca nó */ p = (ListaHet*) malloc(sizeof(listahet)) ; p->tipo = RET ; p->info = r ; p->prox = NULL ; return p ; Atribuição do tipo de estrutura cujo endereço será armazenado no nó da lista 20

Criando Nós com Triângulos ListaHet* cria_tri (float b, float h) { Triangulo *t ; ListaHet *p ; /* aloca triângulo */ t = (Triangulo*) malloc(sizeof(triangulo)) ; t->b = b ; t->h = h ; /* aloca nó */ p = (ListaHet*) malloc(sizeof(listahet)); p->tipo = TRI ; p->info = t ; p->prox = NULL ; return p ; Se o tipo for colocado errado, funções que manipulam a lista terão comportamentos imprevisíveis! 21

Criando Nós com Círculos ListaHet* cria_cir (float r){ Circulo *c ; ListaHet *p ; /* aloca círculo */ c = (Circulo*) malloc(sizeof(circulo)) ; c->r = r ; /* aloca nó */ p = (ListaHet*) malloc(sizeof(listahet)) ; p->tipo = CIR ; p->info = c ; p->prox = NULL ; return p ; 22

Exemplo de Lista Heterogênea Uma vez criados os nós, podemos inseri-los na lista da mesma forma que nas listas definidas anteriormente. As constantes simbólicas que representam os tipos de objetos nos nós, podem ser agrupadas em uma enumeração: enum { RET, TRI, CIR ; 23

Calculando a Área float area (ListaHet *p) { float a ; /* área do elemento */ switch (p->tipo) { case RET : Retangulo *r = (Retangulo*) p-> info ; a = r-> b * r-> h ; break ; case TRI : Triangulo *t = (Triangulo*) p->info ; a = (t->b * t->h)/2 ; break ; case return a ; CIR: Circulo *c = (Circulo *) p-> info ; a = PI * c->r * c->r ; break ; Converte p/ o tipo e calcula a área

Calculando o Elemento que Possui Maior Área float max_area ( ListaHet *lista ){ float ar, amax = 0.0 ; ListaHet *p ; for( p = lista; p!= NULL; p = p->prox ) { ar = area(p) ; /* área do nó */ if (ar > amax) amax = ar ; return amax ; 25