ESTRUTURA DE DADOSboeres/slides_ed/ed_ListasEncadeadas.pdfESTRUTURA DE DADOS Listas Encadeadas...
Transcript of ESTRUTURA DE DADOSboeres/slides_ed/ed_ListasEncadeadas.pdfESTRUTURA DE DADOS Listas Encadeadas...
-
ESTRUTURA DE DADOS
Listas Encadeadas
Cristina Boeres
-
Listas Lineares
Relembrando
! listas lineares agrupam informações referentes a um conjunto de elementos que, de alguma forma, se relacionam entre si
! Uma lista linear ou está vazia, ou possui uma série de elementos
(a1,a2, ....., an) ! onde ai é um componente de algum conjunto
2
-
Listas Encadeadas
! podem crescer e diminuir dinamicamente ! tamanho máximo não precisa ser conhecido a priori
! Provêem flexibilidade permitindo que os itens sejam rearrumados eficientemente (ainda veremos)
! Estrutura de dados baseada em tipo recursivo de dados
3
-
Listas encadeadas
Tipo recursivo de dados ! um dos campos é um ponteiro para uma estrutura do
mesmo tipo ! definem agregados de crescimento arbitrário ! Exemplo:
struct {
int a;
no* proximo;
} no;
4
-
! Também é um conjunto de itens organizados ! em um vetor ou lista sequencial a organização é
implícita (pela posição) ! alocados em espaços de memória consecutivos
! em uma lista encadeada a sequência de elementos é especificada explicitamente ! cada elemento contém um ponteiro para o próximo
da lista
Listas Encadeadas 5
A L I S T
-
! Olhando mais em detalhes
Listas Encadeadas 6
A L I S T
A 1024 A
L 2052
esse elemento está alocado no endereço 1024
-
Listas Encadeadas
! Detalhes que devem ser considerados: ! todo elemento possui um ponteiro
! o ponteiro do último elemento tem que especificar algum tipo de próximo (aponta para si próprio ou NULL)
! para acessar qualquer elemento da lista
! um ponteiro ou um elemento para o 1º da lista
7
A L I S T
head
-
Listas Encadeadas ! algumas operações são mais eficientes do que em lista
sequencial ! exemplo: o último elemento com valor “T” deve ser o primeiro
da lista ! mesmo que a lista seja muito longa, a mudança é realizada
através de 3 operações
8
A L I S T
head
-
Listas Encadeadas ! algumas operações são mais eficientes do que em lista
sequencial ! exemplo: o último elemento com valor “T” deve ser o primeiro
da lista ! mesmo que a lista seja muito longa, a mudança é realizada
através de 3 operações 1) primeiro: localizar o elemento que contém o valor desejado
9
A L I S T
head pt
-
Listas Encadeadas ! algumas operações são mais eficientes do que em lista
sequencial ! exemplo: o último elemento com valor “T” deve ser o primeiro
da lista ! mesmo que a lista seja muito longa, a mudança é realizada
através de 3 operações 2) o ponteiro próximo dele passa a apontar para o primeiro
elemento
10
A L I S T
head pt
-
Listas Encadeadas ! algumas operações são mais eficientes do que em lista
sequencial ! exemplo: o último elemento com valor “T” deve ser o primeiro
da lista ! mesmo que a lista seja muito longa, a mudança é realizada
através de 3 operações 3) o cabeça, passa a apontar para esse elemento
11
A L I S T
head pt
-
Listas Encadeadas ! algumas operações são mais eficientes do que em lista
sequencial ! exemplo: o último elemento com valor “T” deve ser o primeiro
da lista ! mesmo que a lista seja muito longa, a mudança é realizada
através de 3 operações 4) o anterior a esse elemento, aponta para NULL (tem que ser
localizado também)
12
A L I S T
head pt
-
Listas Encadeadas
! Para inserção de um novo elemento que tenha info X: ! aloca-se memória para um elemento ! atualiza-se os ponteiros
! em lista sequencial seria necessário deslocar todos os elementos a partir do ponto de inserção;
! apenas 2 links são alterados para esta operação - não importa quão longa é a lista
13
A L I S T
head X
-
! remoção de um elemento: ! basta alterar o ponteiro do elemento anterior ao
removido ! o conteúdo de X (no exemplo) ainda existe, mas
não é mais acessível pela lista
Listas Encadeadas 14
A L I S T
head X
-
Listas Encadeadas
! Lista Encadeada x Sequencial ! remoção e inserção são mais naturais na lista encadeada
! outras operações já não são tão naturais
! Encontrar o k-ésimo elemento da lista
! em uma lista sequencial - simplesmente acessar a[k]
! na lista encadeada é necessário percorrer k links.
! Achar um ítem antes de um dado ítem
15
-
Listas Encadeadas
Duplamente encadeada - ponteiros para duas direções ! um ponteiro para o próximo e um para o anterior
16
Simplesmente encadeada - ponteiros em uma direção
-
Listas Encadeadas
Inserção e Remoção ! alocação dinâmica de memória
! aloca() - malloc() ou calloc() do C ! desaloca() ou libera() - free() do C
Exemplo - Gerenciamento de blocos de memória livres ! Rotina que toma conta do espaço livre de memória
! Ao liberar memória - inserção na lista de bloco livres ! Ao alocar memória - remoção da lista
17
-
Listas Encadeadas - Inserção
! seja uma lista em que cada elemento armazena: ! um inteiro ! ponteiro para o próximo elemento da lista
! Problema a resolver: ! inserir um novo elemento sempre no início da lista
18
-
Listas Encadeadas - Inserção
! seja uma lista em que cada elemento armazena: ! um inteiro ! ponteiro para o próximo elemento da lista
! Problema a resolver: ! inserir um novo elemento sempre no início da lista
19
head
10 7 32 17 80
-
Listas Encadeadas - Inserção
! seja uma lista em que cada elemento armazena: ! um inteiro ! ponteiro para o próximo elemento da lista
! Problema a resolver: ! inserir um novo elemento sempre no início da lista
! aloca um novo elemento
20
head
10 7 32 17 80
novo
-
Listas Encadeadas - Inserção
! seja uma lista em que cada elemento armazena: ! um inteiro ! ponteiro para o próximo elemento da lista
! Problema a resolver: ! inserir um novo elemento sempre no início da lista
! inicializa campos
21
head
10 7 32 17 80
novo
X
-
Listas Encadeadas - Inserção
! seja uma lista em que cada elemento armazena: ! um inteiro ! ponteiro para o próximo elemento da lista
! Problema a resolver: ! inserir um novo elemento sempre no início da lista
! cabeça passa apontar para o novo primeiro elemento
22
head
10 7 32 17 80
novo
X
-
Listas Encadeadas - Inserção
Estrutura usada struct { int info; tipo_no * prox; } tipo_no; tipo_no * head; head = NULL;
Protótipo da Função Insere(int valor);
23
-
Listas Encadeadas - Inserção
Insere(int valor) { tipo_no * novo;
novo = malloc (sizeof(tipo_no)); if (!novo) return(false); novo->info = valor; novo->prox = head; head = novo; return(true);
}
24
-
Listas Encadeadas - Remoção
! Problema ! remover o 1º elemento, retornando o valor
armazenado ! Se remover de uma lista vazia? ! E se remover e a lista ficar vazia?
25
-
Listas Encadeadas - Remoção
! Problema ! remover o 1º elemento, retornando o valor
armazenado ! Se remover de uma lista vazia? ! E se remover e a lista ficar vazia?
! aponta para o primeiro elemento
26
head
10 7 32 17 80
pt
-
Listas Encadeadas - Remoção
! Problema ! remover o 1º elemento, retornando o valor
armazenado ! Se remover de uma lista vazia? ! E se remover e a lista ficar vazia?
! atualiza o novo cabeça
27
head
10 7 32 17 80
pt
-
Listas Encadeadas - Remoção
! Problema ! remover o 1º elemento, retornando o valor
armazenado ! Se remover de uma lista vazia? ! E se remover e a lista ficar vazia?
! libera o espaço (antes guarde em uma variável o valor armazenado no elemento)
28
head
7 32 17 80
pt
-
Listas Encadeadas - Remoção
remove () { valor = INEXISTENTE;
if (head != NULL){ valor = head->valor; pt = head; head = head ->prox; free (pt); }else “lista vazia”; return (valor);
}
29
-
Busca em Listas Encadeadas
! Problema: ! Buscar um valor em uma lista encadeada onde os
elementos não seguem uma ordenação ! retorna o elemento que contém o valor
procurado, ou NULL, caso não encontre
30
-
Busca em Listas Encadeadas
! Problema: ! Buscar um valor em uma lista encadeada onde os
elementos não seguem uma ordenação ! retorna o elemento que contém o valor
procurado, ou NULL, caso não encontre
31
10 7 32 17 80
head valor = 32
-
Busca Listas Encadeadas
busca_encadeada (valor, ant, pt) { pt = head; ant = head;
while (pt != NULL) && ( pt->info != valor){ ant = pt; pt = pt->prox; }
}
32
10 7 32 17 80
head valor = 32
-
Busca Listas Encadeadas
! caso o valor esteja na lista ! pt aponta para o elemento que contém o valor
! senão estiver na lista ! pt aponta para NULL - o campo prox do último elemento
aponta para NULL
33
10 7 32 17 80
head valor = 11
-
Listas Encadeadas - Inserção
! Problema: inserir um valor em uma lista encadeada não ordenada, caso não exista ! como não existe ordenação, pode-se inserir no
início da lista
34
-
Listas Encadeadas - Inserção Insere(valor){ pt = head; ant = head;
while (pt != NULL) && ( pt->info != valor){ ant = pt; pt = pt->prox; }
if (pt == NULL){ /* não encontrou o valor na lista */ novo = malloc ();
novo->info = valor; novo->prox = head; head = novo; }
}
35
-
Listas Encadeadas - Inserção Insere(valor){ pt = head; ant = head;
while (pt != NULL) && ( pt->info != valor){ ant = pt; pt = pt->prox; }
if (pt == NULL){ /* não encontrou o valor na lista */ novo = malloc ();
novo->info = valor; novo->prox = head; head = novo; }
}
36
10 7 32 17 80 head
valor = 11
-
Listas Encadeadas - Remoção
! Problema: remover o elemento que armazena um dado valor em uma lista encadeada não ordenada, caso exista
37
-
Listas Encadeadas - Remoção
! Problema: remover o elemento que armazena um dado valor em uma lista encadeada não ordenada, caso exista ! procurar pelo elemento ! retirá-lo se encontrar
38
-
Listas Encadeadas - Remoção remove_enc(valor) { pt = head; ant = head;
while (pt != NULL) && ( pt->info != valor){ ant = pt; pt = pt->prox; } if (pt != NULL){ ant->prox = pt->prox; if (ant == pt) head = pt->prox; free (pt); }else “não encontrado”;
}
39
-
Listas Encadeadas - Remoção remove_enc(valor) { pt = head; ant = head;
while (pt != NULL) && ( pt->info != valor){ ant = pt; pt = pt->prox; } if (pt != NULL){ ant->prox = pt->prox; if (ant == pt) head = pt->prox; free (pt); }else “não encontrado”;
}
40
-
Busca em uma lista ordenada
busca_enc_ord (valor, ant, pt) {
ant = head; pt = head; while ((pt != NULL) && (pt->info < valor)){ ant = pt; pt = pt->prox; }
}
41
-
Pensar
! Fazer um programa que: ! Le números inteiros positivos
a) Calcular média destes números
b) Calcular mínimo e máximo destes números
c) Listar os N maiores
! Sejam x e y dois polinômios. Calcule a soma de x e y e armazene em z
42
-
Listas Encadeadas
Exercício Prático ! Implementar os procedimentos de inserção e remoção
em uma lista encadeada desordenada ! Dado uma lista encadeada, localizar o n-ésimo elemento
43