Você está na página 1de 30

Estrutura de Dados

Aula 08 - Listas Encadeadas I


Operaes sobre listas encadeadas
2
Inicializar uma lista;
percorrer uma lista;
inserir um elemento em uma lista;
acessar um elemento qualquer;
Procurar ou buscar um determinado elemento;
remover um elemento de uma posio especfica ou
qualquer da lista;
combinar ou concatenar duas ou mais listas em uma
nica;
particionar uma lista;
determinar a quantidade de elementos;
ordenar os elementos;
apagar uma lista.
OBS: as formas de realizar as operaes aqui apresentadas so clssicas. Existem
variaes.
Consideraes sobre listas encadeadas
3
Em uma lista encadeada no se pode ter acesso direto
aos seus elementos, logo o acesso tem que ser
sequncial partindo-se do primeiro elemento;

Cada elemento da lista s consegue ver o prximo


elemento, por meio do campo ponteiro que guarda o
endereo do prximo elemento;

Uma lista simplesmente encadeada aquela onde cada


elemento (n) da lista conhece/aponta para o prximo.

H outros tipos de listas que sero vistos mais adiante.


Alocao Dinmica
4
A alocao dinmica feita por meio da seguinte
instruo:

<ponteiro>=(<tipo_dado>*) malloc(sizeof(<tipo_dado>));

onde:
- sizeof() uma funo que devolve o temanho, em bytes,
do tipo ou da expresso;
- malloc() uma funo que tem o objetivo de retornar um
ponteiro para uma rea livre de memria a ser identificada
por ela;
- <tipo_dado> o tipo do dado referente ao ponteiro.
Antes das operaes...
5
As operaes aqui demonstradas referem-se a lista lineares
por encadeamento de ns (ligao entre os ns),
simplesmente encadeadas.
Cada n representado basicamente por dois campos:
informao e ponteiro;
Estes campos so oriundos da definio de uma struct;

Campo valor: guarda o valor do Campo prox (ponteiro): guarda


elemento, que pode ser um tipo um endereo para o prximo
primitivo ou abstrato. elemento.
Definindo a struct para uma lista ligada
6

typedef struct No {
int valor; //campo de informao
struct No *prox;
} TNo;
Lista encadeada com cabea
7
Formas de implementao em uma lista encadeada:
Com cabea: um n que foi declarado
explicitamente no incio do programa, mas cujo contedo
irrelevante. Ou seja, ela serve apenas para marcar o
incio da lista, no contm nenhum valor pertencente a
lista. A primeira clula a cabea da lista.

TNo * inicio;
inicio = (TNo*)malloc(sizeof(TNo));
inicio->prox = NULL; //no h prximo n
Lista encadeada sem cabea
8
Sem cabea: no possui a clula cabea, mas apenas
um apontador para o n seguinte. Nesse caso, a lista est
vazia se o endereo de sua primeira clula (que no existe)
NULL.
Neste caso o ponteiro no tem a mesma estrutura dos ns
que participam da lista.
Ex:
TNo * inicio;
inicio = NULL;
Operao: Criar lista ligada
9
Objetivo: criar uma lista vazia, sem elementos;
Como a lista representada pelo ponteiro para o 1
elemento, uma lista vazia representada pelo ponteiro
apontando para NULL, para sinalizar que no existem
elementos na lista;
Detalhamento:
- Criar um ponteiro, p.ex., inicio e faz-lo
apontar para NULL (identifica o incio da
lista).

