Você está na página 1de 102

Listas Encadeadas

Prof: Sergio Souza Costa

Sobre mim
Srgio Souza Costa Professor - UFMA Doutor em Computao Aplicada (INPE)
prof.sergio.costa@gmail.com

https://sites.google.com/site/profsergiocosta/home http://www.slideshare.net/skosta/presentations?order=popular https://twitter.com/profsergiocosta http://gplus.to/sergiosouzacosta

Roteiro
Lista como estrutura encadeada. Codificao de listas encadeadas em C.

Como representar as listas na memoria do computador?


Estruturas contguas

Estruturas Encadeadas

Estruturas encadeadas
Nas estruturas contguas a relao de ordem dos elementos estabelecida de forma fsica, a posio x2 sucede a posio de x1 . Nas estruturas encadeadas a sucesso dos elementos estabelecida de forma lgica, a posio x2 no necessariamente sucede a de x1. No existe uma relao espacial (memria). Deste modo, pode-se adicionar elementos dinamicamente, mantendo a relao de ordem sem se preocupar de definir o tamanho mximo de memoria.

Estruturas encadeadas
Uma lista pode ser implementada usando a estrutura de dados listas encadeadas.

Estruturas encadeadas
Uma lista pode ser implementada usando a estrutura de dados listas encadeadas.

Observem: listas encadeadas uma outra estrutura de dados, com suas propriedades, tipo abstrato de dados e implementao.

Estruturas encadeadas
Comeando por uma definio abstrata sobre listas encadeadas ...

Estruturas encadeadas
Comeando por uma definio abstrata sobre listas encadeadas ...

Listas encadeadas
Uma lista encadeada uma estrutura recursiva, ou seja, definida em termos de si mesma. Aqui definimos uma lista encadeada como: Uma sequncia de 0 ou mais itens (ou elementos), onde o seu tamanho e sua quantidade de itens. Uma lista encadeada vazia possui 0 itens e ser representada por [].

Listas encadeadas
Uma lista encadeada no vazia L consiste de dois atributos: 1. 2. Primeiro[L] que o primeiro item da lista e Resto[L] que so os demais itens, ou seja, uma lista contendo todos os itens com exceo do primeiro. Se uma lista L contem apenas um elemento, ento Resto[L] uma lista vazia []. Deste modo, tudo que se aplica a lista L tambm se aplica a Resto[L].

Listas encadeadas
Como uma lista pode ser vazia ou conter pelo menos um item, ela requer dois construtores: VAZIA(): cria uma lista vazia. CONS(x, L): cria uma lista no vazia composta pelo primeiro elemento x e um resto L. Pode se dizer ainda que o construtor CONS insere um item x a uma lista L.

LISTA encadeada - Operao "cons"


Exemplos: A varivel lista1 equivale a seguinte lista [1,4,5]: >lista1 = CONS (1, CONS (4, CONS (5, VAZIA ()))) A varivel lista2 equivale a seguinte lista [9,2,3]: >lista2 = CONS (9, CONS (2, CONS (3, VAZIA ())))

Listas encadeadas
>lista1 = CONS (1, CONS (4, CONS (5, VAZIA ())))

Listas encadeadas
>lista1 = CONS (1, CONS (4, CONS (5, VAZIA ()))) = []

Listas encadeadas
>lista1 = CONS (1, CONS (4, CONS (5, VAZIA ()))) = [] = [5]

Listas encadeadas
>lista1 = CONS (1, CONS (4, CONS (5, VAZIA ()))) = [] = [5] = [4,5]

Listas encadeadas
>lista1 = CONS (1, CONS (4, CONS (5, VAZIA ()))) = [] = [5] = [4,5] = [1,4,5]

Exercitando
Quais os valores das variveis abaixo:
A = Cons (5, Cons (7, Cons (8, Vazia() ) ) ) B = Resto [A] c = Resto [Resto [A]] d = Primeiro [A] e = Primeiro [Resto[A]] f = Resto [Primeiro[a]]

Exercitando
Quais os valores das variveis abaixo:
A = Cons (5, Cons (7, Cons (8, Vazia() ) ) ) B = Resto [A] c = Resto [Resto [A]] d = Primeiro [A] e = Primeiro [Resto[A]] f = Resto [Primeiro[a]]

[5,7,8]

