Escolar Documentos
Profissional Documentos
Cultura Documentos
Sobre mim
Srgio Souza Costa Professor - UFMA Doutor em Computao Aplicada (INPE)
prof.sergio.costa@gmail.com
Roteiro
Lista como estrutura encadeada. Codificao de listas encadeadas em C.
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.
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
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
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]
Operao
Descrio
Tamanho (L)
Inserir (L,x)
Insere um elemento x a L
Busca (L, x)
ElementoEm(L, i)
Remove (L, i)
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
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:
Operaes: tamanho
A simulao da avaliao desta funo recursiva mostrada a seguir:
Operaes: tamanho
A simulao da avaliao desta funo recursiva mostrada a seguir:
Operaes: tamanho
A simulao da avaliao desta funo recursiva mostrada a seguir:
Operaes: tamanho
A simulao da avaliao desta funo recursiva mostrada a seguir:
Operaes: tamanho
A simulao da avaliao desta funo recursiva mostrada a seguir:
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)
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
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
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( 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( 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( 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.
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;
} Lista;
Resto, os elementos de uma lista com excesso do primeiro. Neste, caso do tipo 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* Vazia () {
L
NULL
5
NULL
5
NULL
5
NULL
5
NULL
5
NULL
5
NULL
Supondo que eu queira remover o primeiro elemento .... Basta retornar o resto da lista, ou seja, a partir do segundo.
5
NULL
5
NULL
Supondo que eu queira remover o segundo elemento .... Basta fazer o primeiro apontar para o terceiro ...
5
NULL
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.