Escolar Documentos
Profissional Documentos
Cultura Documentos
1/84
MCTA028-15: Programação Estruturada
Aula 8: Listas
Introdução
3/84
Introdução
Na Ciência da Computação, uma lista:
É uma estrutura de dados linear utilizada para armazenar e organizar
dados em um computador;
É uma sequência de elementos do MESMO tipo;
Pode possuir N (N>=0) elementos ou itens;
Se N=0, a lista está VAZIA.
44 10 3 99
Vamos estudar:
Lista sequencial estática (primeira parte);
Lista dinâmica encadeada (segunda parte).
4/84
Alocação de Memória
5/84
Alocação de Memória
Alocação estática:
Espaço de memória é alocado no momento da compilação do
programa;
É necessário definir o NÚMERO MÁXIMO de elementos que a lista irá
possuir.
Alocação dinâmica:
Espaço de memória é alocado em TEMPO DE EXECUÇÃO;
A lista CRESCE à medida que novos elementos são armazenados;
A lista DIMINUI à medida que elementos são removidos.
6/84
Acesso encadeado:
Cada elemento pode estar em uma área distinta da memória, não
necessariamente consecutivas;
É necessário que cada elemento da lista armazene, além da sua informação, o
endereço de memória onde se encontra o PRÓXIMO elemento;
Para acessar um elemento, é preciso PERCORRER todos os seus antecessores na
lista.
8/84
Operações Básicas
9/84
Operações Básicas
Independente do tipo de alocação e acesso, as seguintes
operações básicas podem ser implementadas:
Criação da lista;
Inserção de um elemento na lista;
Remoção de um elemento na lista;
Busca por um elemento da lista;
Destruição da lista;
Informações sobre tamanho, se a lista está cheia ou vazia, etc.
10/84
Desvantagens:
Definição prévia do tamanho do array e, consequentemente, da lista;
Dificuldade para inserir e remover um elemento entre outros dois:
É necessário deslocar os elementos para abrir espaço dentro do
array.
13/84
Definindo o Tipo
15/84
Criando a Lista
18/84
Ponteiro para estrutura lista. Alocando a área de
memória para a
lista.
= (*li).qtd=0; armazena a quantidade de
elementos inseridos na lista.
qtd 0
0 1 2 3 4
Lista *li;
num
tamArray-1
19/84
“Destruindo” a Lista
20/84
qtd
Lista *li;
num
0 tamArray-1
21/84
Tamanho da Lista
22/84
num 12 5 10 55
0 tamArray-1
Para saber o tamanho da lista, basta retornar o
valor de qtd.
Lista Cheia
24/84
Lista Cheia:
li->qdt == tamArray
qtd tamArray
num 12 5 10 55 44
0 tamArray-1
Se ocorreu algum problema na criação da lista, o valor
retornado será -1.
A variável qtd também é utilizada para
saber se a lista está cheia. Basta veri-
ficar se qtd = ao tamanho do array
(tamArray).
Se a lista não estiver cheia, o valor
retornado será 0.
25/84
Lista Vazia
26/84
Inserindo na Lista
28/84
Se ocorreu algum problema na criação da lista, o
valor retornado será 0.
Se a lista estiver cheia, o valor retorna-
do será 0.
Inserindo na próxima posição livre do
array.
Incrementando a quantidade de elementos.
qtd 021
li->num[0]=12 num 12 5
insere_lista(pList, 12);
li->qtd++ 0 tamArray-1
insere_lista(pList, 5); li->num[1]=5
li->qtd++
29/84
qtd 2
num 12 5 10
0 tamArray-1
li->num[2]=10
insere_lista(pList, 10);
li->qtd++
32/84
qtd 4
3
77
num 12 5
12 10
5 10
0 1 2 3 tamArray-1
35/84
Procurando o elemento
(elem) no array.
Se verdade, o elemento não foi encontrado
no array.
Desloca os elementos uma
posição para trás.
remove_lista_elemento(pList, 10);
44/84
Linha i k elem li->num[]
151 0 0
161 1
161 2
166 2
167 [2]=4
166 3
qtd 4
3
num 12 5 10
4 4
0 1 2 3 tamArray-1
45/84
qtd 3
busca_lista_pos(pList, 2); resp = li->num[1]
num 12 5 4
0 1 2 3 tamArray-1
47/84
Procurando o
elemento (elem)
no array.
Se verdade, o elemento não foi encontrado no
array.
Introdução
Uma lista dinâmica encadeada é uma lista definida utilizando alocação dinâmica e
acesso encadeado dos elementos;
Cada elemento da lista é alocado dinamicamente, à medida que os dados são
inseridos dentro da lista, e tem sua memória liberada, à medida que é removido;
Cada elemento é um ponteiro para uma estrutura contendo dois campos de
informação:
CAMPO DE DADO: é utilizado para armazenar a informação inserida na lista;
CAMPO PROX: é um ponteiro que indica o próximo elemento na lista.
pro
dado NULL
x
51/84
Introdução
A lista dinâmica encadeada utiliza um PONTEIRO para PONTEIRO
para guardar o PRIMEIRO elemento da lista:
O ponteiro para ponteiro é utilizado para representar o
INÍCIO da lista.
TODOS os elementos são ponteiros alocados dinamicamente.
Inicio
23 2 15 NULL
52/84
Introdução
Vantagens:
Melhor utilização dos recursos de memória;
Não é preciso definir previamente o tamanho da lista;
Não é necessário movimentar os elementos nas operações de
inserção e remoção.
Desvantagens:
Acesso indireto aos elementos;
Necessidade de percorrer a lista para acessar determinado
elemento.
53/84
Definindo o Tipo
pro
numero Definindo o tipo que descreve cada elemento da
54/84
x
lista.
+ *prox: ponteiro para o próximo elemento da
lista;
+ numero: tipo de dado (int) a ser armazenado
na lista.
Redefinindo a struct para encurtar o
comando.
pro
numero
x
55/84
Criando a Lista
Alocando uma área de memória 56/84
“Destruindo” a Lista
58/84
Se a lista foi criada com sucesso.
23 2 15 NULL
nó nó nó
59/84
Tamanho da Lista
60/84
Tamanho da Lista
Diferente da lista sequencial estática, para saber o
tamanho da lista dinâmica, é preciso PERCORRER toda a
lista, CONTANDO os elementos inseridos nela, até
encontrar o seu final.
61/84
Início (*li)
cont = 3
0
2
1 23 2 15 NULL
nó nó nó nó
62/84
Lista Cheia
63/84
Lista Cheia
Na lista dinâmica encadeada somente será considerada
CHEIA quando NÃO tiver mais memória disponível para
alocar novos elementos:
Apenas ocorrerá quando a chamada da função
malloc() retornar NULL.
64/84
Lista Vazia
65/84
Lista Vazia
Uma lista dinâmica encadeada é considerada VAZIA
sempre que o conteúdo do seu “INÍCIO” apontar para a
constante NULL.
66/84
Verifica se a lista foi criada com sucesso.
Lista Vazia!!!
Início (*li) NULL
Início (*li) Lista Não Vazia!!!
23 2 NULL
67/84
(lista vazia)?
Verificar se a inserção é possível.
Ponteiro aux recebe o endereço da primeira
posição da lista (li).
no
99 NULL
Início (*li)
23 2 15 NULL
99 NULL
23 2 15 NULL
no
76/84
Início (*li)
2 15 NULL
ant no no
78/84
remove_lista(ptList, 2);
Início (*li)
23 2 15 NULL
ant no no
80/84
busca_lista_posicao(ptList, 2);
pos = 2;
i=2
1
resp = 88;
Não encontrou o elemento na lista.
Início (*li)
23 88 15 NULL
no no no
82/84
Busca_lista_conteudo(ptList, 15);
conte = 15;
i = 13
2
Retorna a posição
(i=3) que se encontra o
elemento buscado.
23 88 15 NULL
no no no no
84/84
Referências
Slides do Prof. Luiz Rozante;