Você está na página 1de 35

ESTRUTURA E

RECUPERAÇÃO DA
INFORMAÇÃO
()

(ERI)
SISTEMAS DE INFORMAÇÃO
AULA 03 – Listas Encadeadas
Profa. Dra. Lúcia F. A. Guimarães
Listas Encadeadas

• Esta aula foi baseada na Apostila de


Estrutura de Dados – PUC-RIO
Profs. Waldemar Celes e José Lucas Rangel
Listas Encadeadas

• Vetores:
• Forma de representarmos um grupo de dados.

• É a forma mais primitiva de representar diversos


elementos agrupados

• Sua declaração reserva um espaço contíguo de


memória para armazenar seus elementos.

Vetor: ocupa um espaço contíguo de memória,


permitindo que qualquer elemento seja
acessado indexando-se o ponteiro para o primeiro
elemento
Listas Encadeadas

• Vetores:
• O fato de o vetor ocupar um espaço contíguo na
memória nos permite acessar qualquer um de
seus elementos a partir do ponteiro para o
primeiro elemento.
Listas Encadeadas

• Vetores:
• Considere a declaração:
#define MAX 5;

int vet[MAX];

• O vetor é uma estrutura que possibilita acesso


randômico aos elementos, pois podemos
acessar qualquer elemento aleatoriamente.
Listas Encadeadas

• Vetores:
• Entretanto, o vetor não é uma estrutura de dados
muito flexível, pois é necessário dimensioná-lo com
um número máximo de elementos.
• Se este número não for suficiente para armazenar a
quantidade de informações necessárias, não existe uma
maneira simples e barata (computacionalmente) para
alterarmos a dimensão do vetor em tempo de execução.
• E se a quantidade for muito inferior à sua dimensão,
estaremos subutilizando o espaço de memória
reservado.
Listas Encadeadas

• Vetores:
• Solução desses problemas:
• Utilizar estruturas de dados que cresçam à medida
que precisarmos armazenar novos elementos (e
diminuam à medida que precisarmos retirar
elementos armazenados anteriormente).
• Tais estruturas são chamadas dinâmicas e
armazenam cada um dos seus elementos usando
alocação dinâmica.
Listas Encadeadas

• Listas Encadeadas
• Estrutura onde para cada novo elemento inserido,
aloca-se um espaço de memória para armazená-lo.

• O espaço total de memória gasto pela estrutura é


proporcional ao número de elementos nela
armazenado.

• Não é possível garantir que os elementos


armazenados na lista ocuparão um espaço de
memória contíguo.
Listas Encadeadas

• Listas Encadeadas
• Portanto não há acesso direto aos elementos da
lista.
• Para que seja possível percorrer todos os
elementos da lista, é necessário explicitamente
guardar o encadeamento dos elementos,
• O que é feito armazenando-se, junto com a
informação de cada elemento, um ponteiro para o
próximo elemento da lista
Listas Encadeadas

• Listas Encadeadas
• A estrutura consiste numa sequência encadeada de
elementos, em geral chamados de nós da lista.

• A lista é representada por um ponteiro para o primeiro


elemento (ou nó).

• Do primeiro elemento, podemos alcançar o segundo


seguindo o encadeamento, e assim por diante.

• O último elemento da lista aponta para NULL,


sinalizando que não existe um próximo elemento
Listas Encadeadas

• Listas Encadeadas
• Exemplo:
PRIM
1 2 3 //
Listas Encadeadas

• Listas Encadeadas
• Exemplo:
PRIM
1 2 3 //

MEMÓRIA
PRIM
E100
E10 E50
02 ∅
E70

03 ∅
01 ∅
E50
E70
E100
Listas Encadeadas

• Exemplificando • Estrutura auto-referenciada,


• campo que armazena a
struct no
informação (no caso, um
{ número inteiro);
int info; • campo que é um ponteiro para

struct no *prox; uma próxima estrutura do


mesmo tipo.
};
• O tipo nó representa uma
typedef struct no Lista; informação da lista e a estrutura

O comando typedef fornece de lista encadeada é


um “apelido” ao comando representada pelo ponteiro para
struct no que é Lista seu primeiro elemento (tipo
Lista*).
Listas Encadeadas

• Principais Funções :
• Inicialização
• Inserção
• Percorrimento
• Verificação se está vazia
• Busca
• Remoção de um Elemento
• Liberar a Lista
Listas Encadeadas

