Вы находитесь на странице: 1из 19

Estrutura de Dados (DPADF 0056)

Aula 9 Listas Heterogneas


Universidade Federal de Santa Maria Colgio Agrcola de Frederico Westphalen Curso Superior de Tecnologia em Sistemas para Internet
Prof. Bruno B. Boniati www.cafw.ufsm.br/~bruno

Conjunto de dados com nmero variado de elementos variados

Listas Heterognea
Cada n da lista guarda um tipo diferente de informao; Sua implementao se d utilizando-se em cada n, no mnimo trs campos:
Identificador do tipo de dado armazenado; Ponteiro para a informao; Ponteiro para o prximo elemento da lista;
tringulo

quadrado

crculo

Para exemplificar ...


struct retangulo { float altura; float largura; }; struct triangulo { float altura; float base; }; struct circulo { float raio; };

void* ??
#define RET 0 #define TRI 1 #define CIR 2

struct elemento { int tipo; void* info; struct elemento* prox; };

void* = ponteiro para qualquer coisa


A alternativa que temos para guardar qualquer coisa em um nodo da lista representar a informao atravs de um ponteiro genrico (void*); Uma varivel do tipo ponteiro genrico pode representar qualquer endereo de memria, independente da informao que est armazenada neste espao;

Antes de continuarmos ... um exemplo ...


int* a; float* b; a = malloc(sizeof(int)); b = malloc(sizeof(float)); void* p; *a = 5; *b = 10.5; p = b; printf("%f",*((float*) p) ); *((float*) p) ???

Converso explcita de tipo


Para acessar a informao ser necessrio fazer uma converso explcita de tipo (casting); Em linguagem C isso feito colocando antes do ponteiro genrico o tipo original para o qual a converso deve ser feita (entre parntesis);
float* a; //Declarao de ponteiro float* b; void* p; //Declarao de ponteiro genrico p = a; //O ponteiro genrico recebe o end. de a b = (float*) p //antes de utilizar faz-se o casting

Implementao
Como cada n da lista pode guardar tipos diferentes de informao ser necessrio que seja implementada uma subrotina para alocar espao e inicializar cada tipo de elemento ...
Elemento* cria_retangulo(float a, float l); Elemento* cria_triangulo(float h, float b); Elemento* cria_circulo(float r);

Exerccios para fixao

Lista de Objetos Geomtricos


Que tal implementar um TAD Lista para guardar uma lista de figuras geomtricas (crculos, tringulos, retngulos, losngulos, etc.)
Implemente uma operao no TAD para calcular a rea total ocupada por todos os objetos da lista; possvel determinar qual o elemento de maior rea?

possvel pesquisar ou excluir um


elemento?

Estrutura de Dados (DPADF 0056)


Aula 10 Lista com Descritor
Universidade Federal de Santa Maria Colgio Agrcola de Frederico Westphalen Curso Superior de Tecnologia em Sistemas para Internet
Prof. Bruno B. Boniati www.cafw.ufsm.br/~bruno

Tipo especial de lista que guarda um resumo sobre a prpria lista

Lista com descritor


Uma lista com descritor um tipo especial de lista onde ao invs de escolher um elemento para ser o primeiro da lista e guardar sua referncia ser utilizada uma estrutura composta por outros campos com informaes sobre a prpria lista (de acordo com cada aplicao) ...
Primeiro elemento ; ltimo elemento; Nmero de elementos; Mdia de valores dos elementos (no caso de valores numricos); Etc.

Suponhamos uma lista numrica ...


Elemento
rea de Informaes rea de Apontadores ou Elos 18 10 5

14

Descritor

Incio da Lista Final da Lista


Mdia de Valores

9 6 18 5

NULL

N de Elementos

Para exemplificar ...


struct elemento { int conteudo; struct elemento* proximo; }; typedef struct elemento Elemento; struct descritor { Elemento* inicial; Elemento* final; int cont; int media; };

Dois registros?

Implementao
As operaes sobre uma lista com descritor so semelhantes s da lista normal, porm, a cada operao o descritor da lista precisar ser atualizado ...
Descritor* criaLista(); Descritor* insereNoInicio(Descritor* des, int v); Descritor* insereNoFinal(Descritor* des, int v); void imprimeLista(Descritor* des); Elemento* buscaValor(Descritor* des, int v); void liberaLista(Descritor* des); Descritor* retiraElemento(Descritor* des, Elemento* e);

Vantagens
Uma lista com descritor uma excelente alternativa para determinadas aplicaes, onde necessrio por exemplo saber rapidamente o nmero de elementos ou a soma de seus valores ... sem precisar percorrer toda a lista para descobrir essa informao. Dependendo como a lista implementada, nodos especficos podem ser acessados diretamente (o primeiro, o ltimo, o maior, o menor, etc...)

Exerccios para fixao

Lista de Inteiros com Descritor


Que tal implementar um TAD Lista de inteiros com um descritor para guardar e manter atualizado em cada operao:
O maior valor; O menor valor

O nmero de elementos; A soma dos valores; A mdia dos valores.

Вам также может понравиться