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

Documentos relacionados
Módulo 10 Listas Encadeadas

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

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

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

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

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

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

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

Métodos Computacionais. Listas Encadeadas

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

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

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

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

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

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

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

Estrutura de Dados. Ricardo José Cabeça de Souza Parte 9

INF1007: Programação 2. 4 Tipos Estruturados. 10/23/09 (c) Dept. Informática - PUC-Rio 1

INF 1007 Programação II

Módulo 14 - Estruturas genéricas

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

Listas Ligadas (Encadeadas) Listas Simplesmente Encadeadas

Módulo 8 Tipos Estruturados

Listas Lineares. continuando...

12. Filas Interface do tipo fila

Lista Encadeada (Linked List)

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

Estruturas de Dados Filas

Estruturas de Dados. Módulo 4 Funções. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

INF1007: Programação 2 6 Ordenação de Vetores. 01/10/2015 (c) Dept. Informática - PUC-Rio 1

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

Módulo 18 - Tabelas de Dispersão. Referências

Módulo 5 Vetores e Alocação Dinâmica

INF1007: Programação 2. 2 Alocação Dinâmica. 17/02/2014 (c) Dept. Informática - PUC-Rio 1

INF 1007 Programação II

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

Aula 14 Listas Duplamente Encadeadas. prof Leticia Winkler

10. Listas Encadeadas

Estrutura de Dados (DPADF 0056)

INF 1007 Programação II

Lista Encadeada Simples. Métodos Computacionais Victor Casé

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

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

Professora Jeane Melo

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

Programação de Computadores II. Cap. 4 Funções

Métodos Computacionais. Fila

Programação de Computadores II. Cap. 5 Alocação Dinâmica

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

Linguagem C: Listas Encadeadas

BCC202 - Estrutura de Dados I

Tipos Abstratos de Dados (TAD)

INF P4-12/12/09 Questão 1 Nome:

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

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

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

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

Módulo 7 Cadeias de Caracteres

Estrutura de Dados Listas

Programação de Computadores II. Cap. 17 Busca

INF1007: Programação 2 9 Tipos Abstratos de Dados. (c) Dept. Informática - PUC-Rio 1

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

Programação II. Filas (Queues) Bruno Feijó Dept. de Informática, PUC-Rio

1. Listas sequenciais versus listas ligadas. Lista sequencial

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

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

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Tabelas de Dispersão (hash tabels)

Programação de Computadores II. Cap. 7 Cadeias de Caracteres

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

Programação de Computadores II. Cap. 5 Vetores

Listas Lineares Ordenadas

INF 1007 Programação II

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

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

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

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

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).

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

Prof. Jesus José de Oliveira Neto

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

Estruturas de Dados Aula 11: TAD Pilha

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

Módulo 16 - Ordenação

Atividade de laboratório listas encadeadas simples

INF1007: Programação 2. 0 Revisão. 06/08/2015 (c) Dept. de Informática - PUC-Rio 1

Introdução à Programação

Estruturas de Dados Aula 14: Recursão

Programação II. Vetores e Alocação Dinâmica. Bruno Feijó Dept. de Informática, PUC-Rio

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

Estruturas de Dados Aula 14: Recursão 19/05/2011

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

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

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

Transcrição:

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

Tópicos Principais Motivação Listas encadeadas Implementações recursivas Listas de tipos estruturados (c) Dept. Informática - PUC-Rio 2

Tópicos Complementares Listas circulares Listas duplamente encadeadas Listas heterogêneas (c) Dept. Informática - PUC-Rio 3

Motivação Vetor ocupa um espaço contíguo de memória permite acesso randômico aos elementos deve ser dimensionado com um número máximo de elementos VETOR (c) Dept. Informática - PUC-Rio 4

Motivação Estruturas de dados dinâmicas: crescem (ou decrescem) à medida que elementos são inseridos (ou removidos) Exemplo: listas encadeadas: amplamente usadas para implementar outras estruturas de dados (c) Dept. Informática - PUC-Rio 5

Listas Encadeadas lst Info1 Info2 Info3... NULL InfoN Lista encadeada: seqüência encadeada de elementos, chamados de nós da lista nó da lista é representado por dois campos: a informação armazenada e o ponteiro para o próximo elemento da lista a lista é representada por um ponteiro para o primeiro nó o ponteiro do último elemento é NULL (c) Dept. Informática - PUC-Rio 6