Exercitando
Quais os valores das variveis abaixo:
A = Cons (5, Cons (7, Cons (8, Vazia() ) ) ) B = Resto [A] c = Resto [Resto [A]] d = Primeiro [A] e = Primeiro [Resto[A]] f = Resto [Primeiro[a]]

[5,7,8]

[7,8]

Exercitando
Quais os valores das variveis abaixo:
A = Cons (5, Cons (7, Cons (8, Vazia() ) ) ) B = Resto [A] c = Resto [Resto [A]] d = Primeiro [A] e = Primeiro [Resto[A]] f = Resto [Primeiro[a]]

[5,7,8]

[7,8] [8]

Exercitando
Quais os valores das variveis abaixo:
A = Cons (5, Cons (7, Cons (8, Vazia() ) ) ) B = Resto [A] c = Resto [Resto [A]] d = Primeiro [A]

[5,7,8]

[7,8] [8] 5

e = Primeiro [Resto[A]] f = Resto [Primeiro[a]]

Exercitando
Quais os valores das variveis abaixo:
A = Cons (5, Cons (7, Cons (8, Vazia() ) ) ) B = Resto [A] c = Resto [Resto [A]] d = Primeiro [A]

[5,7,8]

[7,8] [8] 5 7

e = Primeiro [Resto[A]] f = Resto [Primeiro[a]]

Exercitando
Quais os valores das variveis abaixo:
A = Cons (5, Cons (7, Cons (8, Vazia() ) ) ) B = Resto [A] c = Resto [Resto [A]] d = Primeiro [A]

[5,7,8]

[7,8] [8] 5 7 invlida

e = Primeiro [Resto[A]] f = Resto [Primeiro[a]]

LISTA: Tipo de dados abstrato


Lembrando as 5 operaes bsicas de lista.

Operao

Descrio

Tamanho (L)

Retorna o nmero de elementos de L

Inserir (L,x)

Insere um elemento x a L

Busca (L, x)

Busca um elemento x em L, retorna seu indice.

ElementoEm(L, i)

Retorna um elemento de L localizado em i.

Remove (L, i)

Remove um elemento de L localizado em i.

Listas encadeadas e funes recursivas


Como a lista encadeada uma estrutura recursiva, as operaes sobre estas so usualmente desta forma. Lembrando .......
Uma funo recursiva consiste em duas partes: O caso trivial, cuja soluo conhecida; Um mtodo geral que reduz o problema a um ou mais problemas menores (subproblemas) de mesma natureza.

Operaes: tamanho
Por exemplo, a operao Tamanho retorna a quantidade de itens em uma lista:
Tamanho (L)

Operaes: tamanho
Por exemplo, a operao Tamanho retorna a quantidade de itens em uma lista: Pela definio uma lista pode ser
Tamanho (L) vazia, ou conter pelo menos um elemento. Ento precisamos tratar estes dois casos.

Operaes: tamanho
Por exemplo, a operao Tamanho retorna a quantidade de itens em uma lista: Pela definio uma lista pode ser
Tamanho (L) Se L = VAZIA() ento vazia, ou conter pelo menos um elemento. Ento precisamos tratar estes dois casos.

Operaes: tamanho
Por exemplo, a operao Tamanho retorna a quantidade de itens em uma lista: Pela definio uma lista pode ser
Tamanho (L) Se L = VAZIA() ento vazia, ou conter pelo menos um elemento. Ento precisamos tratar estes dois casos. Pela definio o tamanho de uma lista vazia 0.

Operaes: tamanho
Por exemplo, a operao Tamanho retorna a quantidade de itens em uma lista: Pela definio uma lista pode ser
Tamanho (L) Se L = VAZIA() ento retorna 0 se no vazia, ou conter pelo menos um elemento. Ento precisamos tratar estes dois casos. Pela definio o tamanho de uma lista vazia 0.

Operaes: tamanho
Por exemplo, a operao Tamanho retorna a quantidade de itens em uma lista: Pela definio uma lista pode ser
Tamanho (L) Se L = VAZIA() ento retorna 0 se no vazia, ou conter pelo menos um elemento. Ento precisamos tratar estes dois casos. Pela definio o tamanho de uma lista vazia 0. Se e no vazia, ela tem pelo menos um elemento, adicionado ao tamanho do resto da lista

