Listas Lineares - UFFboeres/slides_ed/ed5.pdf · Lista Encadeada x Sequencial ! remoção e...
Transcript of Listas Lineares - UFFboeres/slides_ed/ed5.pdf · Lista Encadeada x Sequencial ! remoção e...
1
Listas Lineares
continuando .......
2
Listas ! relembrando: listas lineares agrupa informações
referentes aum 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 S.
3
Listas Encadeadas
4
Tipo de Dados Recursivo ! Um tipo T recursivo, possui componentes que
pertencem ao tipo ! definem agregados de crescimento arbitrário
! objetos do tipo recursivo podem ser implementados pelo uso de ponteiros
! um componente é representado por um elemento contendo um ponteiro para o objeto struct { int a; no* proximo
} no;
5
Listas Encadeadas
! podem crescer e diminuir dinamicamente ! tamanho máximo não precisa ser conhecido a
priori ! Provêem flexibilidade permitindo que os ítens
sejam rearrumados eficientemente ! perda no tempo de acesso a qualquer item
arbitrário da lista
6
A L I T S
Listas Encadeadas ! É um conjunto de itens organizados, como
um array (lista sequencial) ! em um array a organização é implícita (pela
posição) ! em uma lista encadeada a sequência de elementos
é especificada explícitamente, onde cada elemento contém um ponteiro para o próximo da lista.
7
Listas Encadeadas ! No exemplo:
! um elemento é identificado por uma letra ! cada elemento é representado por círculo ! Cada link é representado por uma seta
! 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)
! um ponteiro ou um elemento para o 1º da lista.
A L I T S head
8
A L I T S
head
Listas Encadeadas ! algumas operações são mais eficientes do que
em lista sequencial ! mover um elemento com a identificação T do fim da
lista para o começo ! Mesmo que a lista seja muito longa, a mudança estrutural é
realizada através de 3 operações
9
Listas Encadeadas ! Para inserção de um novo elemento X:
! aloca-se memória para um elemento e 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
A L I T S head
X
10
! 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
A L I T S head
X
Listas Encadeadas
11
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
12
Listas Encadeadas
Duplamente encadeada - ponteiros para duas direções ! um ponteiro para o próximo e um para o anterior
Simplesmente encadeada - ponteiros em uma direção
13
Listas Encadeadas ! Exemplo: Suponha uma lista simplesmente encadeada
! Cada nó consiste de: 1 palavavra com 1 floating point e outra com o ponteiro para o próximo nó
! o fim da lista é marcado com um ponteiro com NULL
! É desejável descobrir se algum nó possui um número igual a 1.0
! Deve retornar Verdade se encontrar e Falso em caso contrário
14
Listas Encadeadas typedef struct { float valor; tipo_nó * proximo } tipo_nó; tipo_nó * head; tipo_nó * prox; Acha_1() { prox = head;
resultado = false;
while ( (prox != NULL) && (!resultado)){
if (prox->valor == 1.0) resultado = true;
else prox = prox->proximo;
} return(resultado);
}
15
Listas Encadeadas ! Inserção e Remoção
! alocação dinâmica de memória ! malloc e free do C
! Exemplo de uso: ! Rotina que toma conta do espaço livre de memória ! lista de memória livre
! Ao liberar memória - inserção na lista ! Ao alocar memória - remoção da lista
16
Listas Encadeadas - Inserção ! seja uma lista em que cada
elemento armazena um inteiro
! inserir sempre no início
Estrutura usada struct { int info; tipo_no * proximo } tipo_no; tipo_no * head; head = NULL;
Protótipo da Função Insere(int valor)
head
17
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->prox; head->prox = novo; return(true);
}
18
Listas Encadeadas - Remoção ! remover o 1º elemento, retornando o valor
armazenado ! Se remover de uma lista vazia?
head
19
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);
}
20
Busca Listas Encadeadas
! Busca 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
head
21
Busca Listas Encadeadas
busca_encadeada (valor, ant, pt) { pt = head; ant = head;
while (pt != NULL) && ( pt->info != valor){ ant = pt; pt = pt->prox; }
}
head
22
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, pois o campo proximo do último
elemento aponta para NULL
head
23
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
24
Listas Encadeadas - Inserção Insere(valor){
pt =busca_encadeada (valor, ant, pt ); if (pt == NULL){ novo = malloc ();
novo->info = valor; novo->prox = head; head = novo; }
}
25
Listas Encadeadas - Remoção
! Problema: remover o elemento que armazenar um dado valor em uma lista encadeada não ordenada, caso exista
26
Listas Encadeadas - Remoção remove_enc(valor) {
busca_encadeada ( valor, ant, pt); if (pt != NULL){ ant->prox = pt->prox; if (ant == pt) head = pt->prox; free (pt); }else “não encontrado”;
}
27
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; }
}
28
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
29
Listas Encadeadas Exercício ! Fazer rotinas para inserção, remoção, e localizar
o n-ésimo elemento ! Fazer rotina para localizar o elemento antes
daquele de valor 5, considerando uma lista desordenada ! Qual a melhor representação: simplesmente
ou duplamente encadeada ?