Estrutura com ponteiro para ela mesma struct elemento { int info; void*... struct prox; elemento* prox; ; typedef struct elemento Elemento; info info (c) Dept. Informática - PUC-Rio 7

Exemplo: Lista de inteiros struct elemento { int info; struct elemento* prox; ; typedef struct elemento Elemento; 1. Lista é uma estrutura auto-referenciada, pois o campo prox é um ponteiro para uma próxima estrutura do mesmo tipo. 2. uma lista encadeada é representada pelo ponteiro para seu primeiro elemento, do tipo Elemento* (c) Dept. Informática - PUC-Rio 8

Exemplo: Lista de inteiros (outra forma) typedef struct elemento Elemento; struct elemento { int info; Elemento* prox; ; (c) Dept. Informática - PUC-Rio 9

Listas Encadeadas de inteiros: Criação /* função de criação: retorna uma lista vazia */ Elemento* lst_cria (void) { return NULL; NULL Cria uma lista vazia, representada pelo ponteiro NULL (c) Dept. Informática - PUC-Rio 10

Listas encadeadas de inteiros: Inserção aloca memória para armazenar o elemento encadeia o elemento na lista existente novo lst val Info1 Info2 Info3 /* inserção no início: retorna a lista atualizada */ Elemento* lst_insere (Elemento* lst, int val) { Elemento* novo = (Elemento*) malloc(sizeof(elemento)); novo->info = val; novo->prox = lst; return novo; lst = lst_insere(lst, 23); /* insere na lista o elemento 23 */ (c) Dept. Informática - PUC-Rio 11

Listas Encadeadas: exemplo cria uma lista inicialmente vazia e insere novos elementos int main (void) { Elemento* lst; /* declara uma lista não inicializada */ lst = lst_cria(); /* cria e inicializa lista como vazia */ lst = lst_insere(lst, 23); /* insere na lista o elemento 23 */ lst = lst_insere(lst, 45); /* insere na lista o elemento 45 */... return 0; deve-se atualizar a variável que representa a lista a cada inserção de um novo elemento. lst lst 45 23 (c) Dept. Informática - PUC-Rio 12

Listas Encadeadas: impressão Imprime os valores dos elementos armazenados /* função imprime: imprime valores dos elementos */ void lst_imprime (Elemento* lst) { Elemento* p; for (p = lst; p!= NULL; p = p->prox) printf( info = %d\n, p->info); lst p p p p p Info1 Info2 Info3... InfoN (c) Dept. Informática - PUC-Rio 13

Listas Encadeadas: Teste de vazia Retorna 1 se a lista estiver vazia ou 0 se não estiver vazia /* função vazia: retorna 1 se vazia ou 0 se não vazia */ int lst_vazia (Elemento* lst) { return (lst == NULL); (c) Dept. Informática - PUC-Rio 14

Listas Encadeadas: busca recebe a informação referente ao elemento a pesquisar retorna o ponteiro do nó da lista que representa o elemento, ou NULL, caso o elemento não seja encontrado na lista /* função busca: busca um elemento na lista */ Elemento* busca (Elemento* lst, int v) { Elemento* p; for (p=lst; p!=null; p = p->prox) { if (p->info == v) return p; return NULL; /* não achou o elemento */ (c) Dept. Informática - PUC-Rio 15

Listas Encadeadas: remover um elemento recebe como entrada a lista e o valor do elemento a retirar atualiza o valor da lista, se o elemento removido for o primeiro lst Info1 Info2 Info3 caso contrário, apenas remove o elemento da lista lst Info1 Info2 Info3 (c) Dept. Informática - PUC-Rio 16

/* função retira: retira elemento da lista */ Elemento* lst_retira (Elemento* lst, int val) { Elemento* a = NULL; /* ponteiro para elemento anterior */ Elemento* p = lst; /* ponteiro para percorrer a lista */ /* procura elemento na lista, guardando anterior */ while (p!= NULL && p->info!= val) { a = p; p = p->prox; /* verifica se achou elemento */ if (p == NULL) return lst; /* não achou: retorna lista original */ /* retira elemento */ if (a == NULL) { /* retira elemento do inicio */ lst = p->prox; else { /* retira elemento do meio da lista */ a->prox = p->prox; free(p); return lst; (c) Dept. Informática - PUC-Rio 17

Listas Encadeadas: Libera a lista destrói a lista, liberando todos os elementos alocados void lst_libera (Elemento* lst) { Elemento* p = lst; while (p!= NULL) { Elemento* t = p->prox; /* guarda referência p/ próx. elemento */ free(p); /* libera a memória apontada por p */ p = t; /* faz p apontar para o próximo */ (c) Dept. Informática - PUC-Rio 18

Listas Encadeadas Manutenção da lista ordenada função de inserção percorre os elementos da lista até encontrar a posição correta para a inserção do novo lst Info1 Info2 Info3 Info4 Novo Novo (c) Dept. Informática - PUC-Rio 19

/* função insere_ordenado: insere elemento em ordem */ Elemento* lst_insere_ordenado (Elemento* lst, int val) { Elemento* novo; Elemento* a = NULL; /* ponteiro para elemento anterior */ Elemento* p = lst; /* ponteiro para percorrer a lista */ /* procura posição de inserção */ while (p!= NULL && p->info < val) { a = p; p = p->prox; /* cria novo elemento */ novo = (Elemento*) malloc(sizeof(elemento)); novo->info = val; /* encadeia elemento */ if (a == NULL) { /* insere elemento no início */ novo->prox = lst; lst = novo; else { /* insere elemento no meio da lista */ novo->prox = a->prox; a->prox = novo; return lst; (c) Dept. Informática - PUC-Rio 20

Definição recursiva de lista uma lista é uma lista vazia; ou um elemento seguido de uma (sub-)lista lst Info1 Sub-lista (c) Dept. Informática - PUC-Rio 21

Exemplo - Função recursiva para imprimir uma lista se a lista for vazia, não imprima nada caso contrário, imprima a informação associada ao primeiro nó, dada por lst->info imprima a sub-lista, dada por lst->prox, chamando recursivamente a função (c) Dept. Informática - PUC-Rio 22

Função imprime recursiva /* Função imprime recursiva */ void lst_imprime_rec (Elemento* lst) { if (! lst_vazia(lst)) { /* imprime primeiro elemento */ printf( info: %d\n,lst->info); /* imprime sub-lista */ lst_imprime_rec(lst->prox); (c) Dept. Informática - PUC-Rio 23

Função imprime recursiva invertida /* Função imprime recursiva invertida */ void lst_imprime_rec (Elemento* lst) { if (!lst_vazia(lst) ) { /* imprime sub-lista */ lst_imprime_rec(lst->prox); /* imprime ultimo elemento */ printf( info: %d\n,lst->info); (c) Dept. Informática - PUC-Rio 24

Exemplo - função para retirar um elemento da lista retire o elemento, se ele for o primeiro da lista (ou da sub-lista) caso contrário, chame a função recursivamente para retirar o elemento da sub-lista (c) Dept. Informática - PUC-Rio 25

Lista: Retira recursiva /* Função retira recursiva */ Elemento* lst_retira_rec (Elemento* lst, int val) { if (!lst_vazia(lst)) { /* verifica se elemento a ser retirado é o primeiro */ if (lst->info == val) { Elemento* t = lst;/* temporário para poder liberar */ lst = lst->prox; free(t); else { /* retira de sub-lista */ lst->prox = lst_retira_rec(lst->prox,val); return lst; é necessário re-atribuir o valor de lst->prox na chamada recursiva, já que a função pode alterar a sub-lista (c) Dept. Informática - PUC-Rio 26

Igualdade de listas int lst_igual (Elemento* lst1, Elemento* lst2); implementação não recursiva percorre as duas listas, usando dois ponteiros auxiliares: se duas informações forem diferentes, as listas são diferentes ao terminar uma das listas (ou as duas): se os dois ponteiros auxiliares são NULL, as duas listas têm o mesmo número de elementos e são iguais (c) Dept. Informática - PUC-Rio 27

Listas iguais: não recursiva int lst_igual (Elemento* lst1, Elemento* lst2) { Elemento* p1; /* ponteiro para percorrer l1 */ Elemento* p2; /* ponteiro para percorrer l2 */ for (p1=lst1, p2=lst2; p1!= NULL && p2!= NULL; p1 = p1->prox, p2 = p2->prox) { if (p1->info!= p2->info) return 0; return p1==p2; (c) Dept. Informática - PUC-Rio 28

Igualdade de listas (recursiva) int lst_igual (Elemento* lst1, Elemento* lst2); implementação recursiva se as duas listas dadas são vazias, são iguais se não forem ambas vazias, mas uma delas é vazia, são diferentes se ambas não forem vazias, teste se informações associadas aos primeiros nós são iguais e se as sub-listas são iguais (c) Dept. Informática - PUC-Rio 29

Listas iguais: recursiva int lst_igual (Elemento* lst1, Elemento* lst2) { if (lst1 == NULL && lst2 == NULL) return 1; else if (lst1 == NULL lst2 == NULL) return 0; else return (lst1->info == lst2->info) && lst_igual(lst1->prox, lst2->prox); (c) Dept. Informática - PUC-Rio 30

Listas de Tipos Estruturados Lista de tipo estruturado: a informação associada a cada nó de uma lista encadeada pode ser mais complexa, sem alterar o encadeamento dos elementos as funções apresentadas para manipular listas de inteiros podem ser adaptadas para tratar listas de outros tipos (c) Dept. Informática - PUC-Rio 31

Listas de Tipos Estruturados Lista de tipo estruturado (cont.): o campo da informação pode ser representado por um ponteiro para uma estrutura, em lugar da estrutura em si independente da informação armazenada na lista, a estrutura do nó é sempre composta por um ponteiro para a informação e um ponteiro para o próximo nó da lista (c) Dept. Informática - PUC-Rio 32

Listas de Tipos Estruturados Exemplo Lista de retângulos struct retangulo { float b; float h; ; typedef struct retangulo Retangulo; struct elemento { campo da informação representado Retangulo* info; por um ponteiro para uma estrutura, struct elemento *prox; em lugar da estrutura em si ; typedef struct elemento Elemento; (c) Dept. Informática - PUC-Rio 33

Listas de Tipos Estruturados Exemplo Função auxiliar para alocar um nó static Elemento* aloca (float b, float h) { Retangulo* r = (Retangulo*) malloc(sizeof(retangulo)); Elemento* p = (Elemento*) malloc(sizeof(elemento)); r->b = b; r->h = h; p->info = r; p->prox = NULL; return p; Para alocar um nó, são necessárias duas alocações dinâmicas: uma para criar a estrutura do retângulo e outra para criar a estrutura do nó. O valor da base associado a um nó p seria acessado por: p->info->b. (c) Dept. Informática - PUC-Rio 34

Tópicos Complementares (c) Dept. Informática - PUC-Rio 35

Listas Circulares Lista circular: o último elemento tem como próximo o primeiro elemento da lista, formando um ciclo a lista pode ser representada por um ponteiro para um elemento inicial qualquer da lista L Info1 Info2 Info3 (c) Dept. Informática - PUC-Rio 36

Listas Circulares Exemplo - Função para imprimir uma lista circular visita todos os elementos a partir do ponteiro do elemento inicial até alcançar novamente esse mesmo elemento se a lista é vazia, o ponteiro para um elemento inicial é NULL /* função imprime: imprime valores dos elementos */ void lcirc_imprime (Elemento* lst) { Elemento* p = lst; /* faz p apontar para o nó inicial */ /* testa se lista não é vazia e então percorre com do-while */ if (p!=null) { do { printf("%d\n", p->info); /* imprime informação do nó */ p = p->prox; /* avança para o próximo nó */ while (p!= lst); (c) Dept. Informática - PUC-Rio 37

Listas Duplamente Encadeadas lst Info1 Info2 Info3 cada elemento tem um ponteiro para o próximo elemento e um ponteiro para o elemento anterior dado um elemento, é possível acessar o próximo e o anterior dado um ponteiro para o último elemento da lista, é possível percorrer a lista em ordem inversa (c) Dept. Informática - PUC-Rio 38

Exemplo: Listas Duplamente Encadeadas struct lista2 { int info; struct lista2* ant; struct lista2* prox; ; typedef struct lista2 Lista2; lista encadeada armazenando valores inteiros struct lista2 estrutura dos nós da lista tipo Lista2 tipo dos nós da lista (c) Dept. Informática - PUC-Rio 39

Listas Duplamente Encadeadas Exemplo - Função de inserção (no início da lista) /* inserção no início: retorna a lista atualizada */ Lista2* lst2_insere (Lista2* lst, int val) { Lista2* novo = (Lista2*) malloc(sizeof(lista2)); novo->info = val; novo->prox = lst; novo->ant = NULL; /* verifica se lista não estava vazia */ if (lst!= NULL) lst->ant = novo; return novo; Novo lst Info1 Info2 Info3 (c) Dept. Informática - PUC-Rio 40

Listas Duplamente Encadeadas Exemplo - Função de busca recebe a informação referente ao elemento a pesquisar retorna o ponteiro do nó da lista que representa o elemento, ou NULL, caso o elemento não seja encontrado na lista implementação idêntica à lista encadeada (simples) /* função busca: busca um elemento na lista */ Lista2* lst2_busca (Lista2* lst, int val) { Lista2* p; for (p=lst; p!=null; p=p->prox) if (p->info == val) return p; return NULL; /* não achou o elemento */ (c) Dept. Informática - PUC-Rio 41

Listas Duplamente Encadeadas Exemplo - Função para retirar um elemento da lista p aponta para o elemento a retirar se p aponta para um elemento no meio da lista: o anterior passa a apontar para o próximo: p->ant->prox=p->prox; o próximo passa a apontar para o anterior: p->prox->ant = p->ant; se p aponta para o último elemento não é possível escrever p->prox->ant, pois p->prox é NULL se p aponta para o primeiro elemento não é possível escrever p->ant->prox, pois p->ant é NULL é necessário atualizar o valor da lista, pois o primeiro elemento pode ser removido (c) Dept. Informática - PUC-Rio 42

/* função retira: remove elemento da lista */ Lista2* lst2_retira (Lista2* lst, int val) { Lista2* p = busca(lst,val); if (p == NULL) return lst;/* não achou o elemento: retorna lista inalterada */ /* retira elemento do encadeamento */ if (lst == p) /* testa se é o primeiro elemento */ lst = p->prox; else p->ant->prox = p->prox; if (p->prox!= NULL) /* testa se é o último elemento */ p->prox->ant = p->ant; free(p); return lst; (c) Dept. Informática - PUC-Rio 43

Listas heterogêneas A representação da informação por um ponteiro permite construir listas heterogêneas, isto é, listas em que as informações armazenadas diferem de nó para nó (c) Dept. Informática - PUC-Rio 44

Exemplo: listas de retângulos, triângulos ou círculos áreas desses objetos são dadas por: r b b* h * h t c r 2 2 (c) Dept. Informática - PUC-Rio 45

struct retangulo { float b; float h; ; typedef struct retangulo Retangulo; struct triangulo { float b; float h; ; typedef struct triangulo Triangulo; struct circulo { float r; ; typedef struct circulo Circulo; (c) Dept. Informática - PUC-Rio 46

Lista homogênea de objetos heterogêneos tipo tipo tipo tipo... b h r b h b h (c) Dept. Informática - PUC-Rio 47

Exemplo: Lista de ponteiros a lista é homogênea - todos os nós contêm os mesmos campos: um ponteiro para o próximo nó da lista um ponteiro para a estrutura que contém a informação deve ser do tipo genérico (ou seja, do tipo void* ) pois pode apontar para um retângulo, um triângulo ou um círculo um identificador indicando qual objeto o nó armazena consultando esse identificador, o ponteiro genérico pode ser convertido no ponteiro específico para o objeto e os campos do objeto podem ser acessados (c) Dept. Informática - PUC-Rio 48

/* Definição dos tipos de objetos */ #define RET 0 #define TRI 1 #define CIR 2 /* Definição do nó da estrutura */ struct lista_het { int tipo; void *info; struct lista_het *prox; ; typedef struct listahet ListaHet; (c) Dept. Informática - PUC-Rio 49

Exemplo Função para a criação de um nó /* Cria um nó com um retângulo */ 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; a função para a criação de um nó possui três variações, uma para cada tipo de objeto (c) Dept. Informática - PUC-Rio 50

Exemplo Função para calcular a maior área retorna a maior área entre os elementos da lista para cada nó, de acordo com o tipo de objeto que armazena, chama uma função específica para o cálculo da área (c) Dept. Informática - PUC-Rio 51

/* função para cálculo da área de um retângulo */ static float ret_area (Retangulo* r) { return r->b * r->h; /* função para cálculo da área de um triângulo */ static float tri_area (Triangulo* t) { return (t->b * t->h) / 2; /* função para cálculo da área de um círculo */ static float cir_area (Circulo* c) { return PI * c->r * c->r; (c) Dept. Informática - PUC-Rio 52

/* função para cálculo da área do nó (versão 2) */ static float area (ListaHet* p) { float a; switch (p->tipo) { case RET: a = ret_area((retangulo*)p->info); break; case TRI: a = tri_area((triangulo*)p->info); break; case CIR: a conversão de ponteiro genérico a = cir_area((circulo*)p->info); para ponteiro específico ocorre break; quando uma das funções de cálculo da área é chamada: passa-se um ponteiro genérico, que é atribuído a um ponteiro específico, através da conversão implícita de tipo return a; (c) Dept. Informática - PUC-Rio 53

Resumo L Listas encadeadas Info1 Info2 Info3 Listas circulares L Info1 Info2 Info3 Listas duplamente encadeadas L Info1 Info2 Info3 (c) Dept. Informática - PUC-Rio 54

Referências Waldemar Celes, Renato Cerqueira, José Lucas Rangel, Introdução a Estruturas de Dados, Editora Campus (2004) Capítulo 10 Listas encadeadas (c) Dept. Informática - PUC-Rio 55