Laboratório de
Programação II
- Turma 490
Horários: 2AB
e 4CD
Lista encadeadas com Classes
Exercício I
I.a) Crie uma classe Cponto capaz de armazenar um ponto.
I.b) Crie uma classe CListaPontos capaz de armazenar objetos da classe ponto em uma lista simplesmente encadeada. Esta classe deverá ter , pelo menos os seguintes métodos:
void Insere(CPonto *P, int Pos)
Insere um elemento na lista, na posição pos. Caso a
posição informada seja além do final da lista, o elemento deve ser
inserido no final da lista.
int Localiza(Cponto *P)
Informa a Posição de um elemento na Lista. Se não achar deve retornar -1
int Qtd()
Informa a quantidade de pontos na lista
int Remove(int Pos)
Retira um elemento na lista, na posição Pos. Retorna 1 se
conseguir remover e 0, caso contrário.
I.c) Crie uma classe CListaDuplaPontos capaz de armazenar objetos da classe ponto em uma lista duplamente encadeada.
Exercício II
Dada a classe Pessoa, conforme a definição a seguir:
include <iostream>
using namespace std;
class Pessoa{
string nome, endereco;
Pessoa *prox;
public:
Pessoa(string n, string e)
{
nome = n;
endereco = e;
}
void setProx(Pessoa *p)
{
prox = p;
}
Pessoa *getProx()
{
return prox;
}
void imprime()
{
cout << "Pessoa: " << nome;
cout << " - " << endereco << endl;
}
string getNome()
{
return nome;
}
string getEnd()
{
return endereco;
}
};
Implemente uma classe que defina uma lista encadeada com os métodos descritos abaixo.
class ListaEncadeada{
Pessoa *inicio;
Pessoa *fim;
public:
int estaVazia()
{
// Informa se a lista está vazia(devolve 1) ou não(devolve 0)
}
void inserePessoaNoInicio(string fulano, string endereco)
{
// Crie um método que coloque um elemento no início da lista.
}
void inserePessoaNoFinal(string fulano, string endereco)
{
// Crie um método que coloque um elemento no final da lista.
}
void imprimeLista()
{
Pessoa *aux;
aux = inicio;
if (estaVazia() == 1)
{
cout << "Lista Vazia !" << endl;
return; // encerra o método aqui
}
cout << "----- INICIO DA LISTA -----" << endl;
while (aux != NULL)
{
aux->imprime();
aux = aux->getProx();
}
}
Pessoa *achaUltimo()
{
// retorna um apontador para o último elemento da lista
// Caso a lista esteja vazia, o método deve devolver NULL
}
Pessoa *buscaPessoa(string fulano, string endereco)
{
// Crie um método que devolva um ponteiro para um certo
elemento da lista.
// Como parâmetro este método deve receber o nome de
// uma pessoa a ser buscada na lista.
// Caso o nome não exista na lista, o método deve devolver NULL
}
Pessoa *buscaAnterior(string fulano, string endereco)
{
// Crie um método que devolva um ponteiro para o nodo da lista que
// encontra-se ANTES do nodo que contém um certo
elemento da lista.
// Como parâmetro este método deve receber o nome de
// uma pessoa a ser buscada na lista.
// Caso o nome não exista na lista, o método deve devolver NULL.
// Caso o nome seja o primeiro da lista o método deve devolver NULL. O
// ideal é não chamar este quando "fulano" for o 1o. elemento da lista, ou seja,
// deve-se testar isto antes de chamar este métodos
}
Pessoa *retira(string Fulano, string endereco)
{
// Crie um método que retire um elemento da lista.
// Como parâmetro este método deve receber o nome de
// uma pessoa a ser buscada na lista.
// Caso o nome não exista na lista, o método deve devolver NULL.
// Lembre-se de fazer um teste específico para remover o 1o. elemento da
// lista
// O método NÃO deve "deletar" o nodo da memória.
// Dica: use o método "BuscaAnterior".
}
Pessoa *retinaDoInicio()
{
// Crie um método que remova um primeiro elemento da lista.
// O método deve retornar um apontador para o elemento retirado da lista.
// O método NÃO deve "deletar" o nodo da memória.
// Caso a lista esteja vazia, o método deve devolver NULL.
}
Pessoa *retinaDoFinal()
{
// Crie um método que remova um último elemento da lista.
// O método deve retornar um apontador para o elemento retirado da lista
// O método NÃO deve "deletar" o nodo da memória.
// Caso a lista esteja vazia, o método deve devolver NULL.
}
int remove(string Fulano, string endereco)
{
// Crie um método que remova um elemento da lista.
// O método deve "deletar" o nodo da memória.
// Dica: use o método "Retira".
}
void inserePessoaEmOrdem(string fulano, string endereco)
{
// Crie um método que coloque um elemento na lista, de forma que os elementos
// fiquem sempre em ordem crescente do nome da pessoa.
// Dica: Modifique o método de busca de forma que ele devolva um apontador
// para o primeiro nodo da lista no qual o atributo 'nome' seja "maior" que no
// nome a ser inserido na lista
}
};
// Programa de Teste
int main()
{
ListaEncadeada L1;
Pessoa *p;
L1.imprimeLista();
p = L1.retiraDoInicio();
if (p != NULL)
{
cout << "Retirado do Inicio:";
p->imprime();
delete p;
} else cout << "Lista vazia - Nao retirado do inicio" << endl;
L1.inserePessoaNoFinal("Abel", "Ramiro");
L1.inserePessoaNoFinal("Maria", "Ipiranga");
L1.inserePessoaNoFinal("Cintia", "Getulio");
L1.inserePessoaNoFinal("Luiz", "Andradas");
L1.inserePessoaNoFinal("Carla", "Bento");
L1.imprimeLista();
cout << "==============" << endl ;
p = L1.buscaPessoa("Carla", "Bento");
cout << "==============" << endl ;
p = L1.retiraDoInicio();
if (p != NULL)
{
cout << "Retirado do Inicio:";
p->imprime();
delete p;
} else cout << "Lista vazia" << endl;
cout << "==============" << endl ;
p = L1.buscaAnterior("Abel", "Ramiro");
if (p == NULL)
cout << "Nao tem antes ou nao existe" << endl;
else p->imprime();
cout << "==============" << endl ;
p = L1.retira("Cintia", "Getulio");
cout << "Retirado: ";
if (p == NULL)
cout << "Dado nao exite na lista" << endl;
else p->imprime();
L1.imprimeLista();
cout << "==============" << endl ;
if (L1.remove("Abel", "Ramiro") == 1)
cout << "Dado removido !" << endl;
else cout << "Dado nao existe na lista" << endl;
p = L1.retiraDoFinal();
if (p != NULL)
{
cout << "Retirado do Final:";
p->imprime();
delete p;
} else cout << "Lista vazia" << endl;
L1.imprimeLista();
cout << "==============" << endl ;
L1.inserePessoaNoInicio("Zulmira", "Vasco");
L1.imprimeLista();
}
Ponteiros com Structs
Dada uma struct capaz de armazenar os dados de uma pessoa:
typedef struct temp
{
string nome;
int idade;
temp *prox;
}TPESSOA;
Dada uma variável global que aponta o inicio de uma lista de pessoas:
TPESSOA *inicio;
Crie as seguintes funções:
void InsereNoInicio(int idade, string nome);
void ImprimeLista();
int BuscaNome(string nome, int &idade); // retorna 1 se achar e 0 se não achar
void InsereNoFinal(int idade, string nome);
int Remove(string nome); // retorna 1 se achar e 0 se não achar
FIM.