INE5408
Estruturas de Dados
Estruturas de Dados básicas
utilizando Vetores
- Listas
Lista - Definição
Uma Lista é um conjunto de dados
dispostos e / ou acessáveis em uma
seqüência determinada.
– Este conjunto de dados pode possuir uma
ordem intrínseca (Lista Ordenada) ou não;
– este conjunto de dados pode ocupar
espaços de memória fisicamente
consecutivos, espelhando a sua ordem, ou
não;
– se os dados estiverem dispersos
fisicamente, para que este conjunto seja
uma lista, ele deve possuir operações e
informações adicionais que permitam que
seja tratado como tal (Lista Encadeada).
Vimos dois aspectos
Em um projeto de software, dois aspectos
devem ser considerados:
• de que forma estão organizados os dados,
qual a sua estrutura;
• quais procedimentos atuam sobre estes
dados, que operações podem ser realizadas
sobre eles.
• Vamos ver agora estes aspectos para as
listas.
Listas • A Lista é uma estrutura de dados
cujo funcionamento é inspirado
no de uma lista “natural”.
20
55
4
12
89
24
89
55
24
20
12
4 • Uma lista pode ser ordenada ou
não:
• quando for ordenada, pode o ser por
alguma característica intrínseca dos
dados (ex: ordem alfabética);
• pode também refletir a ordem
cronológica (ordem de inserção) dos
dados;
• em Smalltalk, a OrderedCollection é
uma lista cronológica (add:), a
SortedCollection é uma lista ordenada
por um critério interno.
Listas usando Vetores
-1
0
1
2
3
4
5
Lista
cheia
Lista
vazia
20
55
4
12
89
24
• Vetores possuem um espaço
limitado para o
armazenamento de dados;
• necessitamos definir um
espaço grande o suficiente
para a lista;
• necessitamos de um
indicador de qual elemento
do vetor é o atual último
elemento da lista.
Modelagem de Listas utilizando Programação
Estruturada
• Modelaremos a Estrutura de Dados Lista
utilizando a técnica da Programação
Orientada a Objeto, armazenando os dados
em um Vetor (Array).
– Veremos somente algoritmos;
– veremos algoritmos tanto para uma lista
cronológica quanto para uma lista ordenada.
• Procedimento Didático:
– modelagem da Lista e de seus algoritmos usando
Orientação a Objetos;
– exercícios.
Modelagem da Lista
• Aspecto Estrutural:
– necessitamos de um vetor para armazenar as informações;
– necessitamos de um indicador da posição atual do último
elemento da lista;
– necessitamos de uma constante que nos diga quando a lista
está cheia e duas outras para codificar erros.
• Pseudo-código:
constantes MAXLISTA = 100;
classe Lista {
inteiro dados[MAXLISTA];
inteiro último;
};
Modelagem da Lista
• Aspecto Funcional:
– colocar e retirar dados da lista;
– testar se a lista está vazia ou cheia (dentre
outros testes);
– inicializar a lista e garantir a ordem de seus
elementos.
Modelagem da Lista
• Operações: adicionar e retirar dados da lista
– Adiciona(dado)
– AdicionaNoInício(dado)
– AdicionaNaPosição(dado, posição)
– AdicionaEmOrdem(dado)
– Retira()
– RetiraDoInício()
– RetiraDaPosição(posição)
– RetiraEspecífico(dado)
Modelagem da Lista
• Operações: testar a lista
–ListaCheia
–ListaVazia
–Posição(dado)
–Contém(dado)
–Igual(dado1, dado2)
–Maior(dado1, dado2)
–Menor(dado1, dado2)
Modelagem da Lista
• Operações: inicializar ou limpar a lista
–InicializaLista
–DestróiLista
Construtor Lista
Lista()
início
último <- -1;
fim;
Algoritmo DestróiLista
MÉTODO destróiLista()
início
último <- -1;
fim;
Observação: este algoritmo parece redundante.
Colocar a sua semântica em separado da
inicialização, porém, é importante. Mais tarde
veremos que, utilizando alocação dinâmica de
memória, possuir um destrutor para Lista é muito
importante.
Algoritmo ListaCheia
Booleano MÉTODO listaCheia()
início
SE (último = MAXLISTA - 1) ENTÃO
RETORNE(Verdadeiro)
SENÃO
RETORNE(Falso);
fim;
Algoritmo ListaVazia
Booleano MÉTODO listaVazia()
início
SE (último = -1) ENTÃO
RETORNE(Verdadeiro)
SENÃO
RETORNE(Falso);
fim;
Algoritmo Adiciona
• Procedimento:
– testamos se há espaço;
– incrementamos o último;
– adicionamos o novo dado.
• Parâmetros:
– o dado a ser inserido;
4
5
20
55
4
12
89
24
Algoritmo Adiciona
Constantes
ERROLISTACHEIA = -1;
ERROLISTAVAZIA = -2;
ERROPOSIÇÃO = -3;
Inteiro MÉTODO adiciona(inteiro dado)
início
SE (listaCheia) ENTÃO
RETORNE(ERROLISTACHEIA)
SENÃO
último <- último + 1;
dados[último] <- dado;
RETORNE(último);
FIM SE
fim;
Algoritmo Retira
• Procedimento:
– testamos se há elementos;
– decrementamos o último;
– devolvemos o último elemento.
Algoritmo Retira
Inteiro MÉTODO retira()
início
SE (listaVazia) ENTÃO
RETORNE(ERROLISTAVAZIA)
SENÃO
último <- último – 1;
RETORNE(dados[último + 1]);
FIM SE
fim;
Observação: note que aqui se aplicam as mesmas restrições
das diversas variantes do algoritmo desempilha.
Algoritmo AdicionaNoInício
• Procedimento:
– testamos se há espaço;
– incrementamos o último;
– empurramos tudo para
trás;
– adicionamos o novo dado
na primeira posição.
• Parâmetros:
– o dado a ser inserido;
4
55
4
12
89
24 5
55
4
12
89
24
20
Algoritmo AdicionaNoInício
Inteiro MÉTODO adicionaNoInício(inteiro dado)
variáveis
inteiro posição; //Variável auxiliar para “caminhar”
início
SE (listaCheia) ENTÃO
RETORNE(ERROLISTACHEIA)
SENÃO
último <- último + 1;
posição <- último;
ENQUANTO (posição > 0) FAÇA
//Empurrar tudo para trás
dados[posição] <-
aLista.dados[posição - 1];
posição <- posição - 1;
FIM ENQUANTO
dados[0] <- dado;
RETORNE(0);
FIM SE
fim;
Algoritmo AdicionaNoInício
Inteiro MÉTODO adicionaNoInício(inteiro dado)
variáveis
inteiro posição; //Variável auxiliar para “caminhar”
início
SE (listaCheia) ENTÃO
RETORNE(ERROLISTACHEIA)
SENÃO
último <- último + 1;
posição <- último;
ENQUANTO (posição > 0) FAÇA
//Empurrar tudo para trás
dados[posição] <-
aLista.dados[posição - 1];
posição <- posição - 1;
FIM ENQUANTO
dados[0] <- dado;
RETORNE(0);
FIM SE
fim;
Algoritmo AdicionaNoInício
Inteiro MÉTODO adicionaNoInício(inteiro dado)
variáveis
inteiro posição; //Variável auxiliar para “caminhar”
início
SE (listaCheia) ENTÃO
RETORNE(ERROLISTACHEIA)
SENÃO
último <- último + 1;
posição <- último;
ENQUANTO (posição > 0) FAÇA
//Empurrar tudo para trás
dados[posição] <-
aLista.dados[posição - 1];
posição <- posição - 1;
FIM ENQUANTO
dados[0] <- dado;
RETORNE(0);
FIM SE
fim;
Algoritmo AdicionaNoInício
Inteiro MÉTODO adicionaNoInício(inteiro dado)
variáveis
inteiro posição; //Variável auxiliar para “caminhar”
início
SE (listaCheia) ENTÃO
RETORNE(ERROLISTACHEIA)
SENÃO
último <- último + 1;
posição <- último;
ENQUANTO (posição > 0) FAÇA
//Empurrar tudo para trás
dados[posição] <-
aLista.dados[posição - 1];
posição <- posição - 1;
FIM ENQUANTO
dados[0] <- dado;
RETORNE(0);
FIM SE
fim;
Algoritmo RetiraDoInício
• Procedimento:
– testamos se há elementos;
– decrementamos o último;
– salvamos o primeiro
elemento;
– empurramos tudo para a
frente.
5
4
20
55
4
12
89
24
55
4
12
89
24 20
Algoritmo RetiraDoInício
Inteiro MÉTODO retiraDoInício()
variáveis
inteiro posição, valor;
início
SE (listaVazia) ENTÃO
RETORNE(ERROLISTAVAZIA)
SENÃO
último <- último - 1;
valor <- dados[0];
posição <- 0;
ENQUANTO (posição <= último) FAÇA
//Empurrar tudo para a frente
dados[posição] <-
aLista.dados[posição + 1];
posição <- posição + 1;
FIM ENQUANTO
RETORNE(valor);
FIM SE
fim;
Algoritmo RetiraDoInício
Inteiro MÉTODO retiraDoInício()
variáveis
inteiro posição, valor;
início
SE (listaVazia) ENTÃO
RETORNE(ERROLISTAVAZIA)
SENÃO
último <- último - 1;
valor <- dados[0];
posição <- 0;
ENQUANTO (posição <= último) FAÇA
//Empurrar tudo para a frente
dados[posição] <-
aLista.dados[posição + 1];
posição <- posição + 1;
FIM ENQUANTO
RETORNE(valor);
FIM SE
fim;
Algoritmo RetiraDoInício
Inteiro MÉTODO retiraDoInício()
variáveis
inteiro posição, valor;
início
SE (listaVazia) ENTÃO
RETORNE(ERROLISTAVAZIA)
SENÃO
último <- último - 1;
valor <- dados[0];
posição <- 0;
ENQUANTO (posição <= último) FAÇA
//Empurrar tudo para a frente
dados[posição] <-
aLista.dados[posição + 1];
posição <- posição + 1;
FIM ENQUANTO
RETORNE(valor);
FIM SE
fim;
Algoritmo RetiraDoInício
Inteiro MÉTODO retiraDoInício()
variáveis
inteiro posição, valor;
início
SE (listaVazia) ENTÃO
RETORNE(ERROLISTAVAZIA)
SENÃO
último <- último - 1;
valor <- dados[0];
posição <- 0;
ENQUANTO (posição <= aLista.último) FAÇA
//Empurrar tudo para a frente
dados[posição] <-
aLista.dados[posição + 1];
posição <- posição + 1;
FIM ENQUANTO
RETORNE(valor);
FIM SE
fim;
Algoritmo AdicionaNaPosição
• Procedimento:
– testamos se há espaço e se a posição existe;
– incrementamos o último;
– empurramos tudo para trás a partir da posição;
– adicionamos o novo dado na posição informada.
• Parâmetros:
– o dado a ser inserido;
– a posição onde inserir;
Algoritmo AdicionaNaPosição
Inteiro MÉTODO adicionaNaPosição(inteiro dado, inteiro destino)
variáveis
inteiro posição;
início
SE (listaCheia) ENTÃO
RETORNE(ERROLISTACHEIA)
SENÃO
SE (destino > último + 1 OU destino < 0) ENTÃO
RETORNE(ERROPOSIÇÃO);
FIM SE
último <- último + 1;
posição <- último;
ENQUANTO (posição > destino) FAÇA
//Empurrar tudo para trás
dados[posição] <-
aLista.dados[posição - 1];
posição <- posição - 1;
FIM ENQUANTO
dados[destino] <- dado;
RETORNE(aonde);
FIM SE
fim;
Algoritmo AdicionaNaPosição
Inteiro MÉTODO adicionaNaPosição(inteiro dado, inteiro destino)
variáveis
inteiro posição;
início
SE (listaCheia) ENTÃO
RETORNE(ERROLISTACHEIA)
SENÃO
SE (destino > último + 1 OU destino < 0) ENTÃO
RETORNE(ERROPOSIÇÃO);
FIM SE
último <- último + 1;
posição <- último;
ENQUANTO (posição > destino) FAÇA
//Empurrar tudo para trás
dados[posição] <-
dados[posição - 1];
posição <- posição - 1;
FIM ENQUANTO
dados[destino] <- dado;
RETORNE(aonde);
FIM SE
fim;
Algoritmo AdicionaNaPosição
Inteiro MÉTODO adicionaNaPosição(inteiro dado, inteiro destino)
variáveis
inteiro posição;
início
SE (listaCheia) ENTÃO
RETORNE(ERROLISTACHEIA)
SENÃO
SE (destino > último + 1 OU destino < 0) ENTÃO
RETORNE(ERROPOSIÇÃO);
FIM SE
último <- último + 1;
posição <- último;
ENQUANTO (posição > destino) FAÇA
//Empurrar tudo para trás
dados[posição] <-
dados[posição - 1];
posição <- posição - 1;
FIM ENQUANTO
dados[destino] <- dado;
RETORNE(aonde);
FIM SE
fim;
Algoritmo AdicionaNaPosição
Inteiro MÉTODO adicionaNaPosição(inteiro dado, inteiro destino)
variáveis
inteiro posição;
início
SE (listaCheia) ENTÃO
RETORNE(ERROLISTACHEIA)
SENÃO
SE (destino > último + 1 OU destino < 0) ENTÃO
RETORNE(ERROPOSIÇÃO);
FIM SE
último <- último + 1;
posição <- último;
ENQUANTO (posição > destino) FAÇA
//Empurrar tudo para trás
dados[posição] <-
dados[posição - 1];
posição <- posição - 1;
FIM ENQUANTO
dados[destino] <- dado;
RETORNE(aonde);
FIM SE
fim;
Algoritmo RetiraDaPosição
• Procedimento:
– testamos se há elementos e se a posição
existe;
– decrementamos o último;
– salvamos elemento na posição;
– empurramos tudo para frente até posição.
• Parâmetros:
– o dado a ser inserido;
– a posição onde inserir;
Algoritmo RetiraDaPosição
Inteiro MÉTODO retiraDaPosição(inteiro fonte)
variáveis
inteiro posição, valor;
início
SE (fonte > último OU fonte < 0) ENTÃO
RETORNE(ERROPOSIÇÃO)
SENÃO
SE (listaVazia) ENTÃO
RETORNE(ERROLISTAVAZIA)
SENÃO
último <- último - 1;
valor <- dados[fonte];
posição <- fonte;
ENQUANTO (posição <= último) FAÇA
//Empurrar tudo para frente
dados[posição] <-
dados[posição + 1];
posição <- posição + 1;
FIM ENQUANTO
RETORNE(valor);
FIM SE
FIM SE
fim;
Algoritmo RetiraDaPosição
Inteiro MÉTODO retiraDaPosição(inteiro fonte)
variáveis
inteiro posição, valor;
início
SE (fonte > último OU fonte < 0) ENTÃO
RETORNE(ERROPOSIÇÃO)
SENÃO
SE (listaVazia) ENTÃO
RETORNE(ERROLISTAVAZIA)
SENÃO
último <- último - 1;
valor <- dados[fonte];
posição <- fonte;
ENQUANTO (posição <= último) FAÇA
//Empurrar tudo para frente
dados[posição] <-
dados[posição + 1];
posição <- posição + 1;
FIM ENQUANTO
RETORNE(valor);
FIM SE
FIM SE
fim;
Algoritmo RetiraDaPosição
Inteiro MÉTODO retiraDaPosição(inteiro fonte)
variáveis
inteiro posição, valor;
início
SE (fonte > último OU fonte < 0) ENTÃO
RETORNE(ERROPOSIÇÃO)
SENÃO
SE (listaVazia) ENTÃO
RETORNE(ERROLISTAVAZIA)
SENÃO
último <- último - 1;
valor <- dados[fonte];
posição <- fonte;
ENQUANTO (posição <= último) FAÇA
//Empurrar tudo para frente
dados[posição] <-
dados[posição + 1];
posição <- posição + 1;
FIM ENQUANTO
RETORNE(valor);
FIM SE
FIM SE
fim;
Algoritmo RetiraDaPosição
Inteiro MÉTODO retiraDaPosição(inteiro fonte)
variáveis
inteiro posição, valor;
início
SE (fonte > último OU fonte < 0) ENTÃO
RETORNE(ERROPOSIÇÃO)
SENÃO
SE (listaVazia) ENTÃO
RETORNE(ERROLISTAVAZIA)
SENÃO
último <- último - 1;
valor <- dados[fonte];
posição <- fonte;
ENQUANTO (posição <= último) FAÇA
//Empurrar tudo para frente
dados[posição] <-
dados[posição + 1];
posição <- posição + 1;
FIM ENQUANTO
RETORNE(valor);
FIM SE
FIM SE
fim;
Algoritmo RetiraDaPosição
Inteiro MÉTODO retiraDaPosição(inteiro fonte)
variáveis
inteiro posição, valor;
início
SE (fonte > último OU fonte < 0) ENTÃO
RETORNE(ERROPOSIÇÃO)
SENÃO
SE (listaVazia) ENTÃO
RETORNE(ERROLISTAVAZIA)
SENÃO
último <- último - 1;
valor <- dados[fonte];
posição <- fonte;
ENQUANTO (posição <= último) FAÇA
//Empurrar tudo para frente
dados[posição] <-
dados[posição + 1];
posição <- posição + 1;
FIM ENQUANTO
RETORNE(valor);
FIM SE
FIM SE
fim;
Algoritmo AdicionaEmOrdem
• Procedimento:
– necessitamos de uma função para
comparar os dados (maior);
– testamos se há espaço;
– procuramos pela posição onde inserir
comparando dados;
– chamamos adicionaNaPosição.
• Parâmetros:
– o dado a ser inserido;
Algoritmo Maior
Booleano MÉTODO maior(inteiro dado1, inteiro dado2)
início
SE (dado1 > dado2) ENTÃO
RETORNE(Verdadeiro)
SENÃO
RETORNE(Falso);
FIM SE
fim;
Observação: quando o dado a ser armazenado em uma lista for
algo mais complexo do que um inteiro, a comparação de
precedência não será mais tão simples (ex.: Empregado1 >
Empregado2) e será resultado de um conjunto mais complexo
de operações.
Para deixar os algoritmos de operações sobre lista
independentes do tipo de dado específico armazenado na lista,
usamos uma função deste tipo.
Algoritmo AdicionaEmOrdem
Inteiro MÉTODO adicionaEmOrdem(inteiro dado)
variáveis
inteiro posição; //Variável auxiliar para “caminhar”
início
SE (listaCheia) ENTÃO
RETORNE(ERROLISTACHEIA)
SENÃO
posição <- 0;
ENQUANTO (posição <= último E
maior(dado, dados[posição])) FAÇA
//Encontrar posição para inserir
posição <- posição + 1;
FIM ENQUANTO
RETORNE(adicionaNaPosição(dado, posição));
FIM SE
fim;
Algoritmo RetiraEspecífico
• Retira um dado específico da lista.
• Procedimento:
– testamos se há elementos;
– testamos se o dado existe e qual sua
posição;
– necessitamos de uma função
Posição(dado);
– chamamos RetiraDaPosição.
• Parâmetros:
– o dado a ser retirado;
Algoritmo Posição
Inteiro MÉTODO posição(inteiro dado)
variáveis
inteiro posição;
início
posição <- 0;
ENQUANTO (posição <= último E
NÃO(IGUAL(dado, dados[posição]))) FAÇA
posição <- posição + 1;
FIM ENQUANTO
SE (posição > último) ENTÃO
RETORNE(ERROPOSIÇÃO)
SENÃO
RETORNE(posição);
FIM SE
fim;
Algoritmo RetiraEspecífico
Inteiro MÉTODO retiraEspecífico(inteiro dado)
variáveis
inteiro posição;
início
SE (listaVazia) ENTÃO
RETORNE(ERROLISTAVAZIA)
SENÃO
posição <- posição(dado);
SE (posição < 0) ENTÃO
RETORNE(ERROPOSIÇÃO)
SENÃO
RETORNE(retiraDaPosição(posição));
FIM SE
FIM SE
fim;
Algoritmos Restantes
• As seguintes funções ficam por conta do
aluno :
– booleano Contém(dado)
– booleano Igual(dado1, dado2)
– booleano Menor(dado1, dado2)
Exercício de Implementação 3
Implemente uma lista em um vetor utilizando a
linguagem de programação “C++” com Orientação a
Objeto.
– Crie uma classe Lista;
– esta deverá ser uma lista de elementos da classe Agenda;
– A classe Agenda representa um nome de 30 posições e um
número de telefone;
– crie um método maior(a,b) que compare os nomes de duas
entradas;
– programe todos os métodos documentando cada método,
inclusive com dicionário de dados;
– crie um programa principal que execute todas os métodos de
lista a partir de um menu. O método procurar específico
deverá basear-se no nome em uma Agenda;
– além destes métodos, o programa deverá ser capaz de listar
a lista em ordem alfabética.

