Você está na página 1de 38

Listas

Prof: Osman Lira Junior


Listas

• Definição:
o São estruturas formadas por um conjunto de dados de
forma a preservar a relação de ordem linear entre eles.
Uma lista é composta por nós, os quais podem conter,
cada um deles, um dado primitivo ou composto.
o Os elementos podem ser inseridos e retirados em
qualquer posição da lista.

LISTA A B C D

NÓ NÓ NÓ NÓ
Listas

• Exemplos:
o Lista telefônica
o Lista de clientes de agência bancária
o Utilizada como suporte para implementação de pilhas
(LIFO) e filas dinâmicas (FIFO).
Listas
• Operações:
o a) Inicializar (init)
§ Inicializa a lista como vazia.

o b) ListaVazia (empty)
§ Função que retorna se a lista está vazia.

o c) Inserir (insert)
§ Função que incluí um item no início da lista.
Listas
• Tipos:
o a) Estática:
§ Utiliza vetor.
§ Os elementos estão armazenados fisicamente em
posições consecutivas.
§ O apontamento do próximo elemento armazena um índice
do vetor.
§ Classificação: Sequencial

o b) Dinâmica
§ Utiliza ponteiros.
§ Os elementos estão dispersos na memória.
§ O apontamento do próximo elemento armazena um
endereço de memória.
§ Classificação: encadeada, duplamente encadeada,
circular.
Listas
• Lista Dinâmica - Classificação:
o a) Simplesmente Encadeada:
§ Acesso aos elementos somente em uma direção.
§ Cada nó possui o endereço do nó seguinte.
o b) Duplamente Encadeada
§ Acesso aos elementos em ambas as direções.
§ Cada nó possui o endereço do nó anterior e posterior
a ele.
§ Permite a reconstrução caso uma das extremidades
seja perdida.
o c) Circular
§ O ultimo nó aponta para o primeiro nó da lista
tornando-a circular.
Listas

• Implementação em C:
o a) Lista Dinâmica Encadeada:

struct NO{
int info;
struct NO *prox;
};

typedef struct {
struct NO *inicio;
} LISTA;

§ A variável inicio é um ponteiro para o primeiro elemento da lista.


Listas

NO
info prox info prox info prox info prox
NULL
1 bbb 7 ccc 9 ddd 3
endereço:aaa endereço:bbb endereço:ccc endereço:ddd

inicio

LISTA
aaa
Lista Encadeada
endereço:xyz
Listas

• Implementação em C:
o a) Lista Dinâmica:
§ Para declararmos um variável do tipo lista utilizaremos o
código: LISTA l1;
§ Com isso criamos um variável denominada de l1 em que seu
tipo é LISTA.
§ l1 possui um ponteiro para a estrutura do tipo NO. Esse
ponteiro irá apontar para o elemento do início da lista.
§ A estrutura NO armazenará os dados dos elementos da lista.
§ A variável info armazena o dado da lista.
§ O ponteiro prox irá apontar para o próximo elemento dentro
da lista.
§ No elemento do final, o ponteiro prox aponta para NULL.
Listas

• Implementação em C:
o a) Lista Dinâmica Encadeada:
§ Os elementos da lista serão criados dinâmicamente
utilizando-se a função malloc.
§ O ponteiro prox permitirá que se “navegue” entre os
elementos da lista.
Listas

• Implementação em C:
o a) Lista Dinâmica: Operações
§ Inicializar: função init(&lista)
§ Inicializa a lista como vazia.
§ O ponteiro para o início apontará para NULL.
§ Deve ser a primeira função a ser chamada
antes de se utilizar a lista criada.
Listas

• Implementação em C:
o a) Lista Dinâmica: Operações
§ Inicializar: função init(&lista)
void init(LISTA *ls) {
ls->inicio = NULL;
}

utilização: init(&l1);
Listas

• Implementação em C:
o a) Lista Dinâmica: Operações
§ ListaVazia: função empty(&lista)
§ Conforme descrito na função init, em que a lista é
criada vazia, uma lista não terá elementos quando
o início apontar para NULL.
Listas

• Implementação em C:
o a) Lista Dinâmica: Operações
§ ListaVazia: função empty(&lista)

int empty (LISTA *ls) {


if (ls->inicio == NULL)
return 1; // Lista vazia
else
return 0; // Lista NÃO vazia
}
Listas

