Escolar Documentos
Profissional Documentos
Cultura Documentos
(Lista Encadeada)
Prof. Gláucya Boechat
gcbcht@gmail.com
Lista Ligada
● Estrutura de dados linear ou dinâmica.
6 8 3 12 \
2
Lista Ligada
● Exemplo
– Dinâmica
6 8 3 12 \
– Linear
6 8 3 12
3
Lista
● Conjunto de operações
– Inicializar lista vazia
– Inserir um elemento após o i-ésimo elemento da lista
– Alterar o i-ésimo elemento da lista
– Ordenar a lista em ordem crescente ou decrescente
– Remover o i-ésimo elemento da lista
– Concatenar uma lista em outra lista.
4
Lista Encadeada
● lista.c
#include <stdio.h>
#include <stdlib.h>
typedef struct no {
int valor;
struct no* prox;
}No; No
valor prox
x
5
Lista Encadeada
Lista
6 8 3 \
6
Lista Encadeada
● lista.c
void imprime_lista(No* lista) {
while (lista != NULL) {
printf("%d\n", lista>valor);
lista = lista>prox;
}
}
7
Lista Encadeada
Lista
6 8 3 \
8
Lista Encadeada
Lista
9
Lista Encadeada
Lista
6 8
10
Lista Encadeada
Lista
6 8 3 \
11
Lista Encadeada
● Função
void insere_comeco(No** lista, int valor{
No* no;
no = (No*) malloc(sizeof(No));
no>valor = valor;
no>prox = *lista;
*lista = no;
imprime_lista(*lista);
}
// ...
12
Lista Encadeada
void main(){
No* lista;
lista = NULL;
insere_comeco(&lista, 3);
insere_comeco(&lista, 8);
insere_comeco(&lista, 6);
insere_comeco(&lista, 6);
imprime_lista(lista);
}
13
Inicializar a Lista
X=3
Lista
14
Inicializar a Lista
X=3
Lista
Lista 3 \
15
Inicializar a Lista
X=3
Lista
Lista 3 \
Lista
3 \
16
Inserir no início da lista
X = 10
Lista
6 8 3 \
17
Inserir no início da lista
X = 10
Lista
6 8 3 \
Lista
10 6 8 3 \
a
18
Inserir no início da lista
Lista
10 6 8 3 \
a
Lista
10 6 8 3 \
b
19
Inserir no início da lista
Lista
10 6 8 3 \
b
Lista
10 6 8 3 \
c
20
Inserir no final da lista
Lista X = 12
6 8 3 \
21
Inserir no final da lista
void insere_final(No** lista, int v) {
No *n, *aux;
n = (No*) malloc(sizeof(No));
n>valor = v;
n>prox = NULL; // Ultimo elemento da lista
if (*lista == NULL)
*lista = n;
else {
aux = *lista;
while (aux>prox != NULL)
aux = aux>prox;
aux>prox = n;
} 22
}
Inserir no final da lista
void main() {
...
insere_final(&lista, 12);
imprime_lista(lista);
23
Inserir no final da lista
Lista X = 12
6 8 3 \
24
Inserir no final da lista
Lista X = 12
6 8 3 \
Lista
6 8 3 \ 12 \
a
25
Inserir no final da lista
Lista aux
6 8 3 \ 12 \
a
Lista aux
6 8 3 12 \
b
26
Inserir no final da lista
Lista aux
6 8 3 12 \
b
Lista
6 8 3 12 \
c
27
Remover no início da lista
int remove_inicio(No** lista) {
No* n;
int v;
if (*lista == NULL)
return 1;
n = *lista;
*lista = n>prox;
v = n>valor;
free(n);
return v;
}
28
Remover no início da lista
void main() {
...
while (remove_inicio(&lista) != 1)
imprime_lista(l);
}
29
Remover no início da lista
Lista
6 8 3 \
a
30
Remover no início da lista
Lista
n
6 8 3 \
a
Lista
n
X=6
6 8 3 \
b
31
Remover no início da lista
Lista
n
X=6
6 8 3 \
b
Lista
X=6
8 3 \
c
32
Remover no final da lista
int remove_final(No** lista) {
No *n, *aux;
int v;
if (*lista == NULL)
return 1;
if ((*lista)>prox == NULL) {
n = *lista;
*lista = NULL;
}
//...
}
33
Remover no final da lista
int remove_final(No** lista) {
// ...
else {
aux = *lista; /* Para no penúltimo nó */
while (aux>prox>prox != NULL)
aux = aux>prox;
n = aux>prox;
aux>prox = NULL;
}
v = n>valor;
free(n);
return v;
}
34
Remover no final da lista
void main() {
...
while (remove_final(&lista) != 1)
imprime_lista(l);
}
35
Remover no final da lista
Lista
6 8 3 \
aux
a
36
Remover no final da lista
Lista
6 8 3 \
aux
a
Lista
X=3
6 8 3 \
aux
b
37
Remover no final da lista
Lista
X=3
6 8 3 \
aux
b
Lista
X=3
6 8 \
c
38
Remover no final da lista
Lista
6 8 3 \
aux
a
Lista
X=3
6 8 3 \
aux
b
39