• Inicialização:
• Cria uma lista vazia, sem nenhum elemento.
/* função de inicialização: MEMÓRIA
retorna uma lista vazia */
Lista* Inicializa (void)
{
return NULL;
}

int main (void)


{
Lista* prim; // declara uma lista não inicializada
prim= Inicializa();// inicializa lista como vazia
...
return 0;
}
Listas Encadeadas

• Inicialização:
• Cria uma lista vazia, sem nenhum elemento.
/* função de inicialização: MEMÓRIA
retorna uma lista vazia */
Lista* Inicializa (void)
{
return NULL;
}

int main (void)


{
Lista* prim; // declara uma lista não inicializada
prim= Inicializa();// inicializa lista como vazia
... PRIM
return 0; LIXO
} E90
Listas Encadeadas

• Inicialização:
• Cria uma lista vazia, sem nenhum elemento.
/* função de inicialização: MEMÓRIA
retorna uma lista vazia */
Lista* Inicializa (void)
{
return NULL;
}

int main (void)


{
Lista* prim; // declara uma lista não inicializada
prim= Inicializa();// inicializa lista como vazia
... PRIM
return 0; LIXO
} E90
Listas Encadeadas

• Inicialização:
• Cria uma lista vazia, sem nenhum elemento.
/* função de inicialização: MEMÓRIA
retorna uma lista vazia */
Lista* Inicializa (void)
{
return NULL;
}

int main (void)


{
Lista* prim; // declara uma lista não inicializada
prim= Inicializa();// inicializa lista como vazia
... PRIM
return 0; LIXO
NULL
} E90
Listas Encadeadas

• Inicialização:
• Cria uma lista vazia, sem nenhum elemento.
/* função de inicialização: MEMÓRIA
retorna uma lista vazia */
Lista* Inicializa (void)
{
return NULL;
}

int main (void)


{
Lista* prim; // declara uma lista não inicializada
prim= Inicializa();// inicializa lista como vazia
prim = insere(prim, 4); PRIM
... LIXO
NULL
return 0; E90
}
Listas Encadeadas

• Inserção:
• Uma vez criada a lista vazia, é possível a inserção
novos elementos nela.
• Para cada elemento inserido na lista, é necessário
alocar dinamicamente a memória necessária para
armazenar o elemento e encadeá-lo na lista
existente.
• A Lista Encadeada permite a inserção de um elemento
em qualquer posição.
• A função de inserção mais simples insere o novo
elemento no início da lista.
Listas Encadeadas

• Inserção:
• O início da lista deve ter seu valor atualizado, pois
a lista deve passar a ser representada pelo
ponteiro para o novo primeiro elemento.
Listas Encadeadas

• Inserção:
• Por esta razão, a função de inserção recebe como
parâmetros de entrada:
• A lista onde será inserido o novo elemento e
• A informação do novo elemento.

• E tem como valor de retorno a nova lista,


representada pelo ponteiro para o novo
elemento.
Listas Encadeadas

• Inserção- Exemplo:
/* inserção no início: retorna a lista atualizada */
Lista* insere (Lista* recebida, int valor)
{
Lista *novo ;
novo= (Lista*) malloc(sizeof(Lista));
novo->info = valor;
novo->prox = recebida;
return novo;
}
Listas Encadeadas

• Inserção- Exemplo:
/* inserção no início: retorna a lista atualizada */
Lista* insere (Lista* recebida, int valor)
Parâmetros de Entrada:
{ Lista e informação

Lista* novo = (Lista*) malloc(sizeof(Lista));


novo->info = valor;
novo->prox = recebida;
return novo;
}
Listas Encadeadas

• Inserção- Exemplo:
/* inserção no início: retorna a lista atualizada */
Lista* insere (Lista* recebida, int valor)
{ Retorna a nova Lista

Lista* novo = (Lista*) malloc(sizeof(Lista));


novo->info = valor;
novo->prox = recebida;
return novo;
}
Listas Encadeadas
MEMÓRIA

• Inserção- Exemplo: PRIM


02 E70
E100
Lista* insere (Lista* E50
E10
recebida, int valor)
{
03 ∅
Lista* novo = (Lista*)
E70
malloc(sizeof(Lista));
novo->info = recebida;
novo->prox = valor; 01 E50
return novo; E100
}
PRIM
1 2 3
prim = insere( prim , 4); Listas Encadeadas
MEMÓRIA

