Algoritmos e Estruturas de dados Listas Encadeadas - continuação Prof. Dr. Fábio Rodrigues de la Rocha (Listas Encadeadas - continuação) 1 / 10
Listas encadeadas com indicadores de inicio e fim Anteriormente foram apresentadas listas encadeadas que eram assim definidas: 1 struct tipo_ l { 2 int valor ; 3 struct tipo_ l * proximo ; 4 }; 5 6 typedef struct { 7 struct tipo_ l * inicio ; 8 int quantidade ; 9 } Tipo_Lista ; Ou seja, existe um indicador de inicio da lista. Este indicador é utilizado por algumas funções para saber onde a lista começa. Sabendo (Listas Encadeadas onde - continuação) a lista começa, basta acessar o campo próximo e 2 / 10
Listas com indicador de início e fim Uma variação do esquema apresentado é utilizar um indicador de início e fim. Utilizando este indicador pode-se conhecer quem é o último elemento da lista, sem a necessidade de percorrê-la. Isto é especialmente útil numa operação de inserção, onde devemos inserir elementos ao final da lista. 1 struct tipo_ l { 2 int valor ; 3 struct tipo_ l * proximo ; 4 }; 5 6 typedef struct { 7 struct tipo_ l * inicio ; 8 struct tipo_ l * fim ; 9 int quantidade ; 10 } Tipo_Lista ; (Listas Encadeadas - continuação) 3 / 10
Exercício Escreva as funções : inicializa_lista(&l) - inicializa a lista; insere_elemento(&l,x) - Insere um x elemento no final da lista; mostra_lista(l) - Mostra os elementos da lista. (Listas Encadeadas - continuação) 4 / 10
Listas duplamente encadeadas Uma outra variação possível para listas encadeadas são as chamadas listas duplamente encadeadas. Uma lista duplamente encadeada é uma lista encadeada que além de possuir um ponteiro para o próximo elemento possuí um ponteiro para o elemento anterior. Veja inicio Fim Quantidade typedef struct { struct tipo_l inicio; struct tipo_l fim; int quantidade; } struct tipo_l { int valor; struct tipo_l proximo; struct tipo_l anterior; }; valor Anterior Proximo valor Anterior Proximo na figura: valor Anterior Proximo (Listas Encadeadas - continuação) 5 / 10
Listas duplamente encadeadas Vantagens das listas duplamente encadeadas: É possível percorrer a lista em qualquer direção. Se a lista estiver ordenada em ordem crescente, podemos decidir percorrê-la partindo do fim e sempre consultar o indicador anterior, até chegar no primeiro elemento da lista. Se possuirmos uma operação pesquisa (que retorna o ponteiro do elemento encontrado ou NULL se não existe elemento) podemos facilmente criar uma operação elimina. Por que? Pois se soubermos o endereço do elemento, podemos acessar o anterior e o próximo e atualizar os ponteiros destes antes de liberar a memória. 1 // procura o valor 100; 2 x = pesquisa (L,100) ; 3 if (x!= NULL ) elimina (&L,x); (Listas Encadeadas - continuação) 6 / 10
Listas duplamente encadeadas Desvantagens das listas duplamente encadeadas: Gasto de memória com ponteiros; Mais variáveis para atualizar quando se realiza operações de inserção/eliminação. (Listas Encadeadas - continuação) 7 / 10
Exercício Implemente em C as seguintes funções para trabalhar com listas duplamente encadeadas: inicializa(&l); insere(&l,x); end=pesquisa (L, x); elimina (&L, end); elimina_todos_seguintes (&L,end) Elimina todos os elementos seguintes ao elemento informado. (Listas Encadeadas - continuação) 8 / 10
Exercício Crie uma lista simplesmente encadeada para armazenar os pontos de um poĺıgono. Crie as funções: inicializa_poligono(&p), insere_pontos_poligono(&p,x,y) e calcula_perímetro_polígono(p); P2(X2, Y2); P3(X3,Y3); P1(X1,Y1); P4(X4,Y4); (Listas Encadeadas - continuação) 9 / 10
Exercício Crie uma lista simplesmente encadeada para armazenar os pontos de uma função. Crie as funções: inicializa_funcao(&p), insere_pontos_funcao(&p,x,y) e calcula_integral(p, x_inicial, x_final); P1(x1,y1); P2(x2,y2) P4(x4,y4); P5(x5,y5); P3(x3,y3); P6(x6,y6) P7(x7,y7); P8(x8,y8); P9(x9,y9); x1 x2 x3 x4 x5 x6 x7 x8 x9 Ex: Calcular a integral entre x4 x8 ou seja, a area sob a curva (Listas Encadeadas - continuação) 10 / 10