listas encadeadas professor reverton de paula faculdade anhanguera de indaiatuba

27
Listas Encadeadas Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba

Upload: internet

Post on 18-Apr-2015

133 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Listas Encadeadas Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba

Listas Encadeadas

Professor Reverton de PaulaFaculdade Anhanguera de Indaiatuba

Page 2: Listas Encadeadas Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba

Listas Encadeadas

• Uma lista encadeada é uma representação de uma sequência de objetos na memória do computador. – Cada elemento da sequência é armazenado em

uma célula da lista: • o primeiro elemento na primeira célula, o segundo na

segunda e assim por diante.

Page 3: Listas Encadeadas Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba

Lista: Operações

• Adicionar um elemento na primeira posição de um Vetor consome muito tempo, – Pois temos de deslocar todos os outros elementos

uma posição para a frente.• A performance dessa operação degrada a

medida que a quantidade de elementos do nosso vetor cresce: – ela consome tempo linear em relação ao número

de elementos.

Page 4: Listas Encadeadas Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba

Lista: Operações

• Analogamente, remover um elemento da primeira posição implica em deslocar todos os outros elementos que estão na sua frente para trás.

• Em alguns casos, queremos uma implementação de Lista na qual a operação de adicionar ou a de remover um aluno na primeira posição seja computacionalmente eficiente. – Conseguiremos isso através de uma Lista Ligada.

Page 5: Listas Encadeadas Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba

Lista: Operações

• Operações que poderemos fazer em uma dada lista– Adicionar um dado elemento no fim da Lista.– Adicionar um dado elemento em um dada posição.– Pegar o elemento de uma dada posição.– Remover o elemento de uma dada posição.– Verificar se um dado elemento está contido na Lista.– Informar a quantidade de elementos da Lista.

Page 6: Listas Encadeadas Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba

Listas encadeadas

• Precisamos de algo que não seja fixo como um array.

• Então a idéia aqui é ter uma forma de, dado um aluno, saber quem é o próximo, sem usar uma estrutura fixa

Page 7: Listas Encadeadas Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba

Listas encadeadas

• Repare que:– apesar do efeito de um aluno estar “ao lado” do outro,

• na memória é mais provável que eles não se encontrem um ao lado do outro, – e sim em regiões bem diferentes da memória, – só que cada um deles sabe dizer em que local se encontra o próximo

aluno (pois temos a referência ao proximo).

Page 8: Listas Encadeadas Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba

Célula e Lista Ligada

Page 9: Listas Encadeadas Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba

Listas Encadeadas

Page 10: Listas Encadeadas Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba

Estrutura de uma lista encadeada

• Uma lista encadeada (= linked list = lista ligada) é uma sequência de células; – cada célula contém:

• um objeto de algum tipo • e o endereço da célula seguinte.

• Vamos supor que os objetos armazenados nas células são do tipo int. – A estrutura de cada célula de uma tal lista pode ser definida assim:struct cel { int conteudo; struct cel *prox; };

Page 11: Listas Encadeadas Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba

Estrutura de uma lista encadeada

• É conveniente tratar as células como um novo tipo-de-dado e atribuir um nome a esse novo tipo:– typedef struct cel celula;

• Uma célula c e um ponteiro p para uma célula podem ser declarados assim:– celula c; – celula *p;

Page 12: Listas Encadeadas Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba

Estrutura de uma lista encadeada

• Se c é uma célula então c.conteudo é o conteúdo da célula e c.prox é o endereço da próxima célula.

• Se p é o endereço de uma célula, então:– p->conteudo é o conteúdo da célula e– p->prox é o endereço da próxima célula. – Se p é o endereço da última célula da lista

então p->prox vale NULL.

Page 13: Listas Encadeadas Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba

Endereço de uma lista encadeada

• O endereço de uma lista encadeada é o endereço de sua primeira célula.

• Se p é o endereço de uma lista, convém, às vezes, dizer simplesmente "p é uma lista".

• Listas são entidades eminentemente recursivos.– Para tornar isso evidente, basta fazer a seguinte

observação: • se p é uma lista então vale uma das seguintes alternativas:

– p == NULL ou– p->prox é uma lista.

Page 14: Listas Encadeadas Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba

Listas com cabeça e sem cabeça

• Uma lista encadeada pode ser organizada de duas maneiras diferentes, um óbvia e outra menos óbvia.

• Lista com cabeça – O conteúdo da primeira célula é irrelevante: ela

serve apenas para marcar o início da lista. • A primeira célula é a cabeça (= head cell = dummy cell)