• Inserção- Exemplo: PRIM


02 E70
E100
Lista* insere (Lista E50
E10
*recebida
*recebida, int valor)
{
03 ∅
Lista* novo = (Lista*)
E70
malloc(sizeof(Lista));
novo->info = valor; RECEBIDA
novo->prox = recebida; E100 01 E50
return novo; E90 E100
}
PRIM
1 2 3
prim = insere( prim , 44); Listas Encadeadas
MEMÓRIA

• Inserção- Exemplo: PRIM


02 E70
E100
Lista* insere (Lista* E50
E10
recebida, int valor)
{
03 ∅
Lista* novo = (Lista*)
E70 VALOR
malloc(sizeof(Lista)); 04
E80
novo->info = valor; RECEBIDA
novo->prox = recebida; E100 01 E50
return novo; E90 E100
}
PRIM
1 2 3
Listas Encadeadas
MEMÓRIA

• Inserção- Exemplo: PRIM


02 E70
E100
Lista* insere (Lista* E50
E10
recebida, int valor) LLLIIIXXXOOOO NOVO
E60 E60
{ E75
03 ∅
Lista* novo = (Lista*)
E70 VALOR
malloc(sizeof(Lista)); 04
E80
novo->info = valor; RECEBIDA
novo->prox = recebida; E100 01 E50
return novo; NOVO E90 E100
}
PRIM
1 2 3
Listas Encadeadas
MEMÓRIA

• Inserção- Exemplo: PRIM


02 E70
E100
Lista* insere (Lista* E50
E10
recebida, int valor) 04 lixxo NOVO
E60 E60
{ E75
03 ∅
Lista* novo = (Lista*)
E70 VALOR
malloc(sizeof(Lista)); 04
E80
novo->info = valor; RECEBIDA
novo->prox = recebida; E100 01 E50
return novo; NOVO E90 E100
} 04
PRIM
1 2 3
Listas Encadeadas
MEMÓRIA

• Inserção- Exemplo: PRIM


02 E70
E100
Lista* insere (Lista* E50
E10
recebida, int valor) 04 E100
lixxo NOVO
E60 E60
{ E75
03 ∅
Lista* novo = (Lista*)
E70 VALOR
malloc(sizeof(Lista)); 04
E80
novo->info = valor; RECEBIDA
novo->prox = recebida; E100 01 E50
return novo; NOVO E90 E100
} 04
PRIM
1 2 3
Listas Encadeadas
MEMÓRIA

• Inserção- Exemplo: PRIM


02 E70
E100
Lista* insere (Lista* E50
E10
recebida, int valor) 04 E100
lixxo NOVO
E60 E60
{ E75
03 ∅
Lista* novo = (Lista*)
E70 VALOR
malloc(sizeof(Lista)); 04
E80
novo->info = valor; RECEBIDA
novo->prox = recebida; E100 01 E50
????? return novo; NOVO E90 E100
} 04
PRIM
1 2 3
Listas Encadeadas
Lista* insere (Lista* MEMÓRIA
recebida, int valor) PRIM
{ 02 E70
E100
E60
Lista* novo = (Lista*) E50
E10
malloc(sizeof(Lista));
novo->info = valor; 04 E100
lixxo NOVO
novo->prox = recebida; E60 E60
return novo; E75
03 ∅
}
int main (void) E70 VALOR
{ 04
Lista* prim; E80
prim= Inicializa() RECEBIDA
prim = insere(prim, 4); E100
... 01 E50
return 0; PRIM E90
NOVO E100
} 04
PRIM
1 2 3
Listas Encadeadas
MEMÓRIA

PRIM
02 E70
E60
E50
E50
E10
04 lixxo
E100
E60
E60
03 ∅

E70

01 E50
E50
E100
E100
PRIM
04 01 02 03 //
Listas Encadeadas

• Exemplo de um Trecho de Código que Cria uma


Lista
int main (void)
{
Lista* prim; /* declara uma lista não inicializada */
prim = Inicializa();/* inicializa lista como vazia */
prim = insere(prim, 23); /* insere na lista o elemento 23 */
prim = insere(prim, 45); /* insere na lista o elemento 45 */
...
return 0;
}

Você também pode gostar