Escolar Documentos
Profissional Documentos
Cultura Documentos
Listas Encadeadas
(Linked Lists)
Bruno Feijó
Dept. de Informática, PUC-Rio
Vetores vs Estruturas Dinâmicas
• Vetores (arrays):
– Ocupa um espaço contíguo de memória
– Permite acesso randômico
– Requer pré-dimensionamento de espaço de memória
• Estruturas Dinâmicas
– Crescem (ou decrescem) à medida que elementos são inseridos (ou
removidos)
– Exemplo: Listas Encadeadas
– Outras estruturas:
• Pilhas
• Filas
Listas Encadeadas
p = p->prox;
}
if (p == NULL)
return lst; /* não achou: retorna lista original */
/* retira elemento */
if (ant == NULL)
{ /* retira elemento do inicio */
lst = p->prox; }
else { /* retira elemento do meio da lista */
ant->prox = p->prox; } lst
free(p);
return lst;
a
}
Libera a Lista e Testa Igualdade
• Destrói a lista, liberando todos os elementos alocados
void lst_libera(Elemento * lst)
{
Elemento * p = lst, * t;
while (p != NULL) {
t = p->prox; /* guarda referência p/ próx. elemento */
free(p); /* libera a memória apontada por p */
p = t; /* faz p apontar para o próximo */
}
}
#include <stdio.h>
#include "lista.h"
int main (void)
{
Elemento * lst; /* declara uma lista não iniciada */
lst=NULL; /* inicia lista vazia */
lst=lst_insere(lst,23); /* insere na lista o elemento 23 */
lst=lst_insere(lst,45); /* insere na lista o elemento 45 */
lst=lst_insere(lst,56); /* insere na lista o elemento 56 */
lst=lst_insere(lst,78); /* insere na lista o elemento 78 */
lst_imprime(lst); /* imprimirá: 78 56 45 23 */
lst=lst_retira(lst,78);
lst_imprime(lst); /* imprimirá: 56 45 23 */
lst=lst_retira(lst,45);
lst_imprime(lst); /* imprimirá: 56 23 */
...
lst_libera(lst);
return 0;
}
Insere Ordenado
Elemento * lst_insere_ordenado(Elemento * lst, int a)
{
Elemento * novo;
Elemento * ant = NULL; /* ponteiro para elemento anterior */
Elemento * p = lst; /* ponteiro para percorrer a lista */
/* procura posição de inserção */
while (p != NULL && p->info < a)
{ ant = p; p = p->prox; }
/* cria novo elemento */
novo = (Elemento *) malloc(sizeof(Elemento));
novo->info = a;
/* encadeia elemento */
if (ant == NULL)
{ /* insere elemento no início */
novo->prox = lst;
lst = novo; }
else { /* insere elemento no meio da lista */
novo->prox = ant->prox;
ant->prox = novo; }
return lst;
}
LISTAS – FUNÇÕES RECURSIVAS
Você pode usar diretamente
lst != NULL no lugar de
Funções de Lista Recursivas !lst_vazia(lst)
void lst_imprime(Elemento * lst)
int lst_vazia(Elemento * lst) {
if ( ! lst_vazia(lst)) {
{ printf(“info: %d\n”,lst->info); // 1º.
return (lst == NULL); lst_imprime(lst->prox);
} }
void lst_libera(Elemento * lst) }
{ void lst_imprimeInvertida(Elemento * lst)
if (!lst_vazia(lst)) {
{ if (!lst_vazia(lst))
{
lst_libera(lst->prox); lst_imprimeInvertida(lst->prox);
free(lst); printf(“info: %d\n”,lst->info);
} }
} }
int lst_igual(Elemento * lst1, Elemento * lst2)
{ Elemento * lst_retira(Elemento * lst, int a)
if (lst1 == NULL && lst2 == NULL) {
return 1; Elemento * t;
else if (lst1 == NULL || lst2 == NULL) if (!lst_vazia(lst)) {
return 0; if (lst->info == a) {
else t = lst;
return (lst1->info == lst2->info) && lst = lst->prox;
lst_igual(lst1->prox,lst2->prox); free(t);
} }
else {
lst_imprime lst->prox= lst_retira(lst->prox,a);
lst_imprimeInvertida }
lst_libera }
lst_igual return lst;
lst_retira }
LISTAS DE TIPOS ESTRUTURADOS
Listas de Tipos Estruturados
• A informação associada a cada elemento pode ser mais complexa, sem
alterar o encadeamento dos elementos
• As funções apresentadas para listas de inteiros podem ser facilmente
adaptadas para tratar listas de outros tipos (as diferenças são pequenas!)
• O campo de informação pode ser representado por um ponteiro para uma
estrutura, ao invés da estrutura em si. Desta maneira, independente da
informação armazenada na lista, a estrutura do elemento é sempre
composta por struct elemento
{
– um ponteiro para a informação e Aluno * info;
– um ponteiro para o próximo elemento da lista struct elemento * prox;
};
• Escolha nomes apropriados para as funções de serviço (mesmo não
sendo um TAD), e.g.: float aluno_obterMedia(Elemento * p) e int
aluno_obterFaltas(Elemento * p) para retornar a média e o número de
faltas de uma lista de alunos como um tipo estruturado:
struct aluno
{
float media;
int faltas;
};
Listas de Tipos Estruturados sem Ponteiros