lista de inteiros
TRANSCRIPT
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 é, dadauma 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;};
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; }
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 esteparâ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]; }