Buscar

08.LabII.ListaEncadeada

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 3, do total de 21 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 6, do total de 21 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 9, do total de 21 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Prévia do material em texto

Laboratório de Programação II
Departamento de Ciência da Computação
UFJF
Aula de hoje
 TAD Lista Simplesmente Encadeada
 Operações comuns:
 consultar o nó xk;
 atribuir um novo valor ao nó xk;
 inserir um novo nó antes ou depois do nó xk ou em
um dos extremos da lista;
 eliminar o nó xk;
 Obs.: lista é uma estrutura de dados dinâmica,
isto é, o seu comprimento (= número de seus
nós) pode ser alterado em tempo de execução.
Listas
3
 Outras operações:
 concatenar duas listas;
 determinar o comprimento (n) de uma lista;
 localizar o nó que contém um determinado dado;
 partir uma lista em duas ou mais;
 fazer uma cópia de uma lista;
 ordenar os nós de uma lista,
 etc.
Listas
4
Representações de Listas
 Existem várias maneiras de representar uma
lista, devendo ser escolhida a mais adequada
para a aplicação em questão (melhor
desempenho, melhor compatibilidade com o
tipo de memória usada etc.).
 As representações mais comuns são por:
 contiguidade dos nós
 encadeamento dos nós.
Listas
5
Listas Encadeadas
Listas
6
 Serão apresentados os seguintes casos de listas
encadeadas:
 Lista Simplesmente Encadeada
 Lista com Descritor
 Lista Duplamente Encadeada
 Lista Circular
Lista Simplesmente Encadeada
Listas
7
 
Xn-1X2X1 Xn
 Nesta estrutura de dados, um nó deve conter
além de seu valor, uma indicação (ponteiro ou
apontador) para o nó seguinte, representando
uma contiguidade lógica. Esquematicamente:
 Assim, um nó passa a ter a seguinte representação:
informação próximo
X
Listas
8
class No
{
private:
float info; // informação real do No
No* prox; // ponteiro para o próximo No
public:
No() {};
float consultaInfo() { return info; };
No* consultaProx() { return prox; };
void atribInfo(float val) { info = val; };
void atribProx(No *p) { prox = p; };
~No() {};
};
Lista Simplesmente Encadeada
 TAD No (Definição No.h):
Listas
9
class ListaSEncad {
private:
No* pri; // ponteiro para o primeiro No da lista
No* it; // ponteiro auxiliar para percorrer a lista
public:
ListaSEncad();
float Consulta();
void Atribui(float val);
bool Busca(float val);
// operações para percorrer a lista
void Inicio(); // coloca o ponteiro it no início
void ProximoNo(); // avança o ponteiro it
bool FimDaLista(); // verifica se it está no final
void InserePri(float val); // insere no início da lista
void EliminaPri(); // elimina primeiro No
~ListaSEncad();
};
Lista Simplesmente Encadeada
 TAD ListaSEncad:
Listas
10
Lista Simplesmente Encadeada
 MI do TAD ListaSEncad:
 Construtor:
ListaSEncad::ListaSEncad()
{
pri = NULL;
it = NULL;
}
pri
Cria lista vazia
Listas
11
Lista Simplesmente Encadeada
 MI do TAD ListaSEncad:
 Operação Consulta:
float ListaSEncad::Consulta()
{
if(it != NULL)
return it->consultaInfo();
else
{
cout << "Erro: nó inválido!“ << endl;
exit(1);
}
}
Listas
12
Lista Simplesmente Encadeada
 MI do TAD ListaSEncad:
 Operação Atribui:
void ListaSEncad::Atribui(float val)
{
if(it != NULL)
it->atribInfo(val);
else
cout << "Erro: nó inválido!“ << endl;
} pri it
x
Antes
pri it
val
Depois
Listas
13
Lista Simplesmente Encadeada
 MI do TAD ListaSEncad:
 Operação Busca:
bool ListaSEncad::Busca(float val)
{
No* p;
for(p = pri; p != NULL; p = p->consultaProx())
{
if(p->consultaInfo() == val)
return true;
}
return false;
}
pri p
val
Listas
14
Lista Simplesmente Encadeada
 MI do TAD ListaSEncad:
 Operações para percorrer a lista:
void ListaSEncad::Inicio()
{
it = pri;
}
void ListaSEncad::ProximoNo()
{
it = it->consultaProx();
}
bool ListaSEncad::FimDaLista()
{
return (it == NULL);
}
Listas
15
Lista Simplesmente Encadeada
 MI do TAD ListaSEncad:
Destrutor:
ListaSEncad::~ListaSEncad()
{
No* p = pri;
while(p != NULL)
{
No* t = p->consultaProx();
delete p;
p = t;
}
}
Listas
16
Lista Simplesmente Encadeada
 MI do TAD ListaSEncad:
 Operação InserePri:
void ListaSEncad::InserePri(float val)
{ // insere No contendo val no início da lista
No* p = new No(); // cria nó apontado por p
p->atribInfo(val); // preenche info com val
p->atribProx(pri); // prox recebe atual pri
pri = p; // nó apontado por p passa a ser o 1º
}
Listas
17
Lista Simplesmente Encadeada
 MI do TAD ListaSEncad:
 Operação EliminaPri:
void ListaSEncad::EliminaPri()
{ // elimina primeiro No
No* p;
if(pri != NULL){ // se lista não está vazia
p = pri; //p aponta para o nó a ser excluído
// pri passa a apontar para o atual segundo
pri = p->consultaProx();
delete p;} // exclui o 1º nó
}
Listas
18
Lista Simplesmente Encadeada
 Exercícios
1.Desenvolver uma nova operação do MI do TAD
ListaSEncad para remover o nó na lista apontado
pela variável privada it. Após a remoção it aponta
para o nó seguinte, senão será NULL.
Listas
19
Lista Simplesmente Encadeada
 Exercícios
void ListaSEncad::EliminaIt() {
No *p;
if(it != NULL) {
if(it == pri) {
pri = pri->consultaProx();
delete it;
it = pri;
} else {
p = pri;
while(p->consultaProx() != it)
p=p->consultaProx();
p->atribProx(it->consultaProx());
delete it;
it = p->consultaProx();
}
}
}
Listas
20
Lista Simplesmente Encadeada
 Exercícios
2.Desenvolver funções/procedimentos no PA para o TAD
ListaSEncad de float que:
a. imprima os valores de uma lista a partir do primeiro
nó;
b.conte e retorne o número de nós de uma lista;
c. calcule e retorne a média dos valores armazenados
numa lista;
d.concatena duas listas em uma única (retornar a lista
resultante);
e. Partir uma lista em duas a partir de um nó cujo valor
X é dado.
Listas
21
Lista Simplesmente Encadeada
 Exercícios
3. Criar um TAD Lista Encadeada de forma que todos os
nós da lista fiquem sempre em ordem crescente. Dica:
desenvolver uma única operação de inserção na lista
de tal forma que o valor do novo nó mantenha a lista
em ordem crescente. Obs: deve-se remover a
operação Atribui(float val), já que esta
operação pode deixar a lista desordenada.

Outros materiais