Operaes: tamanho
Por exemplo, a operao Tamanho retorna a quantidade de itens em uma lista: Pela definio uma lista pode ser
Tamanho (L) Se L = VAZIA() ento retorna 0 se no retorna 1 + Tamanho (Resto[L]) vazia, ou conter pelo menos um elemento. Ento precisamos tratar estes dois casos. Pela definio o tamanho de uma lista vazia 0. Se e no vazia, ela tem pelo menos um elemento, adicionado ao tamanho do resto da lista

Operaes: tamanho
Por exemplo, a operao Tamanho retorna a quantidade de itens em uma lista: Pela definio uma lista pode ser
Tamanho (L) Se L = VAZIA() ento retorna 0 se no retorna 1 + Tamanho (Resto[L]) vazia, ou conter pelo menos um elemento. Ento precisamos tratar estes dois casos. Pela definio o tamanho de uma lista vazia 0. Se e no vazia, ela tem pelo menos um elemento, adicionado ao tamanho do resto da lista

Caso trivial

Operaes: tamanho
Por exemplo, a operao Tamanho retorna a quantidade de itens em uma lista: Pela definio uma lista pode ser
Tamanho (L) Se L = VAZIA() ento retorna 0 se no retorna 1 + Tamanho (Resto[L]) vazia, ou conter pelo menos um elemento. Ento precisamos tratar estes dois casos. Pela definio o tamanho de uma lista vazia 0. Se e no vazia, ela tem pelo menos um elemento, adicionado ao tamanho do resto da lista

Caso trivial Mtodo geral

Operaes: tamanho
A simulao da avaliao desta funo recursiva mostrada a seguir:

Tamanho [3,5,7,8]

Operaes: tamanho
A simulao da avaliao desta funo recursiva mostrada a seguir:

Tamanho [3,5,7,8] = 1 + Tamanho [5,7,8]

Operaes: tamanho
A simulao da avaliao desta funo recursiva mostrada a seguir:

Tamanho [3,5,7,8] = 1 + Tamanho [5,7,8] = 1 + 1 + Tamanho [7,8]

Operaes: tamanho
A simulao da avaliao desta funo recursiva mostrada a seguir:

Tamanho [3,5,7,8] = 1 + Tamanho [5,7,8] = 1 + 1 + Tamanho [7,8] = 1 + 1 + 1 + Tamanho [8]

Operaes: tamanho
A simulao da avaliao desta funo recursiva mostrada a seguir:

Tamanho [3,5,7,8] = 1 + Tamanho [5,7,8] = 1 + 1 + Tamanho [7,8] = 1 + 1 + 1 + Tamanho [8] = 1 +1 + 1 + 1 + Tamanho []

Operaes: tamanho
A simulao da avaliao desta funo recursiva mostrada a seguir:

Tamanho [3,5,7,8] = 1 + Tamanho [5,7,8] = 1 + 1 + Tamanho [7,8] = 1 + 1 + 1 + Tamanho [8] = 1 +1 + 1 + 1 + Tamanho [] = 1 +1 + 1 + 1 + 0

Operaes: tamanho
A simulao da avaliao desta funo recursiva mostrada a seguir:

Tamanho [3,5,7,8] = 1 + Tamanho [5,7,8] = 1 + 1 + Tamanho [7,8] = 1 + 1 + 1 + Tamanho [8] = 1 +1 + 1 + 1 + Tamanho [] = 1 +1 + 1 + 1 + 0 =4

Operaes: Insero
Inserir no inicio, basta retornar a chamada a funo CONS.

L = [ 6,7,5,4]
Inserir( L, x) 1. retorna CONS (x, L)

Inserir (L, 2)

L = [ 2, 6,7,5,4]

Operaes: Insero
Inserir no inicio, basta retornar a chamada a funo CONS.

L = [ 6,7,5,4]
Inserir( L, x) 1. retorna CONS (x, L)

Inserir (L, 2)

L = [ 2, 6,7,5,4] Depois falaremos sobre insero no fim da lista.

Operaes: Busca
Buscar um elemento x em L.
Busca(L, x)

Operaes: Busca
Buscar um elemento x em L.
Busca(L, x) Se L = VAZIA() ento senao

Como sempre, preciso tratar os casos quando a lista vazia e quando no :

Operaes: Busca
Buscar um elemento x em L.
Busca(L, x) Se L = VAZIA() ento senao