• Implementação em C:
o a) Lista Dinâmica: Operações
§ Inserir: função insert(&lista,valor)
§ A cada inclusão um novo nó é inserido no
início da lista. O ponteiro inicio deve apontar
para esse novo elemento.
§ Os valores dos elementos serão
armazenados em novos elemento do tipo
estrutura NO.
Listas

• Implementação em C:
o a) Lista Dinâmica: Operações
§ Inserir: função insert(&lista,valor)

void insert(LISTA *ls, int pValor) {


struct NO *novo = (struct NO*) malloc(sizeof(struct NO));
novo->info = pValor;
novo->prox = ls->inicio;
ls->inicio=novo;
}
Listas

Lista Duplamente Encadeada


Listas

• Implementação em C:
o b) Lista Dinâmica Duplamente Encadeada:

struct NO{
int info;
struct NO *prox;
struct NO *ant;
};

typedef struct {
struct NO *inicio;
} LISTA;

§ A variável inicio é um ponteiro para o primeiro elemento da lista.


Listas

NO
info prox ant info prox ant info prox ant info prox ant

1 bbb null 7 ccc aaa 9 ddd bbb 3 NULL ccc

endereço:aaa endereço:bbb endereço:ccc endereço:ddd

inicio
aaa Lista Duplamente Encadeada
LISTA

endereço:xyz
Listas

• Implementação em C:
o b) Lista Dinâmica Duplamente Encadeada:
§ Para declarararmos um variável do tipo lista utilizaremos o
código: LISTA l1;
§ Com isso criamos um variável denominada de l1 em que seu
tipo é LISTA.
§ l1 possui um ponteiro para a estrutura do tipo NO. Esse
ponteiro irá apontar para o elemento do início da lista.
§ A estrutura NO armazenará os dados dos elementos da lista.
§ A variável info armazena o dado da lista.
§ O ponteiro prox irá apontar para o próximo elemento dentro
da lista.
§ O ponteiro ant irá apontar para o elemento anterior dentro da
lista.
§ No elemento do final, o ponteiro prox aponta para NULL.
Listas

• Implementação em C:
o b) Lista Dinâmica Duplamente Encadeada:
§ Os elementos da lista serão criados dinâmicamente
utilizando-se a função malloc.
§ Os ponteiros prox e ant permitem a navegação em
ambas as direções na lista.
Listas

• Implementação em C:
o b) Lista Dinâmica Duplamente Encadadeada:
Operações
§ Inicializar: função init(&lista)
§ Inicializa a lista como vazia.
§ O ponteiro para o início apontará para NULL.
§ Deve ser a primeira função a ser chamada
antes de se utilizar a lista criada.
Listas

• Implementação em C:
o b) Lista Dinâmica Duplamente Encadeada: Operações
§ Inicializar: função init(&lista)
void init(LISTA *ls) {
ls->inicio = NULL;
}

utilização: init(&l1);
Listas

• Implementação em C:
o b) Lista Dinâmica Duplamente Encadeada: Operações
§ ListaVazia: função empty(&lista)
§ Conforme descrito na função init, em que a lista é
criada vazia, uma lista não terá elementos quando
o início apontar para NULL.
Listas

• Implementação em C:
o b) Lista Dinâmica Duplamente Encadeada: Operações
§ ListaVazia: função empty(&lista)

int empty (LISTA *ls) {


if (ls->inicio == NULL)
return 1; // Lista vazia
else
return 0; // Lista NÃO vazia
}
Listas

• Implementação em C:
o b) Lista Dinâmica Duplamente Encadeada: Operações
§ Inserir: função insert(&lista,valor)
§ A cada inclusão um novo nó é inserido no
início da lista. O ponteiro inicio deve apontar
para esse novo elemento.
§ Os valores dos elementos serão
armazenados em novos elemento do tipo
estrutura NO.
Listas

• Implementação em C:
o b) Lista Dinâmica Duplamente Encadeada: Operações
§ Inserir: função insert(&lista,valor)
void insert(LISTA *ls, int pValor) {
struct NO *novo = (struct NO*) malloc(sizeof(struct NO));
if (ls->inicio != NULL) {
ls->inicio->ant = novo;
}
novo->info = pValor;
novo->prox = ls->inicio;
novo->ant = NULL;
ls->inicio=novo;
}
Listas

