Вы находитесь на странице: 1из 32

Estruturas de Dados I

Listas Estticas

Estrutura de Dados Lista - Definio
Seqncia de um ou mais itens
x
1
,x
2
,,x
n
, na qual x
i
de um determinado tipo e n
representa o tamanho da lista linear.

Sua principal propriedade estrutural envolve as
posies relativas dos itens em uma dimenso.
Assumindo n 1, x1 o primeiro item da lista e x
n

o ltimo item da lista.
x
i
precede x
i+1
para i = 1,2,,n 1
x
i
sucede x
i-1
para i = 2,3,,n
o elemento x
i
dito estar na i-sima posio da
lista.
Estrutura de Dados Lista - Definio
Uma Estrutura de Dados Lista um
conjunto de dados dispostos e/ou
acessveis em uma seqncia determinada.
Este conjunto de dados pode possuir uma
ordem intrnseca (Lista Ordenada) ou no.
Este conjunto de dados pode ocupar espaos de
memria fisicamente consecutivos, espelhando
a sua ordem, ou no.
Se os dados estiverem dispersos fisicamente,
para que este conjunto seja uma lista, ele deve
possuir operaes e informaes adicionais que
permitam que seja tratado como tal (Lista
Encadeada).
Listas
20
55
4
12
89
24
A Lista uma estrutura de dados
cujo funcionamento inspirado
no de uma lista natural
Uma lista pode ser Ordenada ou
no.
Quando for ordenada, pode o ser por
alguma caracterstica intrnseca dos
dados (ex: ordem alfabtica).
Pode tambm refletir a ordem
cronolgica (ordem de insero) dos
dados).
89
55
24
20
12
4
-1
Listas usando Vetores Listas estticas
0 1 2 3 4 5
Vetores possuem um espao
limitado para armazenamento
de dados.
Necessitamos definir um espao
grande o suficiente para a lista.
Necessitamos de um indicador
de qual elemento do vetor o
atual ltimo elemento da lista.
Lista
cheia
Lista
vazia
20
55
4
12
89
24
Modelagem de Listas Estticas
utilizando Algoritmo Estruturado
Modelaremos a Estrutura de Dados Lista utilizando a
tcnica da Programao Estruturada e como forma de
armazenamento um Vetor (Array).
Veremos por enquanto somente os algoritmos.

Modelagem da Lista
Aspecto Estrutural:
Necessitamos de um vetor para armazenar as informaes.
Necessitamos de um indicador da posio atual do ltimo
elemento da lista.
Necessitamos de uma constante que nos diga quando a lista est
cheia e duas outras para codificar erros.
Criaremos uma lista esttica de inteiros para exemplo.

Algoritmo para o TAD:
constantes Maxlista = 100;

tipo Lista {
inteiro dados[Maxlista];
inteiro ultimo;
} nometipoLista;
Modelagem da Lista
Aspecto Funcional:
Colocar e retirar dados da lista.
Testar se a lista est vazia ou cheia e outros testes.
Inicializa-la e garantir a ordem dos elementos.
Modelagem da Lista
Exemplo de Operaes: Colocar e retirar dados da lista:
Adiciona(dado)
AdicionaNoIncio(dado)
AdicionaNaPosio(dado,posio)
AdicionaEmOrdem(dado)
Retira()
RetiraDoIncio()
RetiraDaPosio(posio)
RetiraEspecfico(dado)
Modelagem da Lista
Exemplo de Operaes: Testar a lista e outros testes:
ListaCheia
ListaVazia
Posicao(dado)
Contem(dado)
Igual(dado1,dado2)
Maior(dado1,dado2)
Menor(dado1,dado2)
Exemplo de Operaes: Inicializar ou limpar:
InicializaLista
DestroiLista
Algoritmo InicializaLista
FUNO inicializaLista()
incio
aLista.ultimo := -1;
fim;



Observao: Este e os prximos algoritmos pressupem que foi definida uma
varivel global tipo Lista denominada aLista.

