1. Estruturas de dados em C++
Lista de inteiros
Por Robson Eduardo
Uma lista é uma estrutura de dados que armazena o seu conteúdo de forma sequencial. Isto é, dada
uma posição é possível que alí haja algum elemento.
No presente trabalho mostramos a implementação de uma lista de inteiros para exemplificar a
implementação desta importante estrutura de dados.
A interface da lista
Uma lista deve, assim como qualquer estrutura de dados, ser capaz de adicionar, remover e
permitir a visualização de seus elementos pelo usuário. Assim criamos a interface pública da
classe. O construtor cria uma lista vazia, as funções insere são capazes de adicionar um valor à
lista em uma determinada posição, se omitida a posição, o elemento é adicionado ao final. A
função retira faz a remoção do que se encontra em uma determinada posição e, por fim, a função
imprime mostra todos os valores constantes na estrutura.
Escolha da implementação
Em C++, uma lista pode ser implementada de diversas maneiras. Provavelmente, a mais simples é
lançando mão de um array de tamanho fixo para armazenar os seus elementos. Por achar esta
forma mais fácil de ser implementada, ela foi escolhida.
class Lista{
public:
Lista();
void insere (int);
void insere (int, int);
int retira (int);
int verifica (int);
void imprime();
...
...
private:
int elementos[100];
int ndElem;
};
2. Programa de teste
Para testar o funcionamento da classe, criamos um programa que utiliza as funções da estrutura
de forma sistemática para verificarmos se seu funcionamento está dentro dos conformes.
Implementação dos métodos da classe
Construtor
A lista inicia sempre vazia. Não fizemos um construtor de cópias e nem destrutor, já que não
utilizamos alocação dinâmica de memória ou apontadores. Como a lista deve ser povoada durante
o uso, não nos interessa o seu conteúdo durante a construção. Ficamos com o seguinte código:
Função de inserção
Cada vez que um elemento for inserido na última posição da nossa lista, devemos verificar se a
posição é válida, ora pode ser pedido que se adicione um elemento à uma posição que não está
coberta pela lista no momento da inserção. Faremos duas funções distintas para inserção: a com
//testeLista.cpp
#include "Lista.h"
#include <iostream>
using namespace std;
int main(){
Lista l;
l.insere(5);
l.insere(3);
l.insere(9);
l.insere(7);
l.insere(5);
l.imprime();
l.insere(2,2);
l.retira(4);
l.insere(4,4);
l.imprime();
}
Lista::Lista(){
ndElem=0;
}
3. posição definida e a com posição indefinida. É possível reunir estas duas funções em apenas uma
utilizando um valor default para posição, no entanto, seria difícil distinguir uma chamada sem este
parâmetro de outra em que o parâmetro é informado e coincide com o default. Dessa forma, foi
escolhido por duas implementações distintas.
Função de remoção
Se é necessário colocar novos elementos na lista, é, também, remover o que está nela. Para isso,
usamos uma função que recebe uma posição e, se válida, remove o elemento daquela posição.
Função de exibição
Quando precisamos percorrer a lista verificando seus elementos, podemos usar a seguinte função.
void Lista::insere (int x){
if(ndElem>=100){
throw new exception();
}
else{
elementos[ndElem]=x;
ndElem++;
}
}
void Lista::insere (int x, int pos){
if(ndElem>=100 || pos<=0)
throw new exception ();
int i;
for(i = ndElem; i>=pos; --i)
elementos[i]=elementos[i-1];
elementos[i]=x;
ndElem++;
}
int Lista::verifica (int pos){
if(ndElem<pos || pos<=0)
throw new exception ();
return elementos[pos-1];
}