Professional Documents
Culture Documents
* Lista.hpp
*/
#ifndef LISTA_H_
#define LISTA_H_
#include <exception>
using namespace std;
// -----------------ListaCheia
class ExcecaoListaCheia : public exception {
public:
virtual const char* what()const throw(){
return("Excecao Lista Cheia!");
}
};
// ----------------ListaVazia
class ExcecaoListaVazia : public exception {
public:
virtual const char* what()const throw(){
return("Excecao Lista Vazia!");
}
};
// ----------------ErroPosicao
class ExcecaoErroPosicao : public exception {
public:
template<typename T>
class Lista {
private:
T* dados;
int lastIn;
int maxTam;
public:
// Construtor da Lista
Lista() {
dados = new T[1000];
lastIn = -1;
maxTam = 1000;
}
// Construtor da Lista onde o cliente decide o tamanho
explicit Lista(int tam) {
dados = new T[tam];
lastIn = -1;
maxTam = tam;
}
// Adiciona um dado na Lista. Retorna uma exceo caso a lista estiver cheia
if (listaCheia()) {
throw ExcecaoListaCheia();
} else {
if (posicao > lastIn + 1 || lastIn < 0) {
throw ExcecaoErroPosicao();
} else {
lastIn = lastIn +1;
for(int i = lastIn; i > posicao; i--) {
dados[i] = dados[i-1];
}
dados[posicao] = dado;
}
}
}
// Adiciona um dado na lista do menor para o maior. O metodo verifica
// cada posicao at encontrar um dado maior do que o que se deseja inserir.
// Quando encontra retorna o metodo adicionaNaPosicao.
// Retorna uma exceo caso a lista estiver cheia
void adicionaEmOrdem(T dado) {
if (listaCheia()) {
throw ExcecaoListaCheia();
} else {
int posicao = 0;
while (posicao <= lastIn && maior(dado , dados[posicao])) {
posicao = posicao + 1;
}
adicionaNaPosicao(dado , posicao);
}
}
// Retira o dado em que esta na ultima posicao da lista.
// Retorna uma exceo caso a lista estiver vazia
T retira() {
if (listaVazia()) {
throw ExcecaoListaVazia();
} else {
T aux = dados[lastIn];
lastIn = lastIn - 1;
return aux;
}
}
// Retira o dado que esta no inicio da lista. Joga todos os outros dados
// uma posicao para baixo. Retorna uma exceo caso a lista estiver vazia
T retiraDoInicio() {
if (listaVazia()) {
throw ExcecaoListaVazia();
} else {
T aux = dados[0];
lastIn = lastIn - 1;
for(int i = 0; i <= lastIn; i++) {
dados[i] = dados[i+1];
}
return aux;
}
}
}
// Verifica se a lista esta vazia. Retorna um boolean TRUE caso a lista
// estiver vazia ou FALSE caso nao estiver
bool listaVazia() {
return (lastIn == -1);
}
// Destroi a lista
void destroiLista() {
lastIn = -1;
}
};
#endif