Ou seja, foi declarada no incio:
nometipolista aLista;
Algoritmo DestroiLista
FUNO destroiLista()
incio
aLista.ultimo := -1;
fim;



Observao: Este algoritmo parece redundante. Colocar a sua semantica em
separado da inicializao porm, importante. Mais tarde veremos que,
utilizando alocao deinmica de memria, possuir um destrutor para alista
muito importante.
Algoritmo ListaCheia
Booleano FUNO listaCheia()
incio
SE (aLista.ultimo = Maxlista - 1) ENTO
RETORNE(Verdade)
SENO
RETORNE(Falso);
fim;

Pergunta: Existe tipo booleano em C?
Adote o padro: 0 para falso, e diferente de 0 (-1 ou
1) para verdadeiro.
Algoritmo ListaVazia
Booleano FUNO listaVazia()
incio
SE (aLista.ultimo = -1) ENTO
RETORNE(Verdade)
SENO
RETORNE(Falso);
fim;
Algoritmo Adiciona
Procedimento:
Testamos se h espao.
Incrementamos o ltimo.
Adicionamos o novo dado.
Parmetros:
O dado a ser inserido.
Lista (global).
4 5
20
55
4
12
89
24
Algoritmo Adiciona
Constantes
ErroListaCheia = -1;
ErroListaVazia = -2;
ErroPosio = -3;

Inteiro FUNO adiciona(inteiro dado)
incio
SE (listaCheia) ENTO
RETORNE(ErroListaCheia);
SENO
aLista.ultimo := aLista.ultimo + 1.
aLista.dados[aLista.ultimo] := dado;
RETORNE(aLista.ultimo);
FIM SE
fim;
Algoritmo Retira
Procedimento:
Testamos se h elementos.
Decrementamos o ltimo.
Devolvemos o ltimo elemento.
Parmetros:
Lista (global).
Algoritmo Retira
Inteiro FUNO retira()
incio
SE (listaVazia) ENTO
RETORNE(ErroListaVazia);
SENO
aLista.ultimo := aLista.ultimo - 1.
RETORNE(aLista.dados[aLista.ultimo + 1]);
FIM SE
fim;