Aula_02_-_Listas_com_Vetores-OOP.ppt

  • 1.
    INE5408 Estruturas de Dados Estruturasde Dados básicas utilizando Vetores - Listas
  • 2.
    Lista - Definição UmaLista é um conjunto de dados dispostos e / ou acessáveis em uma seqüência determinada. – Este conjunto de dados pode possuir uma ordem intrínseca (Lista Ordenada) ou não; – este conjunto de dados pode ocupar espaços de memória fisicamente consecutivos, espelhando a sua ordem, ou não; – se os dados estiverem dispersos fisicamente, para que este conjunto seja uma lista, ele deve possuir operações e informações adicionais que permitam que seja tratado como tal (Lista Encadeada).
  • 3.
    Vimos dois aspectos Emum projeto de software, dois aspectos devem ser considerados: • de que forma estão organizados os dados, qual a sua estrutura; • quais procedimentos atuam sobre estes dados, que operações podem ser realizadas sobre eles. • Vamos ver agora estes aspectos para as listas.
  • 4.
    Listas • ALista é uma estrutura de dados cujo funcionamento é inspirado no de uma lista “natural”. 20 55 4 12 89 24 89 55 24 20 12 4 • Uma lista pode ser ordenada ou não: • quando for ordenada, pode o ser por alguma característica intrínseca dos dados (ex: ordem alfabética); • pode também refletir a ordem cronológica (ordem de inserção) dos dados; • em Smalltalk, a OrderedCollection é uma lista cronológica (add:), a SortedCollection é uma lista ordenada por um critério interno.
  • 5.
    Listas usando Vetores -1 0 1 2 3 4 5 Lista cheia Lista vazia 20 55 4 12 89 24 •Vetores possuem um espaço limitado para o armazenamento de dados; • necessitamos definir um espaço grande o suficiente para a lista; • necessitamos de um indicador de qual elemento do vetor é o atual último elemento da lista.
  • 6.
    Modelagem de Listasutilizando Programação Estruturada • Modelaremos a Estrutura de Dados Lista utilizando a técnica da Programação Orientada a Objeto, armazenando os dados em um Vetor (Array). – Veremos somente algoritmos; – veremos algoritmos tanto para uma lista cronológica quanto para uma lista ordenada. • Procedimento Didático: – modelagem da Lista e de seus algoritmos usando Orientação a Objetos; – exercícios.
  • 7.
    Modelagem da Lista •Aspecto Estrutural: – necessitamos de um vetor para armazenar as informações; – necessitamos de um indicador da posição atual do último elemento da lista; – necessitamos de uma constante que nos diga quando a lista está cheia e duas outras para codificar erros. • Pseudo-código: constantes MAXLISTA = 100; classe Lista { inteiro dados[MAXLISTA]; inteiro último; };
  • 8.
    Modelagem da Lista •Aspecto Funcional: – colocar e retirar dados da lista; – testar se a lista está vazia ou cheia (dentre outros testes); – inicializar a lista e garantir a ordem de seus elementos.
  • 9.
    Modelagem da Lista •Operações: adicionar e retirar dados da lista – Adiciona(dado) – AdicionaNoInício(dado) – AdicionaNaPosição(dado, posição) – AdicionaEmOrdem(dado) – Retira() – RetiraDoInício() – RetiraDaPosição(posição) – RetiraEspecífico(dado)
  • 10.
    Modelagem da Lista •Operações: testar a lista –ListaCheia –ListaVazia –Posição(dado) –Contém(dado) –Igual(dado1, dado2) –Maior(dado1, dado2) –Menor(dado1, dado2)
  • 11.
    Modelagem da Lista •Operações: inicializar ou limpar a lista –InicializaLista –DestróiLista
  • 12.
  • 13.
    Algoritmo DestróiLista MÉTODO destróiLista() início último<- -1; fim; Observação: este algoritmo parece redundante. Colocar a sua semântica em separado da inicialização, porém, é importante. Mais tarde veremos que, utilizando alocação dinâmica de memória, possuir um destrutor para Lista é muito importante.
  • 14.
    Algoritmo ListaCheia Booleano MÉTODOlistaCheia() início SE (último = MAXLISTA - 1) ENTÃO RETORNE(Verdadeiro) SENÃO RETORNE(Falso); fim;
  • 15.
    Algoritmo ListaVazia Booleano MÉTODOlistaVazia() início SE (último = -1) ENTÃO RETORNE(Verdadeiro) SENÃO RETORNE(Falso); fim;
  • 16.
    Algoritmo Adiciona • Procedimento: –testamos se há espaço; – incrementamos o último; – adicionamos o novo dado. • Parâmetros: – o dado a ser inserido; 4 5 20 55 4 12 89 24
  • 17.
    Algoritmo Adiciona Constantes ERROLISTACHEIA =-1; ERROLISTAVAZIA = -2; ERROPOSIÇÃO = -3; Inteiro MÉTODO adiciona(inteiro dado) início SE (listaCheia) ENTÃO RETORNE(ERROLISTACHEIA) SENÃO último <- último + 1; dados[último] <- dado; RETORNE(último); FIM SE fim;
  • 18.
    Algoritmo Retira • Procedimento: –testamos se há elementos; – decrementamos o último; – devolvemos o último elemento.
  • 19.
    Algoritmo Retira Inteiro MÉTODOretira() início SE (listaVazia) ENTÃO RETORNE(ERROLISTAVAZIA) SENÃO último <- último – 1; RETORNE(dados[último + 1]); FIM SE fim; Observação: note que aqui se aplicam as mesmas restrições das diversas variantes do algoritmo desempilha.
  • 20.
    Algoritmo AdicionaNoInício • Procedimento: –testamos se há espaço; – incrementamos o último; – empurramos tudo para trás; – adicionamos o novo dado na primeira posição. • Parâmetros: – o dado a ser inserido; 4 55 4 12 89 24 5 55 4 12 89 24 20
  • 21.
    Algoritmo AdicionaNoInício Inteiro MÉTODOadicionaNoInício(inteiro dado) variáveis inteiro posição; //Variável auxiliar para “caminhar” início SE (listaCheia) ENTÃO RETORNE(ERROLISTACHEIA) SENÃO último <- último + 1; posição <- último; ENQUANTO (posição > 0) FAÇA //Empurrar tudo para trás dados[posição] <- aLista.dados[posição - 1]; posição <- posição - 1; FIM ENQUANTO dados[0] <- dado; RETORNE(0); FIM SE fim;
  • 22.
    Algoritmo AdicionaNoInício Inteiro MÉTODOadicionaNoInício(inteiro dado) variáveis inteiro posição; //Variável auxiliar para “caminhar” início SE (listaCheia) ENTÃO RETORNE(ERROLISTACHEIA) SENÃO último <- último + 1; posição <- último; ENQUANTO (posição > 0) FAÇA //Empurrar tudo para trás dados[posição] <- aLista.dados[posição - 1]; posição <- posição - 1; FIM ENQUANTO dados[0] <- dado; RETORNE(0); FIM SE fim;
  • 23.
    Algoritmo AdicionaNoInício Inteiro MÉTODOadicionaNoInício(inteiro dado) variáveis inteiro posição; //Variável auxiliar para “caminhar” início SE (listaCheia) ENTÃO RETORNE(ERROLISTACHEIA) SENÃO último <- último + 1; posição <- último; ENQUANTO (posição > 0) FAÇA //Empurrar tudo para trás dados[posição] <- aLista.dados[posição - 1]; posição <- posição - 1; FIM ENQUANTO dados[0] <- dado; RETORNE(0); FIM SE fim;
  • 24.
    Algoritmo AdicionaNoInício Inteiro MÉTODOadicionaNoInício(inteiro dado) variáveis inteiro posição; //Variável auxiliar para “caminhar” início SE (listaCheia) ENTÃO RETORNE(ERROLISTACHEIA) SENÃO último <- último + 1; posição <- último; ENQUANTO (posição > 0) FAÇA //Empurrar tudo para trás dados[posição] <- aLista.dados[posição - 1]; posição <- posição - 1; FIM ENQUANTO dados[0] <- dado; RETORNE(0); FIM SE fim;
  • 25.
    Algoritmo RetiraDoInício • Procedimento: –testamos se há elementos; – decrementamos o último; – salvamos o primeiro elemento; – empurramos tudo para a frente. 5 4 20 55 4 12 89 24 55 4 12 89 24 20
  • 26.
    Algoritmo RetiraDoInício Inteiro MÉTODOretiraDoInício() variáveis inteiro posição, valor; início SE (listaVazia) ENTÃO RETORNE(ERROLISTAVAZIA) SENÃO último <- último - 1; valor <- dados[0]; posição <- 0; ENQUANTO (posição <= último) FAÇA //Empurrar tudo para a frente dados[posição] <- aLista.dados[posição + 1]; posição <- posição + 1; FIM ENQUANTO RETORNE(valor); FIM SE fim;
  • 27.
    Algoritmo RetiraDoInício Inteiro MÉTODOretiraDoInício() variáveis inteiro posição, valor; início SE (listaVazia) ENTÃO RETORNE(ERROLISTAVAZIA) SENÃO último <- último - 1; valor <- dados[0]; posição <- 0; ENQUANTO (posição <= último) FAÇA //Empurrar tudo para a frente dados[posição] <- aLista.dados[posição + 1]; posição <- posição + 1; FIM ENQUANTO RETORNE(valor); FIM SE fim;
  • 28.
    Algoritmo RetiraDoInício Inteiro MÉTODOretiraDoInício() variáveis inteiro posição, valor; início SE (listaVazia) ENTÃO RETORNE(ERROLISTAVAZIA) SENÃO último <- último - 1; valor <- dados[0]; posição <- 0; ENQUANTO (posição <= último) FAÇA //Empurrar tudo para a frente dados[posição] <- aLista.dados[posição + 1]; posição <- posição + 1; FIM ENQUANTO RETORNE(valor); FIM SE fim;
  • 29.
    Algoritmo RetiraDoInício Inteiro MÉTODOretiraDoInício() variáveis inteiro posição, valor; início SE (listaVazia) ENTÃO RETORNE(ERROLISTAVAZIA) SENÃO último <- último - 1; valor <- dados[0]; posição <- 0; ENQUANTO (posição <= aLista.último) FAÇA //Empurrar tudo para a frente dados[posição] <- aLista.dados[posição + 1]; posição <- posição + 1; FIM ENQUANTO RETORNE(valor); FIM SE fim;
  • 30.
    Algoritmo AdicionaNaPosição • Procedimento: –testamos se há espaço e se a posição existe; – incrementamos o último; – empurramos tudo para trás a partir da posição; – adicionamos o novo dado na posição informada. • Parâmetros: – o dado a ser inserido; – a posição onde inserir;
  • 31.
    Algoritmo AdicionaNaPosição Inteiro MÉTODOadicionaNaPosição(inteiro dado, inteiro destino) variáveis inteiro posição; início SE (listaCheia) ENTÃO RETORNE(ERROLISTACHEIA) SENÃO SE (destino > último + 1 OU destino < 0) ENTÃO RETORNE(ERROPOSIÇÃO); FIM SE último <- último + 1; posição <- último; ENQUANTO (posição > destino) FAÇA //Empurrar tudo para trás dados[posição] <- aLista.dados[posição - 1]; posição <- posição - 1; FIM ENQUANTO dados[destino] <- dado; RETORNE(aonde); FIM SE fim;
  • 32.
    Algoritmo AdicionaNaPosição Inteiro MÉTODOadicionaNaPosição(inteiro dado, inteiro destino) variáveis inteiro posição; início SE (listaCheia) ENTÃO RETORNE(ERROLISTACHEIA) SENÃO SE (destino > último + 1 OU destino < 0) ENTÃO RETORNE(ERROPOSIÇÃO); FIM SE último <- último + 1; posição <- último; ENQUANTO (posição > destino) FAÇA //Empurrar tudo para trás dados[posição] <- dados[posição - 1]; posição <- posição - 1; FIM ENQUANTO dados[destino] <- dado; RETORNE(aonde); FIM SE fim;
  • 33.
    Algoritmo AdicionaNaPosição Inteiro MÉTODOadicionaNaPosição(inteiro dado, inteiro destino) variáveis inteiro posição; início SE (listaCheia) ENTÃO RETORNE(ERROLISTACHEIA) SENÃO SE (destino > último + 1 OU destino < 0) ENTÃO RETORNE(ERROPOSIÇÃO); FIM SE último <- último + 1; posição <- último; ENQUANTO (posição > destino) FAÇA //Empurrar tudo para trás dados[posição] <- dados[posição - 1]; posição <- posição - 1; FIM ENQUANTO dados[destino] <- dado; RETORNE(aonde); FIM SE fim;
  • 34.
    Algoritmo AdicionaNaPosição Inteiro MÉTODOadicionaNaPosição(inteiro dado, inteiro destino) variáveis inteiro posição; início SE (listaCheia) ENTÃO RETORNE(ERROLISTACHEIA) SENÃO SE (destino > último + 1 OU destino < 0) ENTÃO RETORNE(ERROPOSIÇÃO); FIM SE último <- último + 1; posição <- último; ENQUANTO (posição > destino) FAÇA //Empurrar tudo para trás dados[posição] <- dados[posição - 1]; posição <- posição - 1; FIM ENQUANTO dados[destino] <- dado; RETORNE(aonde); FIM SE fim;
  • 35.
    Algoritmo RetiraDaPosição • Procedimento: –testamos se há elementos e se a posição existe; – decrementamos o último; – salvamos elemento na posição; – empurramos tudo para frente até posição. • Parâmetros: – o dado a ser inserido; – a posição onde inserir;
  • 36.
    Algoritmo RetiraDaPosição Inteiro MÉTODOretiraDaPosição(inteiro fonte) variáveis inteiro posição, valor; início SE (fonte > último OU fonte < 0) ENTÃO RETORNE(ERROPOSIÇÃO) SENÃO SE (listaVazia) ENTÃO RETORNE(ERROLISTAVAZIA) SENÃO último <- último - 1; valor <- dados[fonte]; posição <- fonte; ENQUANTO (posição <= último) FAÇA //Empurrar tudo para frente dados[posição] <- dados[posição + 1]; posição <- posição + 1; FIM ENQUANTO RETORNE(valor); FIM SE FIM SE fim;
  • 37.
    Algoritmo RetiraDaPosição Inteiro MÉTODOretiraDaPosição(inteiro fonte) variáveis inteiro posição, valor; início SE (fonte > último OU fonte < 0) ENTÃO RETORNE(ERROPOSIÇÃO) SENÃO SE (listaVazia) ENTÃO RETORNE(ERROLISTAVAZIA) SENÃO último <- último - 1; valor <- dados[fonte]; posição <- fonte; ENQUANTO (posição <= último) FAÇA //Empurrar tudo para frente dados[posição] <- dados[posição + 1]; posição <- posição + 1; FIM ENQUANTO RETORNE(valor); FIM SE FIM SE fim;
  • 38.
    Algoritmo RetiraDaPosição Inteiro MÉTODOretiraDaPosição(inteiro fonte) variáveis inteiro posição, valor; início SE (fonte > último OU fonte < 0) ENTÃO RETORNE(ERROPOSIÇÃO) SENÃO SE (listaVazia) ENTÃO RETORNE(ERROLISTAVAZIA) SENÃO último <- último - 1; valor <- dados[fonte]; posição <- fonte; ENQUANTO (posição <= último) FAÇA //Empurrar tudo para frente dados[posição] <- dados[posição + 1]; posição <- posição + 1; FIM ENQUANTO RETORNE(valor); FIM SE FIM SE fim;
  • 39.
    Algoritmo RetiraDaPosição Inteiro MÉTODOretiraDaPosição(inteiro fonte) variáveis inteiro posição, valor; início SE (fonte > último OU fonte < 0) ENTÃO RETORNE(ERROPOSIÇÃO) SENÃO SE (listaVazia) ENTÃO RETORNE(ERROLISTAVAZIA) SENÃO último <- último - 1; valor <- dados[fonte]; posição <- fonte; ENQUANTO (posição <= último) FAÇA //Empurrar tudo para frente dados[posição] <- dados[posição + 1]; posição <- posição + 1; FIM ENQUANTO RETORNE(valor); FIM SE FIM SE fim;
  • 40.
    Algoritmo RetiraDaPosição Inteiro MÉTODOretiraDaPosição(inteiro fonte) variáveis inteiro posição, valor; início SE (fonte > último OU fonte < 0) ENTÃO RETORNE(ERROPOSIÇÃO) SENÃO SE (listaVazia) ENTÃO RETORNE(ERROLISTAVAZIA) SENÃO último <- último - 1; valor <- dados[fonte]; posição <- fonte; ENQUANTO (posição <= último) FAÇA //Empurrar tudo para frente dados[posição] <- dados[posição + 1]; posição <- posição + 1; FIM ENQUANTO RETORNE(valor); FIM SE FIM SE fim;
  • 41.
    Algoritmo AdicionaEmOrdem • Procedimento: –necessitamos de uma função para comparar os dados (maior); – testamos se há espaço; – procuramos pela posição onde inserir comparando dados; – chamamos adicionaNaPosição. • Parâmetros: – o dado a ser inserido;
  • 42.
    Algoritmo Maior Booleano MÉTODOmaior(inteiro dado1, inteiro dado2) início SE (dado1 > dado2) ENTÃO RETORNE(Verdadeiro) SENÃO RETORNE(Falso); FIM SE fim; Observação: quando o dado a ser armazenado em uma lista for algo mais complexo do que um inteiro, a comparação de precedência não será mais tão simples (ex.: Empregado1 > Empregado2) e será resultado de um conjunto mais complexo de operações. Para deixar os algoritmos de operações sobre lista independentes do tipo de dado específico armazenado na lista, usamos uma função deste tipo.
  • 43.
    Algoritmo AdicionaEmOrdem Inteiro MÉTODOadicionaEmOrdem(inteiro dado) variáveis inteiro posição; //Variável auxiliar para “caminhar” início SE (listaCheia) ENTÃO RETORNE(ERROLISTACHEIA) SENÃO posição <- 0; ENQUANTO (posição <= último E maior(dado, dados[posição])) FAÇA //Encontrar posição para inserir posição <- posição + 1; FIM ENQUANTO RETORNE(adicionaNaPosição(dado, posição)); FIM SE fim;
  • 44.
    Algoritmo RetiraEspecífico • Retiraum dado específico da lista. • Procedimento: – testamos se há elementos; – testamos se o dado existe e qual sua posição; – necessitamos de uma função Posição(dado); – chamamos RetiraDaPosição. • Parâmetros: – o dado a ser retirado;
  • 45.
    Algoritmo Posição Inteiro MÉTODOposição(inteiro dado) variáveis inteiro posição; início posição <- 0; ENQUANTO (posição <= último E NÃO(IGUAL(dado, dados[posição]))) FAÇA posição <- posição + 1; FIM ENQUANTO SE (posição > último) ENTÃO RETORNE(ERROPOSIÇÃO) SENÃO RETORNE(posição); FIM SE fim;
  • 46.
    Algoritmo RetiraEspecífico Inteiro MÉTODOretiraEspecífico(inteiro dado) variáveis inteiro posição; início SE (listaVazia) ENTÃO RETORNE(ERROLISTAVAZIA) SENÃO posição <- posição(dado); SE (posição < 0) ENTÃO RETORNE(ERROPOSIÇÃO) SENÃO RETORNE(retiraDaPosição(posição)); FIM SE FIM SE fim;
  • 47.
    Algoritmos Restantes • Asseguintes funções ficam por conta do aluno : – booleano Contém(dado) – booleano Igual(dado1, dado2) – booleano Menor(dado1, dado2)
  • 48.
    Exercício de Implementação3 Implemente uma lista em um vetor utilizando a linguagem de programação “C++” com Orientação a Objeto. – Crie uma classe Lista; – esta deverá ser uma lista de elementos da classe Agenda; – A classe Agenda representa um nome de 30 posições e um número de telefone; – crie um método maior(a,b) que compare os nomes de duas entradas; – programe todos os métodos documentando cada método, inclusive com dicionário de dados; – crie um programa principal que execute todas os métodos de lista a partir de um menu. O método procurar específico deverá basear-se no nome em uma Agenda; – além destes métodos, o programa deverá ser capaz de listar a lista em ordem alfabética.