da lista. • A primeira célula está sempre no mesmo lugar na

memória, mesmo que a lista fique vazia.

Page 15: Listas Encadeadas Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba

Lista com cabeça

• Digamos que ini é o endereço da primeira célula.

• Então ini->prox == NULL se e somente se a lista está vazia. Para criar uma lista vazia, basta dizer

Page 16: Listas Encadeadas Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba

Lista sem cabeça

• Lista sem cabeça– O conteúdo da primeira célula é tão relevante

quanto o das demais. – Nesse caso, a lista está vazia se o endereço de sua

primeira célula é NULL. • Para criar uma lista vazia basta fazer

Page 17: Listas Encadeadas Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba

Alocação estática de memória

• As declarações abaixo alocam memória para diversas variáveis. A alocação é estática, pois acontece antes que o programa comece a ser executado:– char c; – int i; – int v[10];

Page 18: Listas Encadeadas Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba

Alocação dinâmica de memória

• Às vezes, a quantidade de memória a alocar só se torna conhecida durante a execução do programa.

• Para lidar com essa situação é preciso recorrer à alocação dinâmica de memória.

• A alocação dinâmica é gerenciada pelas funções:– malloc – Free

• que estão na biblioteca stdlib. – Para usar esta biblioteca, é preciso dizer

» #include <stdlib.h> no início do programa.

Page 19: Listas Encadeadas Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba

Função malloc

• A função malloc (abreviatura de memory allocation) – aloca um bloco de bytes consecutivos na memória do

computador • e devolve o endereço desse bloco. • O número de bytes é especificado no argumento da função.

• No seguinte fragmento de código, malloc aloca 1 byte: O endereço devolvido por malloc é do tipo

"genérico" void *. O programador armazena esse endereço num ponteiro de tipo apropriado. No exemplo ao lado, o endereço é armazenado num ponteiro-para-char.

Page 20: Listas Encadeadas Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba

Função malloc

• O que fazer para alocar um tipo-de-dado que ocupa vários bytes?– É preciso recorrer ao operador sizeof, que diz

quantos bytes o tipo especificado tem:

Page 21: Listas Encadeadas Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba

Atenção

• Overhead. Cada invocação de malloc aloca um bloco de bytes consecutivos maior que o solicitado: – os bytes adicionais são usados para guardar informações

administrativas sobre o bloco de bytes • essas informações permitem que o bloco seja corretamente

desalocado, mais tarde, pela função free.

– O número de bytes adicionais pode ser grande, mas não depende do número de bytes solicitado no argumento de malloc.

• Não é recomendável, portanto, invocar malloc repetidas vezes com argumento muito pequeno.

• É preferível alocar um grande bloco de bytes e retirar pequenas porções desse bloco na medida do necessário.

Page 22: Listas Encadeadas Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba

A memória é finita

• Se a memória do computador já estiver toda ocupada?– malloc não consegue alocar mais espaço • e devolve NULL.

• Convém verificar essa possibilidade antes de prosseguir:

Page 23: Listas Encadeadas Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba

Função Free

• As variáveis alocadas estaticamente dentro de uma função desaparecem quando a execução da função termina.

• Já as variáveis alocadas dinamicamente continuam a existir mesmo depois que a execução da função termina.

• Se for necessário liberar a memória ocupada por essas variáveis, é preciso recorrer à função free.

Page 24: Listas Encadeadas Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba

Função Free

• A função free libera a porção de memória alocada por malloc.

• O comando free( ptr) avisa o sistema de que o bloco de bytes apontado por ptr está livre.

• A próxima chamada de malloc poderá tomar posse desses bytes.

• A função free não deve ser aplicada a uma parte de um bloco de bytes alocado por malloc; – aplique free apenas ao bloco todo.

Page 25: Listas Encadeadas Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba

Função Free

• Convém não deixar ponteiros "soltos" (= dangling pointers) no seu programa– pois isso pode ser explorado por hackers para

atacar o seu computador. • Portanto, depois de cada free( ptr), atribua NULL a ptr:

Page 26: Listas Encadeadas Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba

Para saber mais

• Ler e entender os algoritmos descrito em:• http://www.inf.ufsc.br/~ine5384-hp/

Capitulo4/EstruturasListaEncadeada.html

Page 27: Listas Encadeadas Professor Reverton de Paula Faculdade Anhanguera de Indaiatuba

Bibliografia

• http://www.ime.usp.br/~pf/algoritmos/aulas/lista.html

• https://www.caelum.com.br%2Fapostila-java-estrutura-dados%2Flistas-ligadas