main() { main() {
TNo *inicio; TNo *inicio;
inicio=(TNo*)malloc(sizeof(TNo));
inicio = NULL; //sem cabea inicio->prox = NULL; //com cabea

} //melhor criar uma funo } //melhor criar uma funo para isto
Operao: Percorrer uma lista
10
Detalhamento:
- necessrio ter 2 ponteiros: um para o incio da
lista e outro que percorrer a lista (um ponteiro auxiliar);
- o ponteiro aux iniciar apontando para o 1
elemento, depois para o 2 e assim por diante at que
cheguar ao ltimo n que aponta para NULL.
- aux percorre uma lista atualizando seu contedo
com o endereo contido no campo prox do elemento
acessado no momento.
- critrio de parada: quando o campo prox do
ponteiro auxiliar apontar para NULL.
Operao: Percorrer uma lista
11
Operao: Percorrer uma lista
12

if (inicio == NULL) { if (inicio->prox == NULL) {


printf("\t\tLISTA VAZIA\n"); printf("\t\tLISTA VAZI A\n");
} else { } else {
aux = inicio; aux = inicio->prox;
while (aux != NULL) { while (aux != NULL) {
aux = aux -> prox; aux = aux -> prox;
} }
} }
Operao: Acessar um elemento
13
Detalhamento:
- significa ler o contedo dos campos do
elemento, inclusive o campo ponteiro que guarda o
endereo do prximo elemento;
- os campos dependem da struct definida;
- necessrio ter um ponteiro aux apontando para o
elemento desejado para que o mesmo possa ser
acessado.
- necessrio ter dois ponteiros: um para o inicio da
lista e outro que percorrer a lista (um ponteiro auxiliar)
at chegar ao elemento desejado.
- a lista percorrida em um nico sentido (para
frente).
Operao: Acessar um elemento
14
Operao: Acessar um elemento
15

if (inicio == NULL) {
printf("\t\t\t L I S T A V A Z I A\n");
} else {
aux = inicio;
while (aux != NULL) {
printf("\t\t\t V A L O R: %d\n", aux -> valor);
aux = aux -> prox;
}
}
Operao: Procurar um elemento em uma lista
16
Detalhamento:
- utilizar o que j foi visto anteriormente para percorrer uma
lista e acessar um elemento;
- o campo valor do ponteiro aux ser utilizado para verificar
se o contedo do elemento acessado o elemento
procurado.
- critrio de parada: quando aux ou o campo prox de aux
apontar para NULL.
Operao: Procurar um elemento em uma lista
17

printf(Digite o valor que deseja procurar);


scanf(%d,&procurado);
if (inicio != NULL) {
aux = inicio;
while (aux != NULL) {
if (aux->valor == procurado){
printf("\t\t\t Valor foi encontrado\n");
break;
}
aux = aux -> prox;
}
}
Operao: Insero de um elemento 18
Para cada elemento (n) inserido na lista, devemos
alocar dinamicamente a memria necessria para
armazenar este elemento e encade-lo na lista existente.
Insero uma operao de encadeamento de
elementos.
Existem 4 situaes que devem ser consideradas nesta
operao:
1 Caso insero em uma lista vazia;
2 Caso insero no final de uma lista (no vazia);
3 Caso insero no incio de uma lista no vazia;
4 Caso - insero no meio de uma lista no vazia.
1 Caso insero em uma lista vazia (encadear)
19
Detalhamento:
- dois ponteiros: um para o inicio da lista e outro que indica o
elemento a ser inserido;
- Objetivo: fazer o campo prox do novo n apontar para NULL e
o ponteiro de inicio da lista apontar para o novo n.

TNo *novo, *inicio; //declaracao dos ponteiros


printf("\t\t\t Informe o novo valor a ser inserido: ");
scanf("%d", &cont);
novo = (Tno*)malloc(sizeof(TNo));
novo -> valor = cont;
novo -> prox = NULL;
if (inicio = =NULL) //lista est vazia
inicio = novo;
2 Caso insero no final de uma lista no vazia
20
Detalhamento:
- dois ponteiros: um para o inicio da lista e outro
(ponteiro auxiliar) que percorrer a lista e identificar o
ltimo elemento;
- fazer o ponteiro aux deve percorrer a lista, a partir
do 1 elemento, at chegar ao ltimo, para isto verifica-se
em cada n se o campo prximo do aux NULL;
- para encadear o n, o campo prox do ltimo n
dever apontar para o novo n, ou seja, deve receber o
endereo do ponteiro novo.
2 Caso insero no final de uma lista no vazia
21
2 Caso insero no final de uma lista no vazia
22
//criando o novo no
TNo *novo, *inicio, *aux;
printf("\t\t\t Informe o novo valor a ser inserido: ");
scanf("%d", &cont);
novo = (Tno*)malloc(sizeof(TNo));
novo -> valor = cont;
novo -> prox = NULL;

//percorrendo uma lista


if (inicio != NULL) { //lista no vazia
aux = inicio;
while (aux-> prox != NULL) {
aux = aux -> prox;
}
aux -> prox = novo; //encadeando o novo n
}
3 Caso insero no incio de uma lista no vazia.
23
Detalhamento
- encadear o novo elemento lista, fazendo com que o campo
prox de novo receba o endereo contido no ponteiro inicio;
- fazer o ponteiro inicio apontar para o novo n. Para isto, basta
que o ponteiro inicio receba o endereo contido no ponteiro
novo.
3 Caso insero no incio de uma lista no vazia.
24
//criando e inicializando o novo n
TNo *novo, *inicio, *aux;
printf("\t\t\t Informe o novo valor a ser inserido: ");
scanf("%d", &cont);
novo = (Tno*)malloc(sizeof(TNo));
novo -> valor = cont;
novo -> prox = NULL;

if (inicio != NULL) { //verifica se a lista no vazia


novo->prox = inicio; //encadeando o novo n
inicio = novo;
}
4 Caso Insero no meio de uma lista no vazia.
25
Ocorre geralmente quando se quer: inserir em uma determinada
posio ou manter uma lista ordenada.
Detalhamento (inserir em uma determinada posio):
- localizar o n da lista que ir preceder o elemento novo a
ser inserido. Para isso, calcula-se a quantidade de ns e depois a
metade da lista.
- dois ponteiros: um para o inicio da lista e outro (um
ponteiro aux) que percorrer a lista e identificar a posio para
fazer a insero. Alm do ponteiro do novo n;
- fazer o ponteiro aux percorrer a lista at chegar posio-1
para fazer a insero. Quando aux est na posio-1, o ponteiro
aux ter no campo prox o endereo para a posio desejada.
- encadear o novo elemento lista, fazendo o campo prox de
novo receber o endereo do campo prox de aux;
- encadear o n anterior, acessado por aux, ao novo n,
fazendo o campo prox de aux receber o endereo do ponteiro
novo (aux deve apontar para novo).
4 Caso insero no meio de uma lista no vazia.
26

aux
2 1
4 Caso insero no meio de uma lista no
vazia. 27
Detalhamento (inserir em uma posio e manter a lista
ordenada):
- deve-se localizar o elemento da lista que ir preceder o
elemento novo a ser inserido.
- trs ponteiros: um para o inicio da lista, o segundo para
marcar o elemento anterior (ant) e um ponteiro auxiliar (aux)
que percorrer a lista e validar o elemento que ser
comparado ao elemento novo que ser quer inserir. Alm, do
prprio ponteiro do novo n;
- fazer o ponteiro aux percorrer a lista at chegar ao n
maior que o novo elemento a ser inserido. O ponteiro ant
iniciar NULL e ser atualizado com o endereo de aux antes
de aux avanar para o prximo n.
- ao chegar ao n maior que o novo, encadear o novo n
lista, fazendo o campo prox de novo receber o endereo do
campo prox de aux;
4 Caso insero no meio de uma lista no
vazia. 28
Detalhamento (inserir em uma posio e manter a lista
ordenada):
- encadear o elemento ant ao novo elemento, fazendo o
campo prox de ant receber o endereo do ponteiro novo.
- Critrio de insero: quando o n avaliado maior que o
novo n que se deseja inserir (lista ordenada crescentemente).

28
Operao: Insero de um elemento
29
Exerccios
30
1 Implementar as operaes vista at o momento
utilizando funes;
Implementar as operaes de insero no meio da lista,
nos dois casos especficos.

Você também pode gostar