Disciplina:
Estrutura de Dados
Tema da aula:
Listas Encadeadas
Listas Encadeadas
Structs e
Ponteiros
PLT: 706
Structs e
Ponteiros
Vamos declarar uma estrutura com
o nome
data
com três campos
inteiros:
inteiros:
typedef struct
data
{
int dia;
int mes;
int ano;
};
• Um Ponteiro é uma variável que contém o endereço de memória de outra variável.
• Podemos ter um ponteiro para qualquer tipo de variável.
int bb = 10; int cc = 0;
int *zz; declara um ponteiro do tipo inteiro de nome zz zz = &bb inicializa o ponteiro zz
cc = *zz coloca o valor que esta no endereço zz em cc
Ponteiros
cc = *zz coloca o valor que esta no endereço zz em cc
10
0
229346
int
cc
ponteiro
zz
int bb10
Structs e
Ponteiros
int main(){
struct data *pDataHoje; //Declaro o ponteiro do tipo estrutura data struct data dataOntem; //Declaro a variável do tipo data
dataOntem.dia = 8; dataOntem.mes = 9; dataOntem.ano = 2014;
printf("Data ontem: %d/%d/%d\n",
dataOntem.dia, dataOntem.mes, dataOntem.ano);
//Inicializo ponteiro pDataHoje em um endereço memória pDataHoje =(data*) malloc (sizeof(data));
pDataHoje =(data*) malloc (sizeof(data)); pDataHoje->dia=9;
pDataHoje->mes=9; pDataHoje->ano=2014;
printf("Data hoje: %d/%d/%d\n",
pDataHoje->dia, pDataHoje->mes, pDataHoje->ano); free(pDataHoje);
system("PAUSE"); return(0);}
Listas
Encadeadas
PLT: 194
Páginas 223 a 244
Ziviani
Páginas: 73 a 78
o
A lista terá seu tamanho fixo
.
Se utilizarmos o vetor
para criarmos uma Lista
teremos algumas
desvantagens...
o
A lista terá seu tamanho fixo
.
o
Mesmo vazia a lista ocupará um espaço
de memória.
o
Dependendo da implementação da lista,
determinadas operações podem ter
Se temos algumas desvantagens com a utilização do vetor na implementação, o que podemos utilizar???.... Listas Encadeadas!!!
É uma estrutura de dados que é um struct que contém
um elemento e o endereço do próximo nó, ou seja é um
• Lista encadeada é um tipo abstrato de dados projetada para armazenar uma seqüência de dados chamado elemento de lista ou “nó”.
• Seu funcionamento é fundamentado no uso de uma estrutura chamada “nó”, que guarda a localização do próximo “nó”, permitindo o acesso de toda a seqüência de dados.
Listas Encadeadas Simples
seqüência de dados. 45 Endereço do próximo nó 67 Endereço do próximo nó 34 null
Nó
• Cada novo nó inserido na estrutura é
alocado um espaço de memória para
armazená-lo
.
Desta forma, o
espaço total de memória
gasto pela estrutura é proporcional ao
Listas Encadeadas Simples
gasto pela estrutura é proporcional ao
número de elementos armazenado.
As estruturas de dados são dinâmicas,
ou seja, elas crescem
à medida que elementos
são inseridos
• Não podemos garantir que os nós armazenados na lista
ocuparão um espaço de memória adjacente, ou seja, um ao lado do outro, assim, para que seja possível percorrer todos os elementos da lista, devemos 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 Simples
próximo elemento da lista.
NO 01 NO 02 NO 04 NO 03 44 53 87 Memória RAM com o uso de vetor
Memória RAM
Pára....!!!!
Por favor,
faz uma revisão ai!
Lista encadeada é uma seqüência encadeada
de elementos, chamados de nós da lista.
de elementos, chamados de nós da lista.
Um nó é representado por dois campos:
• Informação armazenada
• Ponteiro para o próximo elemento da lista
O ponteiro do último elemento é NULL
45
Endereço do• A lista é uma estrutura auto-referenciada,
pois o
campo próximo é um ponteiro
para
uma
próxima estrutura do mesmo tipo
.
45
Endereço doImplementação da
Lista Encadeada Simples
typedef struct
no
{
int
dado;
no
*proximo;
};
45
Endereço do próximo nó//
inserção no início: retorna a lista atualizada
no* insere(no *noZ, int dado) {
Implementação da
Lista Encadeada Simples
typedef struct no{ int dado;
no *proximo; };
no* insere(no *noZ, int dado) {
no *noNovo;
noNovo = (no*) malloc(sizeof(no));
noNovo->dado = dado;
noNovo->proximo = noZ;
return noNovo; }
// função imprime: imprime valores dos elementos
void imprime (no *noZ) {
no *no;
Implementação da
Lista Encadeada Simples
no *no;
for (no = noZ; no != NULL; no = no->proximo) printf("Dado = %d\n", no->dado);
1 int main(){
2 no
*listaZ
; // declara um ponteiro listaZ do tipo no
3
listaZ
= NULL; // Inicializa o ponteiro com NULL
4 listaZ
=
insere
(
listaZ
, 33); /* insere na lista o 33*/
5 listaZ
=
insere
(
listaZ
, 22); /* insere na lista o 22*/
6
listaZ
=
insere
(
listaZ
, 78); /* insere na lista o 78 */
Implementação da Lista Encadeada Simples
6
listaZ
=
insere
(
listaZ
, 78); /* insere na lista o 78 */
7
imprime
(
listaZ
);
8 system("PAUSE");
9 return(0);
1 int main(){
2 no
*listaZ
; // declara um ponteiro listaZ do tipo no
3
listaZ
= NULL; // Inicializa o ponteiro com NULL
Implementação da
Lista Encadeada Simples
listaZ
Conseguimos inicializar NULLlistaZ
(Espera um endereço)
Conseguimos inicializarlistaZ com o NULL porque ele é um
ponteiro e espera um endereço.
4 listaZ
=
insere
(
listaZ
, 33); /* insere na lista o 33*/
Implementação da
Lista Encadeada Simples
listaZ =
no* insere(no *noZ, int dado) {typedef struct no{ int dado; no *proximo; };
listaZ =
noNovo
no* insere(no *noZ, int dado) {
no *noNovo;
noNovo = (no*) malloc(sizeof(no));
noNovo->dado = dado;
noNovo->proximo = noZ;
return noNovo; } NULL
listaZ
33 2.468.912(2.468.912)
(3.434.9548)
Endereço da listaZImplementação da Lista Encadeada Simples
no* insere(no *noZ, int dado) {
no *noNovo;
noNovo = (no*) malloc(sizeof(no));
noNovo->dado = dado;
noNovo->proximo = noZ;
return noNovo; }
5 listaZ
=
insere
(
listaZ
, 22); // insere na lista o 22
listaZ
} NULL 33 2.468.912(2.468.912)
(3.434.9548)
listaZ = noNovo 22 3.434.9548(1.114.511)
Endereço da listaZImplementação da Lista Encadeada Simples
no* insere(no *noZ, int dado) {
no *noNovo;
noNovo = (no*) malloc(sizeof(no));
noNovo->dado = dado;
noNovo->proximo = noZ;
return noNovo; }
6 listaZ
=
insere
(
listaZ
, 78); // insere na lista o 78
listaZ
} NULL 33 2.468.912(2.468.912)
(3.434.9548)
listaZ = noNovo 22 3.434.9548(1.114.511)
78 1.114.511listaZ
7
imprime
(
listaZ
);
void imprime (no
*noZ
) {
no *no
;
for (
no
=
noZ
;
no
!= NULL;
no = no->proximo
)
printf("Dado = %d\n",
no->
dado
);
}
Implementação da Lista Encadeada Simples
NULL 33 2.468.912 22 3.434.9548 78 1.114.511
}
noZ
#include <stdio.h> #include <stdlib.h> int main(){
no *listaZ;
listaZ = NULL;
listaZ = insere(listaZ, 33); listaZ = insere(listaZ, 22); listaZ = insere(listaZ, 78);
imprime(listaZ);
no* insere(no *noZ, int dado) {
no *noNovo;
noNovo = (no*) malloc(sizeof(no));
noNovo->dado = dado;
noNovo->proximo = noZ;
return noNovo; } imprime(listaZ); system("PAUSE"); return(0); } typedef struct no{ int dado; struct no *proximo; } no;
void imprime (no *noZ) { no *no;
for (no = noZ; no != NULL; no = no->proximo) printf("Dado = %d\n", no->dado);
void esvaziaLista(no *noZ) {
no *auxiliar;
while(noZ != NULL){
auxiliar = noZ ;
noZ = auxiliar->proximo;
printf("Retirou o no do dado: %d - ", auxiliar->dado);
free(auxiliar);
Implementação da Lista Encadeada Simples
esvaziaLista(
listaZ
);
free(auxiliar);
system("PAUSE");
}
printf("Lista vazia!\n");
}
• Para referenciar o primeiro elemento podemos
utilizamos um TAD cabeça da lista. Esta estrutura contém o número de elementos e o endereço do primeiro nó.
Listas Encadeadas com Cabeça
3 Próximo
Cabeça
da lista
Nó
45 Próximo 67 Próximo 34 null
da lista
Número de elementos
Faça as seguintes funções para a lista encadeada:
– 2.1 Pesquisar de um determinado elemento
• Nome:
Pesquisar
• Parâmetros: no e o dado
• Retorno: no
– 2.2 Excluir um elemento da lista
• Nome:
Excluir
• Parâmetros: no e o dadoExercício 2
• Parâmetros: no e o dado • Retorno: no Retirar o primeiro elemento Retirar o elemento do meioFaças os seguintes programas:
• 3.1
Pilha
com implementação em lista encadeada• Funções:
Insere e remove
Exercício 3
• Funções:
Insere e remove
• 3.2
Fila
com implementação em lista encadeadaReferências
• MIZRAHI, Victorine V..
Treinamento em
Linguagem C
. 2ª ed. São Paulo: Pearson, 2008.(PLT: 706)
• TANENBAUM, A.; Langsam, yedidyah; Augenstein, • TANENBAUM, A.; Langsam, yedidyah; Augenstein,
Moshe J..
Estrutura de Dados usando C.
1ª ed. São Paulo: Pearson, 2007.(PLT 194)
• ZIVIANE, Nívio (org.).