Como sempre, preciso tratar os casos quando a lista vazia e quando no : Se L vazia, ento sabemos que X no est em L. o caso trivial.

Operaes: Busca
Buscar um elemento x em L.
Busca(L, x) Se L = VAZIA() ento retorna NULL; senao

Como sempre, preciso tratar os casos quando a lista vazia e quando no : Se L vazia, ento sabemos que X no est em L. o caso trivial.

Operaes: Busca
Buscar um elemento x em L.
Busca(L, x) Se L = VAZIA() ento retorna NULL; senao

Como sempre, preciso tratar os casos quando a lista vazia e quando no : Se L vazia, ento sabemos que X no est em L. o caso trivial. Caso contrrio, precisamos verificar se x o primeiro, ou se ele est localizado no restante da lista.

Operaes: Busca
Buscar um elemento x em L.
Busca(L, x) Se L = VAZIA() ento retorna NULL; senao Se Primeiro[L] = x entao retorna L senao retorna Busca (resto[L],x)

Como sempre, preciso tratar os casos quando a lista vazia e quando no : Se L vazia, ento sabemos que X no est em L. o caso trivial. Caso contrrio, precisamos verificar se x o primeiro, ou se ele est localizado no restante da lista.

Operaes: ElementoEm

Neste caso, no existe um ndice, necessrio percorrer a lista at chegar na posio desejada.
ElementoEm( L, i) Se L = Vazia entao senao

Como sempre, preciso tratar os casos quando a lista vazia e quando no :

Operaes: ElementoEm

Neste caso, no existe um ndice, necessrio percorrer a lista at chegar na posio desejada.
ElementoEm( L, i) Se L = Vazia entao erro (lista vazia) senao

Como sempre, preciso tratar os casos quando a lista vazia e quando no : Lista vazia, um erro

Operaes: ElementoEm

Neste caso, no existe um ndice, necessrio percorrer a lista at chegar na posio desejada.
ElementoEm( L, i) Se L = Vazia entao erro (lista vazia) senao Se i = 1 entao retorna Primeiro[L] senao retorna ElementoEm(Resto[L], i-1))

Como sempre, preciso tratar os casos quando a lista vazia e quando no : Lista vazia, um erro Caso contrrio, se o indice for 1, entao retorne o primeiro, caso contrario retorne o ElementoEm (resto[L], indice -1)

Operaes: ElementoEm
Simulao

ElementoEm ([5,6,7,8], 3)

ElementoEm( L, i) Se L = Vazia entao erro (lista vazia) senao Se i = 1 entao retorna Primeiro[L] senao retorna ElementoEm(Resto[L], i-1))

Operaes: ElementoEm
Simulao

ElementoEm ([5,6,7,8], 3) = ElementoEm ([6,7,8],2)

ElementoEm( L, i) Se L = Vazia entao erro (lista vazia) senao Se i = 1 entao retorna Primeiro[L] senao retorna ElementoEm(Resto[L], i-1))

Operaes: ElementoEm
Simulao

ElementoEm ([5,6,7,8], 3) = ElementoEm ([6,7,8],2) = ElementoEm ([7,8],1)

ElementoEm( L, i) Se L = Vazia entao erro (lista vazia) senao Se i = 1 entao retorna Primeiro[L] senao retorna ElementoEm(Resto[L], i-1))

Operaes: ElementoEm
Simulao

ElementoEm ([5,6,7,8], 3) = ElementoEm ([6,7,8],2) = ElementoEm ([7,8],1) =7

ElementoEm( L, i) Se L = Vazia entao erro (lista vazia) senao Se i = 1 entao retorna Primeiro[L] senao retorna ElementoEm(Resto[L], i-1))

Atividade
Considerando apenas as 4 operaes (Cons, Vazia, Primeiro, Resto) , podemos codificar diversas outras funes. No papel, codifiquem as funes abaixo (verso iterativa e recursiva): a) int soma (List l ) ex: soma [1,2,6] 9 b) int produto (List l ) ex: produto [1,2,6] -> 12 c) void imprimir (List a) ex: imprimir ([1,2]) [1,2] d) List concatena (List l1,List l2) ex: concatena ([1,2],[3,4]) [1,2,3,4]

Entendi o TAD da lista, mas est muito abstrato. Como escrevo isso em uma linguagem de programao.

Entendi o TAD da lista, mas est muito abstrato. Como escrevo isso em uma linguagem de programao.

