Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
*
Listas Encadeadas
*
Listas Encadeadas
Vetores nem sempre são estruturas de armazenamento ideais.
Listas Encadeadas
Criamos espaço individualmente para cada elemento que queremos guardar;
Removemos espaço individualmente dos elementos que não queremos mais.
*
Listas Encadeadas
São estruturas de armazenamento de dados;
Correspondem a um conjunto de blocos de dados de mesmas características, que são abstratamente linearizados (ainda que não necessáriamente se apresentem assim na memória);
Este modo de estruturação de um conjunto de dados, aliado a algoritmos que levem em conta seu potencial, apresenta uma série de vantagens em relação a outros modos de armazenamento.
*
Listas Encadeadas
Uma lista encadeada é uma representação de uma sequência de elementos;
Cada elemento dessa sequência é armazenado em uma célula da lista;
Cada célula contém os dados, e o endereço da célula seguinte;
Vamos supor a partir daqui que o dado armazenado em cada célula é um número inteiro.
*
Ilustração
Ilustração de uma lista encadeada;
proximo
proximo
proximo
proximo
O acesso a uma lista encadeada é o endereço de sua primeira célula. Se p é o acesso a uma lista, podemos dizer simplesmente que “p é uma lista”;
*
Implementação de uma lista encadeada
Vamos primeiro criar uma célula;
A estrutura de cada célula de uma lista encadeada pode ser definida da seguinte forma:
struct cel {
int conteudo;
struct cel *proximo;
};
Por simplicidade podemos apelidar esta nova estrutura de celula:
typedef struct cel celula;
*
Acesso aos elementos de uma lista
Considere as seguintes declarações:
celula c;
celula *p;
‘c’ é uma célula e então:
c.conteudo: pode armazenar um número inteiro;
c.proximo: pode guardar o endereço de outra célula;
‘p’ é um ponteiro para uma célula e então:
p->conteudo: pode armazenar um número inteiro;
p->proximo: pode guardar o endereço de outra célula;
O campo próximo da última célula da lista deve valer NULL;
*
Inserção de um elemento em uma lista
p
Vamos considerar que as inserções na lista em questão serão feitas sempre no início;
Criando a primeira célula da lista ‘p’.
Exemplo:
int x;
celula *p = NULL;
*
Inserção de um elemento em uma lista
Vamos considerar que as inserções na lista em questão serão feitas sempre no início;
Criando a primeira célula da lista ‘p’.
Exemplo:
p
conteudo
proximo
16
int x;
celula *p = NULL;
...
p = (celula *) malloc(sizeof (celula));
p->conteudo = x;
p->proximo = NULL;
...
*
Inserção de um elemento em uma lista
Criando uma nova célula depois que a primeira já foi criada;
Exemplo:
p
conteudo
proximo
16
8
int x;
celula *nova;
...
nova = (celula *) malloc(sizeof (celula));
nova->conteudo = x;
*
Inserção de um elemento em uma lista
Criando uma nova célula depois que a primeira já foi criada;
Exemplo:
p
conteudo
proximo
16
8
int x;
celula *nova;
...
nova = (celula *) malloc(sizeof (celula));
nova->conteudo = x;
nova->proximo = p;
*
Inserção de um elemento em uma lista
Criando uma nova célula depois que a primeira já foi criada;
Exemplo:
p
conteudo
proximo
16
conteudo
proximo
8
int x;
celula *nova;
...
nova = (celula *) malloc(sizeof (celula));
nova->conteudo = x;
nova->proximo = p;
p = nova;
*
Inserção de um elemento em uma lista
Criando uma nova célula depois que a primeira já foi criada;
Exemplo:
p
conteudo
proximo
16
conteudo
proximo
8
*
Inserção de um elemento em uma lista
int x;
celula *nova, *p = NULL;
printf("Digite um elemento a ser inserido na lista:");
scanf("%d", &x);
if(p == NULL)
{
p = (celula *) malloc(sizeof (celula));
p->conteudo = x;
p->proximo = NULL;
}
else
{
nova = (celula *) malloc(sizeof (celula));
nova->conteudo = x;
nova->proximo = p;
p = nova;
}
*
Inserção de um elemento em uma lista
Criando a primeira célula da lista ‘p’;
Exemplo:
p
16
nova = (celula *) malloc(sizeof (celula));
nova->conteudo = x;
nova->proximo = p;
p = nova;
*
Inserção de um elemento em uma lista
Criando a primeira célula da lista ‘p’;
Exemplo:
nova = (celula *) malloc(sizeof (celula));
nova->conteudo = x;
nova->proximo = p;
p = nova;
p
16
*
Inserção de um elemento em uma lista
Criando a primeira célula da lista ‘p’;
Exemplo:
nova = (celula *) malloc(sizeof (celula));
nova->conteudo = x;
nova->proximo = p;
p = nova;
16
*
Impressão dos elementos de uma lista
Basta percorrer a lista imprimindo cada elemento;
Exemplo:
p
conteudo
proximo
16
conteudo
proximo
15
conteudo
proximo
12
conteudo
proximo
8
Saída:
16
aux = p;
while(aux != NULL)
{
printf("%d ",aux->conteudo);
*
Impressão dos elementos de uma lista
Basta percorrer a lista imprimindo cada elemento;
Exemplo:
p
conteudo
proximo
16
conteudo
proximo
15
conteudo
proximo
12
conteudo
proximo
8
aux = p;
while(aux != NULL)
{
printf("%d ",aux->conteudo);
aux = aux->proximo;
}
Saída:
16
8
*
Impressão dos elementos de uma lista
Basta percorrer a lista imprimindo cada elemento;
Exemplo:
p
conteudo
proximo
16
conteudo
proximo
15
conteudo
proximo
12
conteudo
proximo
8
aux = p;
while(aux != NULL)
{
printf("%d ",aux->conteudo);
aux = aux->proximo;
}
Saída:
16
8 15
*
Impressão dos elementos de uma lista
Basta percorrer a lista imprimindo cada elemento;
Exemplo:
p
conteudo
proximo
16
conteudo
proximo
15
conteudo
proximo
12
conteudo
proximo
8
aux = p;
while(aux != NULL)
{
printf("%d ",aux->conteudo);
aux = aux->proximo;
}
Saída:
16
8 15 12
*
Impressão dos elementos de uma lista
Basta percorrer a lista imprimindo cada elemento;
Exemplo:
p
conteudo
proximo
16
conteudo
proximo
15
conteudo
proximo
12
conteudo
proximo
8
aux
aux = p;
while(aux != NULL)
{
printf("%d ",aux->conteudo);
aux = aux->proximo;
}
Saída:
16
8 15 12
*
Impressão dos elementos de uma lista
Basta percorrer a lista imprimindo cada elemento;
celula *aux;
...
if (p == NULL)
printf("\nA lista esta vazia.\n");
else
{
printf("\nConteudo da lista:\n");
aux = p;
while(aux != NULL)
{
printf("%d ",aux->conteudo);
aux = aux->proximo;
}
}
*
Busca de um elemento em uma lista
Queremos verificar se um inteiro pertence a uma lista encadeada, ou seja, se é igual ao conteúdo de alguma célula da lista;
Exemplo: Busca pelo elemento 17;
p
conteudo
proximo
16
conteudo
proximo
15
conteudo
proximo
12
conteudo
proximo
8
*
Busca de um elemento em uma lista
Queremos verificar se um inteiro pertence a uma lista encadeada, ou seja, se é igual ao conteúdo de alguma célula da lista:
Exemplo: Busca pelo elemento 17.
p
conteudo
proximo
16
conteudo
proximo
15
conteudo
proximo
12
conteudo
proximo
8
*
Busca de um elemento em uma lista
Queremos verificar se um inteiro pertence a uma lista encadeada, ou seja, se é igual ao conteúdo de alguma célula da lista:
Exemplo: Busca pelo elemento 17.
p
conteudo
proximo
16
conteudo
proximo
15
conteudo
proximo
12
conteudo
proximo
8
*
Busca de um elemento em uma lista
Queremos verificar se um inteiro pertence a uma lista encadeada, ou seja, se é igual ao conteúdo de alguma célula da lista:
Exemplo: Busca pelo elemento 17.
p
conteudo
proximo
16
conteudo
proximo
15
conteudo
proximo
12
conteudo
proximo
8
*
Busca de um elemento em uma lista
Queremos verificar se um inteiro pertence a uma lista encadeada, ou seja, se é igual ao conteúdo de alguma célula da lista:
Exemplo: Busca pelo elemento 17.
p
conteudo
proximo
16
conteudo
proximo
15
conteudo
proximo
12
conteudo
proximo
8
aux
Elemento não encontrado.
*
Busca de um elemento em uma lista
Queremos verificar
se um inteiro pertence a uma lista encadeada, ou seja, se é igual ao conteúdo de alguma célula da lista:
Exemplo: Busca pelo elemento 15.
p
conteudo
proximo
16
conteudo
proximo
15
conteudo
proximo
12
conteudo
proximo
8
*
Busca de um elemento em uma lista
Queremos verificar se um inteiro pertence a uma lista encadeada, ou seja, se é igual ao conteúdo de alguma célula da lista:
Exemplo: Busca pelo elemento 15.
p
conteudo
proximo
16
conteudo
proximo
15
conteudo
proximo
12
conteudo
proximo
8
*
Busca de um elemento em uma lista
Queremos verificar se um inteiro pertence a uma lista encadeada, ou seja, se é igual ao conteúdo de alguma célula da lista:
Exemplo: Busca pelo elemento 15.
p
conteudo
proximo
16
conteudo
proximo
15
conteudo
proximo
12
conteudo
proximo
8
Elemento encontrado.
*
Busca de um elemento em uma lista
Queremos verificar se um inteiro x pertence a uma lista encadeada, ou seja, se é igual ao conteúdo de alguma célula da lista;
celula *aux;
...
aux = p;
while (aux != NULL && aux->conteudo != x) aux = aux->proximo;
if(aux == NULL)
printf("Elemento não encontrado!\n");
else
printf("Elemento encontrado!\n");
*
Remoção de um elemento em uma lista
Removendo o primeiro elemento.
p
conteudo
proximo
16
conteudo
proximo
15
conteudo
proximo
12
conteudo
proximo
8
celula *aux;
aux = p;
*
Remoção de um elemento em uma lista
Removendo o primeiro elemento.
conteudo
proximo
16
conteudo
proximo
15
conteudo
proximo
12
conteudo
proximo
8
celula *aux;
aux = p;
p = p->proximo;
*
Remoção de um elemento em uma lista
Removendo o primeiro elemento.
p
conteudo
proximo
15
conteudo
proximo
12
conteudo
proximo
8
celula *aux;
aux = p;
p = p->proximo;
free(aux);
...
*
Remoção de um elemento em uma lista
Removendo um elemento qualquer.
Exemplo: Remoção do elemento 15
p
conteudo
proximo
16
conteudo
proximo
15
conteudo
proximo
12
conteudo
proximo
8
*
Remoção de um elemento em uma lista
Removendo um elemento qualquer.
Exemplo: Remoção do elemento 15
p
conteudo
proximo
16
conteudo
proximo
15
conteudo
proximo
12
conteudo
proximo
8
...
aux1->proximo = aux2->proximo;
*
Remoção de um elemento em uma lista
Removendo um elemento qualquer.
Exemplo: Remoção do elemento 15
p
conteudo
proximo
16
conteudo
proximo
15
conteudo
proximo
12
conteudo
proximo
8
...
aux1->proximo = aux2->proximo;
free(aux2);
*
Remoção de um elemento em uma lista
Removendo um elemento qualquer.
Exemplo: Remoção do elemento 15
p
conteudo
proximo
16
conteudo
proximo
12
conteudo
proximo
8
...
aux1->proximo = aux2->proximo;
free(aux2);
*
Destruição da lista
Libera a memória alocada para os elementos da lista;
conteudo
proximo
16
conteudo
proximo
15
conteudo
proximo
12
conteudo
proximo
8
celula * aux;
while (p != NULL)
{
aux = p;
p = p->proximo;
free(aux);
}
*
Destruição da lista
Libera a memória alocada para os elementos da lista;
conteudo
proximo
16
conteudo
proximo
15
conteudo
proximo
12
conteudo
proximo
8
celula * aux;
while (p != NULL)
{
aux = p;
p = p->proximo;
free(aux);
}
*
Destruição da lista
Libera a memória alocada para os elementos da lista;
conteudo
proximo
15
conteudo
proximo
12
conteudo
proximo
8
celula * aux;
while (p != NULL)
{
aux = p;
p = p->proximo;
free(aux);
}
*
Destruição da lista
Libera a memória alocada para os elementos da lista;
conteudo
proximo
15
conteudo
proximo
12
conteudo
proximo
8
celula * aux;
while (p != NULL)
{
aux = p;
p = p->proximo;
free(aux);
}
*
Destruição da lista
Libera a memória alocada para os elementos da lista;
conteudo
proximo
15
conteudo
proximo
12
celula * aux;
while (p != NULL)
{
aux = p;
p = p->proximo;
free(aux);
}
*
Destruição da lista
Libera a memória alocada para os elementos da lista;
conteudo
proximo
15
conteudo
proximo
12
celula * aux;
while (p != NULL)
{
aux = p;
p = p->proximo;
free(aux);
}
*
Destruição da lista
Libera a memória alocada para os elementos da lista;
conteudo
proximo
12
celula * aux;
while (p != NULL)
{
aux = p;
p = p->proximo;
free(aux);
}
*
Destruição da lista
Libera a memória alocada para os elementos da lista;
conteudo
proximo
12
p
celula * aux;
while (p != NULL)
{
aux = p;
p = p->proximo;
free(aux);
}
*
Destruição da lista
Libera a memória alocada para os elementos da lista;
p
celula * aux;
while (p != NULL)
{
aux = p;
p = p->proximo;
free(aux);
}
*
Exercícios
Escreva uma função que receba como parâmetro uma lista encadeada e retorne a quantidade de células da lista.
Escreva uma função que receba como parâmetro uma lista encadeada e retorne a soma dos elementos da lista.
Escreva uma função que busca e remove um elemento de uma lista encadeada.
Escreva um programa que contenha uma função que insere um elemento no final (à direita) de uma lista encadeada.