Listas Lineares continuando ....... 1 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. 2 Listas Encadeadas 3 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; 4 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 5 Listas Encadeadas ! É um conjunto de itens organizados, como um array (lista sequencial) ! ! A 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. L I S T 6 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 S T head 7 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 A L I S T head 8 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 X A L I S T head 9 Listas Encadeadas ! remoção de um elemento: ! basta alterar o ponteiro do elemento anterior ao removido X A head ! L I S T o conteúdo de X (no exemplo) ainda existe, mas não é mais acessível pela lista 10 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 11 Listas Encadeadas Simplesmente encadeada - ponteiros em uma direção Duplamente encadeada - ponteiros para duas direções ! um ponteiro para o próximo e um para o anterior 12 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 13 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); } 14 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 15 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 16 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); } 17 Listas Encadeadas - Remoção ! ! head remover o 1º elemento, retornando o valor armazenado Se remover de uma lista vazia? 18 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); } 19 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 20 Busca Listas Encadeadas busca_encadeada (valor, ant, pt) { pt = head; ant = head; while (pt != NULL) && ( pt->info != valor){ ant = pt; pt = pt->prox; } } head 21 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 22 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 23 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; } } 24 Listas Encadeadas - Remoção ! Problema: remover o elemento que armazenar um dado valor em uma lista encadeada não ordenada, caso exista 25 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”; } 26 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; } } 27 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 28 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 ? 29