Lista Circular
Listas
• Implementação em C:
o b) Lista Circular:
§ Na lista circular encadeada o campo prox do último
elemento aponta para o primeiro elemento da lista.
§ Com essa implementação a partir de qualquer ponto da
lista pode-se atingir qualquer outro ponto.
§ Na lista circular duplamente encadeada o campo prox
do último elemento aponta para o primeiro elemento da
lista e o campo ant do primeiro elemento aponta para o
ultimo elemento.
§ Com essa implementação pode percorrer a lista em
qualquer direção a partir de qualquer ponto da lista.
Listas
• Implementação em C:
o b) Lista Encadeada Circular: Inserção
§ 1a Forma: Navegando até o final
void insert(LISTA *ls, int pValor) {
struct NO *novo = (struct NO*) malloc(sizeof(struct NO));
novo->info = pValor;
if (empty(ls)) {
novo->prox = novo;
} else {
struct NO *navegador = ls->inicio;
while(navegador->prox != ls->inicio) {
navegador = navegador->prox;
}
navegador->prox = novo;
novo->prox = ls->inicio;
}
ls->inicio = novo;
}
Listas

• Implementação em C:
o b) Lista Encadeada Circular: Inserção
§ 2a Forma: Usando ponteiro para o final
void insert(LISTA *ls, int pValor) {
struct NO *novo = (struct NO*) malloc(sizeof(struct NO));
novo->info = pValor;
if (empty(ls)) {
ls->fim = novo;
} else {
novo->prox = ls->inicio;
}
ls->inicio = novo;
ls->fim->prox = ls->inicio;
}
Listas

• Implementação em C:
o b) Lista Encadeada Circular: Exibição

void exibeLista(LISTA *ls) {


struct NO *navegador = ls->inicio;
do{
printf("Info %d Endereço %x Prox %x \n",
navegador->info, navegador, navegador->prox);
navegador = navegador->prox;
} while (navegador != ls->inicio);
}
Listas
• Implementação em C:
o b) Lista Duplamente Encadeada Circular: Inserção
§ 1a Forma: Navegando até o final
void insert(LISTA *ls, int pValor) {
struct NO *novo = (struct NO*) malloc(sizeof(struct NO));
novo->info = pValor;
if (empty(ls)) {
novo->prox = novo;
novo->ant = novo;
} else {
struct NO *navegador = ls->inicio;
while(navegador->prox != ls->inicio) {
navegador = navegador->prox;
}
navegador->prox = novo;
novo->ant = navegador;
novo->prox = ls->inicio;
ls->inicio->ant = novo;
}
ls->inicio = novo; }
Listas
• Implementação em C:
o b) Lista Duplamente Encadeada Circular: Inserção
§ 2a Forma: Usando ponteiro para o final
void insert(LISTA *ls, int pValor) {
struct NO *novo = (struct NO*) malloc(sizeof(struct NO));
novo->info = pValor;
if (empty(ls)) {
ls->fim = novo;
} else {
novo->prox = ls->inicio;
ls->inicio->ant = novo;
}
ls->inicio = novo;
ls->fim->prox = ls->inicio;
ls->inicio->ant = ls->fim;
}
Listas

• Implementação em C:
o b) Lista Duplamente Encadeada Circular: Exibição

void exibeLista(LISTA *ls) {


struct NO *navegador = ls->inicio;
do{
printf("Info %d Endereço %x Prox %x Ant
%d\n", navegador->info, navegador,
navegador->prox, navegador->ant);
navegador = navegador->prox;
} while (navegador != ls->inicio);
}
Listas

Lista Estáticas
Listas
• Listas Estáticas:
o a) Sequencial:
§ Características:
§ Utiliza vetor
§ Elementos armazenados em posições consecutivas
§ A Inserção de um elemento em uma posição i causa o deslocamento
para a direita de todos os elementos de i ao último elemento
§ A remoção do elemento da posição i requer o deslocamento para a
esquerda dos elementos em i+1 ao último.
§ Vantagens:
§ Acesso a qualquer elemento da lista pelo o indice.
§ Tempo constante para acessar qual elemento da lista.
§ Desvantagens:
§ Movimentação de elementos quando remove-se ou insere-se um
elemento.
§ Tamanho máximo deve ser conhecido previamente.
Listas
• Listas Estáticas:
o b) Encadeada:
§ Características:
§ Os elementos da lista guardam o endereço do elemento sucessor.
§ Vantagens:
§ Não necessia mover elementos para inserções ou remoções.
§ Nas inserções e remoções somente os ponteiros são modificados.
§ Desvantagens:
§ Tamanho máximo deve ser conhecido previamente.
§ O acesso ao n-ésimo elemento não pode ser feito diretamente pelo
índice com valor n.

Você também pode gostar