Ponto crucial: como as linguagens suportam tipos de dados recursivos. Algum?

Entendi o TAD da lista, mas est muito abstrato. Como escrevo isso em uma linguagem de programao.

Ponto crucial: como as linguagens suportam tipos de dados recursivos. Algum? Vocs j usaram.

Entendi o TAD da lista, mas est muito abstrato. Como escrevo isso em uma linguagem de programao.

Ponto crucial: como as linguagens suportam tipos de dados recursivos. Algum? Vocs j usaram.

Ponteiros

Lista encadeada: Codificao - C


Como criamos novos tipos de dados em C ?

Lista encadeada: Codificao - C


Como criamos novos tipos de dados em C ?
typedef struct Lista {
Esta a sintaxe bsica para criar qualquer tipo de dado, mas quais eram os atributos de uma lista no vazia ?

} Lista;

Lista encadeada: Codificao - C


Como criamos novos tipos de dados em C ?
typedef struct Lista { int primeiro;
Primeiro, que retorna o primeiro valor da lista. Neste caso assumindo uma lista homognea de inteiros.

} Lista;

Lista encadeada: Codificao - C


Como criamos novos tipos de dados em C ?
typedef struct Lista { int primeiro; struct Lista* resto; } Lista;

Resto, os elementos de uma lista com excesso do primeiro. Neste, caso do tipo lista.

Lista encadeada: Codificao - C


Como criamos novos tipos de dados em C ?
typedef struct Lista { int primeiro; struct Lista* resto; } Lista;

Resto, os elementos de uma lista com excesso do primeiro. Neste, caso do tipo lista.

Observem a recursividade.

Ok, mas esta uma lista no vazia, e uma lista vazia, como represento ?

Como estamos trabalhando com ponteiros, representamos uma lista vazia por um ponteiro nulo, ou seja, pelo NULL em C.

Lista encadeada: Codificao - C


Como iremos codificar a operao que cria uma lista vazia ?

