110 likes | 226 Views
LISTAS “LINKADAS”. No Mapeamento Seqüencial tem-se o problema de re-organizar as seqüências de informações nas operações de inserções e remoções. Uma solução elegante para mover dados em representações seqüenciais é o uso de Listas “Linkadas” (Linked Lists).
E N D
LISTAS “LINKADAS” No Mapeamento Seqüencial tem-se o problema de re-organizar as seqüências de informações nas operações de inserções e remoções Uma solução elegante para mover dados em representações seqüenciais é o uso de Listas “Linkadas” (Linked Lists) A localização dos elementos em Listas “Linkadas” pode estar em qualquer lugar da memória. Fator importante - numa representação seqüencial, a ordem dos elementos é a mesma de uma lista ordenada. NO caso de Lista “linkada”, a ordem não necessariamente é a mesma.
F . . . - wat eat cat fat 3 5 bat 9 4 9 7 4 3 8 LISTAS “LINKADAS” (cont.) Acesso correto ao próximo elemento para Listas “linkadas” - é necessário ter uma outra informação indicando a localização desse próximo elemento. Convenção usada para representar Listas “linkadas”: NÓ, que consiste dos dados junto com informação do “link” para ter acesso ao próximo
LISTAS “LINKADAS” (cont.) Capacidade de dividir a informação em Dado e Link Nó Mecanismo para “criar” um novo Nó Mecanismo para “devolver” um Nó para memória A L O C A Ç Ã O D I N Â M I C A
Link Dado LISTAS “LINKADAS” (cont.) Supõe-se que um mecanismo de criar um tipo Nó com duas partes: Dado e Link; Também supõe-se que duas funções new e delete respectivamente para criar um novo Nó e para devolver um Nó Nó
class Node { private: int dado; Node * link; public: Node ( ) { dado = 0; link = 0; } ~Node ( ) { } int getDado ( ) { return dado; } void putDado ( int valor ) { dado = valor; } Node* getLink ( ) { return link; } void putLink ( Node * p ) { link = p; } void printOn ( ) { cout << dado << “\n”; } }
class List { private: Node *first, *last; public: List ( ) { } ~List ( ) { } void insert ( int elemento ) { Node * p = new Node; p->putDado ( elemento ); if ( first == 0 ) first = last = p; else { last->putLink ( p ); last = p; } } void printon ( ); } void printOn ( ) { Node * p = first; while ( p != 0 ) { cout << p->printOn(); p = p->getLink( ); } } void main ( ) { List l1; l1.insert ( 100 ); l1.insert ( 1 ); l1.insert ( 10 ); l1.insert ( 50 ); l1.printOn ( ); }
1 100 10 50 p p p p last first last last last Esta implementação refere-se à qual estrutura de dados já vista??? FILA - utilizando lista “linkada”
Top P I L H A . . .
Operação de inserção na Pilha utilizando estrutura de lista “linkada” insereNaPilha ( Node * Top, Type elemento ) { Node * p = new Node p->Dado = elemento if ( Top == 0 ) Top = p else { p->Link = Top Top = p } } E a operação de remoção? EXERCÍCIO: Utilizando o recurso de ALOCAÇÃO DINÂMICA, implementar as operações sobre uma lista “linkada”.
coef exp link 1 0 2 8 3 14 SOMA DE POLINÔMIOS O problema de manipular polinômios utilizando listas “linkadas” é um exemplo clássico. Representar qualquer número de diferentes polinômios (Memória) A(x) = 3x14 + 2x8 + 1
2 7 2 9 2 14 2 7 2 8 2 9 5 14 1 0 1 0 2 8 3 14 A = pa B = pb EXERCÍCIO: Utilizando o recurso de ALOCAÇÃO DINÂMICA, implementar a soma de polinômios.