Laboratório de Programação II - Turma 490
Horários: 2AB e 4CD

Prof. Márcio Sarroglia Pinho


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.