Algoritmo AdicionaNoIncio
Procedimento:
Testamos se h espao.
Incrementamos o ltimo.
Empuramos tudo para trs.
Adicionamos o novo dado
na primeira posio.
Parmetros:
O dado a ser inserido.
Lista (global).
4
55
4
12
89
24 5
55
4
12
89
24
20
Algoritmo AdicionaNoIncio
Inteiro FUNO adicionaNoIncio(inteiro dado)
variveis
inteiro posio; //Varivel auxiliar para percorrer
incio
SE (listaCheia) ENTO
RETORNE(ErroListaCheia);
SENO
aLista.ultimo := aLista.ultimo + 1;
posio := aLista.ultimo;
ENQUANTO (posio > 0) FAA
//Empurrar tudo para tras
aLista.dados[posicao] := aLista.dados[posicao - 1];
posio := posio - 1;
FIM ENQUANTO
aLista.dados[0] := dado;
RETORNE(0);
FIM SE
fim;
Algoritmo RetiraDoIncio
Procedimento:
Testamos se h elementos.
Decrementamos o ltimo.
Salvamos e primeiro
elemento.
Empuramos tudo para a
frente.
Parmetros:
Lista (global).
5 4 20
55
4
12
89
24
55
4
12
89
24 20
Algoritmo RetiraDoIncio
Inteiro FUNO retiraDoIncio()
variveis
inteiro posio, valor;
incio
SE (listaVazia) ENTO
RETORNE(ErroListaVazia);
SENO
aLista.ultimo := aLista.ultimo - 1;
valor := aLista.dados[0];
posio := 0;
ENQUANTO (posio <= aLista.ultimo) FAA
//Empurrar tudo para frente
aLista.dados[posicao] := aLista.dados[posicao + 1];
posio := posio + 1;
FIM ENQUANTO
RETORNE(valor);
FIM SE
fim;
Algoritmo AdicionaNaPosio
Procedimento:
Testamos se h espao e se a posio existe.
Incrementamos o ltimo.
Empuramos tudo para trs a partir da posio.
Adicionamos o novo dado na posio dada.
Parmetros:
O dado a ser inserido.
A posio onde inserir.
Lista (global).
Algoritmo AdicionaNaPosio
Inteiro FUNO adicionaNaPosio(inteiro dado, destino)
variveis
inteiro posio;
incio
SE (listaCheia) ENTO
RETORNE(ErroListaCheia);
SENO
SE (destino > aLista.ultimo + 1) ENTO
RETORNE(ErroPosio);
FIM SE
aLista.ultimo := aLista.ultimo + 1;
posio := aLista.ultimo;
ENQUANTO (posio > destino) FAA
//Empurrar tudo para tras
aLista.dados[posicao] := aLista.dados[posicao - 1];
posio := posio - 1;
FIM ENQUANTO
aLista.dados[destino] := dado;
RETORNE(destino);
FIM SE
fim;
Algoritmo RetiraDaPosio
Procedimento:
Testamos se h elementos e se a posio existe.
Decrementamos o ltimo.
Salvamos elemento na posio.
Empuramos tudo para frente at posio.
Parmetros:
O dado a ser inserido.
A posio onde inserir.
Lista (global).
Algoritmo RetiraDaPosio
Inteiro FUNO retiraDaPosio(inteiro fonte)
variveis
inteiro posio, valor;
incio
SE (fonte > aLista.ultimo) ENTO
RETORNE(ErroPosio);
SENO
SE (listaVazia) ENTO
RETORNE(ErroListaVazia);
SENO
aLista.ultimo := aLista.ultimo - 1;
valor := aLista.dados[fonte];
posio := fonte;
ENQUANTO (posio <= aLista.ultimo) FAA
//Empurrar tudo para frente
aLista.dados[posicao] := aLista.dados[posicao + 1];
posio := posio + 1;
FIM ENQUANTO
RETORNE(valor);
FIM SE
FIM SE
fim;
Algoritmo RetiraEspecfico
Retira um dado especfico da lista.
Procedimento:
Testamos se h elementos.
Testamos se o dado existe e qual sua posio.
Necessitamos de uma funo Posio(dado)
Chamamos RetiraDaPosio.
Parmetros:
O dado a ser retirado.
Lista (global).
Algoritmo Posio
Inteiro FUNO posio(inteiro dado)
variveis
inteiro posio;
incio
posio := 0;
ENQUANTO (posio <= aLista.ultimo E
NO(IGUAL(dado,aLista.dados[posio]))) FAA
posio := posio + 1;
FIM ENQUANTO
SE (posio > aLista.ultimo) ENTO
RETORNE(ErroPosio);
SENO
RETORNE(posio);
FIM SE
fim;
Algoritmo RetiraEspecfico
Inteiro FUNO retiraEspecfico(inteiro dado)
variveis
inteiro posio;
incio
SE (listaVazia) ENTO
RETORNE(ErroListaVazia);
SENO
posio := posio(dado);
SE (posio < 0) ENTO
RETORNE(ErroPosio);
SENO
RETORNE(retiraDaPosio(posio));
FIM SE
FIM SE
fim;

Algoritmos Contem(dado)
Procedimento:
Testamos se um dado especfico existe na lista.

Parmetros:
O dado a ser procurado.
Lista (global).
Algoritmo Contm
Booleano FUNO Contm(inteiro dado)
variveis
inteiro posio;
incio
posio := 0;
ENQUANTO (posio <= aLista.ultimo E
NO(IGUAL(dado,aLista.dados[posio]))) FAA
posio := posio + 1;
FIM ENQUANTO
SE (posio > aLista.ultimo) ENTO
RETORNE(Falso);
SENO
RETORNE(Verdadeiro);
FIM SE
fim;
Exerccios
Converter todos os algoritmos apresentados nesta aula
em programas em C.

Вам также может понравиться