Lista* Vazia () {

Lista encadeada: Codificao - C


Como iremos codificar a operao que cria uma lista vazia ?

Lista* Vazia () { return NULL; }

Lista encadeada: Codificao - C


E a operao Cons ?
Lista* Cons (int p, Lista* r) { Lista* l = (Lista*)malloc (sizeof(Lista)); l->primeiro = p; l->resto = r; return l; }

Lista encadeada: Codificao - C


E a operao Cons ?
Lista* Cons (int p, Lista* r) { Lista* l = (Lista*)malloc (sizeof(Lista)); l->primeiro = p; l->resto = r; return l; } alocado a rea de memoria para a lista.

Lista encadeada: Codificao - C


E a operao Cons ?
Lista* Cons (int p, Lista* r) { Lista* l = (Lista*)malloc (sizeof(Lista)); l->primeiro = p; l->resto = r; return l; } Atribuo os valores dos parmetros para os atributos da lista.

Lista encadeada: Codificao - C


E a operao Cons ?
Lista* Cons (int p, Lista* r) { Lista* l = (Lista*)malloc (sizeof(Lista)); l->primeiro = p; l->resto = r; return l; } Retorno a lista criada.

L = CONS (1, CONS (4, CONS (5, VAZIA ())))

Representao grfica das listas encadeadas


L = CONS (1, CONS (4, CONS (5, VAZIA ())))

L
NULL

Representao grfica das listas encadeadas


L = CONS (1, CONS (4, CONS (5, VAZIA ())))

5
NULL

Representao grfica das listas encadeadas


L = CONS (1, CONS (4, CONS (5, VAZIA ())))

5
NULL

Representao grfica das listas encadeadas


L = CONS (1, CONS (4, CONS (5, VAZIA ())))

5
NULL

Representao grfica das listas encadeadas


L = CONS (1, CONS (4, CONS (5, VAZIA ())))

5
NULL

Por isso o nome de listas encadeadas ou ligadas

Como removo um elemento de uma lista encadeada.

Como removo um elemento de uma lista encadeada.

5
NULL

Supondo que eu queira remover o primeiro elemento ....

5
NULL

Supondo que eu queira remover o primeiro elemento .... Basta retornar o resto da lista, ou seja, a partir do segundo.

5
NULL

Supondo que eu queira remover o segundo elemento ....

5
NULL

Supondo que eu queira remover o segundo elemento .... Basta fazer o primeiro apontar para o terceiro ...

5
NULL

Remoo em listas encadeadas


Lista* remove (int pos, Lista* l){ int i ; Lista* aux = l; if (pos == 1) return l->resto; for (i=2; i < pos; i++) aux = aux->resto; aux->resto = aux->resto->resto; return l; }

Remoo em listas encadeadas


Lista* remove (int pos, Lista* l){ int i ; Lista* aux = l; if (pos == 1) return l->resto; for (i=2; i < pos; i++) aux = aux->resto; aux->resto = aux->resto->resto; return l; }

o primeiro elemento, retorno o resto.

Remoo em listas encadeadas


Lista* remove (int pos, Lista* l){ int i ; Lista* aux = l; if (pos == 1) return l->resto; for (i=2; i < pos; i++) aux = aux->resto; aux->resto = aux->resto->resto; return l; }

Caso contrrio, percorro a lista at pos-1.

Remoo em listas encadeadas


Lista* remove (int pos, Lista* l){ int i ; Lista* aux = l; if (pos == 1) return l->resto; for (i=2; i < pos; i++) aux = aux->resto; aux->resto = aux->resto->resto; return l; }

Fao ele apontar para o sucessor do seu sucessor.

Remover (L, 3)

5
NULL

Lista* remove (int pos, Lista* l){ int i ; Lista* aux = l; if (pos == 1) return l->resto; for (i=2; i < pos; i++) aux = aux->resto; aux->resto = aux->resto->resto; return l; }

Pos 3

Remover (L, 3)

5
NULL

Aux
Lista* remove (int pos, Lista* l){ int i ; Lista* aux = l; if (pos == 1) return l->resto; for (i=2; i < pos; i++) aux = aux->resto; aux->resto = aux->resto->resto; return l; }

Pos 3

Remover (L, 3)

5
NULL

Aux
Lista* remove (int pos, Lista* l){ int i ; Lista* aux = l; if (pos == 1) return l->resto; for (i=2; i < pos; i++) aux = aux->resto; aux->resto = aux->resto->resto; return l; }

Pos 3

Remover (L, 3)

5
NULL

Aux
Lista* remove (int pos, Lista* l){ int i ; Lista* aux = l; if (pos == 1) return l->resto; for (i=2; i < pos; i++) aux = aux->resto; aux->resto = aux->resto->resto; return l; }

I 2

Pos 3

Remover (L, 3)

5
NULL

Aux
Lista* remove (int pos, Lista* l){ int i ; Lista* aux = l; if (pos == 1) return l->resto; for (i=2; i < pos; i++) aux = aux->resto; aux->resto = aux->resto->resto; return l; }
I 2 Pos 3

Remover (L, 3)

5
NULL

Aux
Lista* remove (int pos, Lista* l){ int i ; Lista* aux = l; if (pos == 1) return l->resto; for (i=2; i < pos; i++) aux = aux->resto; aux->resto = aux->resto->resto; return l; }
I 3 Pos 3

Remover (L, 3)

5
NULL

Aux
Lista* remove (int pos, Lista* l){ int i ; Lista* aux = l; if (pos == 1) return l->resto; for (i=2; i < pos; i++) aux = aux->resto; aux->resto = aux->resto->resto; return l; }
I 3 Pos 3

Remover (L, 3)

L
O que ir acontece com o espao de memoria onde est localizado o 4?

5
NULL

Aux
I 3 Pos 3

Lista* remove (int pos, Lista* l){ int i ; Lista* aux = l; if (pos == 1) return l->resto; for (i=2; i < pos; i++) aux = aux->resto; aux->resto = aux->resto->resto; return l; }

Pontos chaves
Nas estruturas encadeadas os itens so adicionados dinamicamente. Listas encadeadas so estruturas recursivas e suportadas por ponteiros em C.

Referncias
CORMEN, Thomas H. et al. Algoritmos: teoria e prtica. Rio de Janeiro: Elsevier, 2002. SILVA, Osmar Quirino da. Estrutura de dados e algoritmos usando C: fundamentos e aplicaes. Rio de Janeiro:Cincia Moderna, 2007. 458 p. ISBN 9788573936117 CELES, Waldemar; CERQUEIRA, Renato; RANGEL, Jos Lucas. Introduo a estruturas de dados. Editora Campus, 2004.

Você também pode gostar