ED-Estruturas Com Alocacao Estatica
-
Upload
augusto-cavalcanti -
Category
Documents
-
view
220 -
download
0
Transcript of ED-Estruturas Com Alocacao Estatica
-
8/3/2019 ED-Estruturas Com Alocacao Estatica
1/14
ESTRUTURA DE DADOS
Contedo Introduo s Estruturas de Dados
Reviso de Vetores e Matrizes
Estruturas com Alocao Esttica de Memriao Listas Lineares Contguas
o Pilhas
o Filas
Estruturas com Alocao Dinmica de Memria
o Ponteiros
o Lista Linear Encadeada
o Lista com Descritor
o Lista Duplamente Encadeada
o Pilhas e Filas Recursividade
rvores
IntroduoAs estruturas de dados e algoritmos so temas fundamentais dentro da
cincia da computao, sendo utilizados nas mais diversas reas e com os mais
diferentes propsitos. Os algoritmos basicamente manipulam dados, quando
estes dados esto organizados (dispostos) de forma coerente caracterizam uma
estrutura de dados.
Desta forma, devemos entender que so a organizao e os mtodos que
manipulam determinada estrutura que lhe conferem singularidade. A escolha de
uma estrutura de dados apropriada pode tornar um problema complicado em uma
soluo trivial.
BibliografiaTanenbaum, Aaron M. Estrutura de Dados Usando C. Makron Books.1995.
Pereira, Slvio L. Estruturas de dados fundamentais: conceitos eaplicaes. Editora rica. 1996.
Estrutura de Dados 1
Prof. Cludio L. V. Oliveira
-
8/3/2019 ED-Estruturas Com Alocacao Estatica
2/14
Alocao Esttica de Memria: Vetores e MatrizesOs vetores podem ser entendidos como uma lista de elementos de um
mesmo tipo de dados e que exploram a contigidade da memria. Desta forma,
qualquer elemento dessa lista pode ser acessado instantaneamente atravs de
um ndice. Quando os vetores possuem mais de uma dimenso os mesmos se
tornam matrizes.
Considerando o exemplo int v[5] = {8, 4, 3, 7, 1}, possvel observar que
qualquer item do vetor pode ser imediatamente acessado atravs de qualquer
uma das representaes abaixo:
Neste primeiro exemplo temos que o primeiro elemento do vetor encontra-
se referenciado pelo ndice zero (0) e todos os demais elementos apresentam-se
nas posies subseqentes. Dentro deste conceito, para determinar o valor do
terceiro elemento do vetor, utilizaremos a notao v[2] o que nos retornar o
valor 3.
As prximas abordagens utilizam-se do conceito de contigidade para
determinar qualquer posio dentro do vetor a partir de uma determinadaposio relativa:
Considerando a ndice de inicial do vetor como i, qualquer elemento pode
ser acessado atravs da frmula i + n, onde n possui o nmero de posies que o
elemento est distante de i. Por exemplo, i + 1 far com que o elemento de valor
4 seja acessado.
Estrutura de Dados 2
Prof. Cludio L. V. Oliveira
v:
0 1 2 3 4
4 3 7 18
v:
i i+1 i+2 i+3 i+4
4 3 7 18
v:
n-4 n-3 n-2 n-1 n
4 3 7 18
-
8/3/2019 ED-Estruturas Com Alocacao Estatica
3/14
Por outro lado, como mostrado na figura acima, possvel tambm fazer o
caminho inverso. Neste caso a partir de uma posio final possvel determinar
as demais posies.
Disciplina de AcessoAs caractersticas de acesso a vetores e matrizes determinam que qualquer
elemento possa ser consultado, alterado ou removido a qualquer momento sem
preocupaes ou dependncias com os demais elementos que compem esse
vetor ou matriz. Sendo necessrio apenas certificar-se que o ndice utilizado
vlido, ou seja, maior ou igual a zero e menor que o tamanho do vetor ou matriz.
Exemplo
// Cara ou Coroa: A partir de 20 lanamentos de uma moeda// determine o nmero de caras e coroas ocorridos.
#include #include
#define LANCAMENTOS 20
char lancamento[] = {'C', 'C', 'O', 'C', 'O', 'O', 'O', 'C','C', 'C', 'O', 'C', 'C', 'O', 'O', 'C','O', 'C', 'C', 'O' };
int main (int argc, char *argv[]){ int numeroCara = 0;int numeroCoroa = 0;for (int i = 0; i < LANCAMENTOS; i++){ if (lancamento[i] == 'C')
numeroCara++;else
numeroCoroa++;}printf ("Ocorreu %d caras e %d coroas\n", numeroCara,numeroCoroa);
system("PAUSE");}
Estrutura de Dados 3
Prof. Cludio L. V. Oliveira
-
8/3/2019 ED-Estruturas Com Alocacao Estatica
4/14
Exerccios
1. Dada uma seqncia de 10 nmeros inteiros, imprimi-la na ordem inversa da
leitura.
2. Deseja-se determinar o nmero de acertos de um aluno em uma prova em
forma de testes. A prova consta de 25 questes, cada uma com alternativas
identificadas por A, B, C, D e E. Para determinar os acertos, esta prova dever ser
comparada ao seguinte gabarito: B, C, A, D, B, B, E, C, A, B, D, A, A, A, A, B, D, C,
E, E, A, C, E, D, B.
3. Um dado de jogo foi lanado 20 vezes. A partir dos resultados dos
lanamentos, determinar o nmero de ocorrncias de cada face.
4. Dados dois vetores A e B, ambos com 5 elementos, determinar o produto
desses vetores.
5. Dada um vetor de 10 nmeros inteiros, determinar o nmero de vezes que cada
um deles ocorre no mesmo. Por exemplo o vetor = [7, 3, 9, 5, 9, 7, 2, 7, 7, 2],
produziria a seguinte sada: 7 ocorre 4 vezes, 3 ocorre 1 vez, 9 ocorre 2 vezes, 5
ocorre 1 vez e 2 ocorre 2 vezes.
6. Em uma classe h 10 alunos, cada um dos quais realizou 3 provas com pesos
distintos. Sendo que a primeira prova possui peso 3, a segunda possui peso 4 e a
terceira peso 3. Aps o lanamento das notas das trs provas de cada aluno,calcular a mdia ponderada das provas para cada aluno.
7. Dada uma seqncia de 5 nmeros inteiros, determinar a mdia.
8. Dada uma matriz real A[4x3], verificar se existem elementos repetidos em A.
9. Implemente o tradicional jogo da velha a partir de uma matriz 3 por 3. Sendo
que a matriz deve representar os seguintes valores possveis: O, X e nulo (vazio).
10. Uma matriz D[8x8] pode representar a posio atual de um jogo de damas,
sendo que: nulo indica uma casa vazia; B indica uma casa ocupada por uma pea
branca; e P indica uma casa ocupada por uma pea preta. Supondo que as peas
pretas esto se movendo no sentido crescente das linhas da matriz, determinar
as posies das peas pretas que: a) podem tomar peas brancas; b) podem
mover-se sem tomar peas; c) no podem se mover.
Estrutura de Dados 4
Prof. Cludio L. V. Oliveira
-
8/3/2019 ED-Estruturas Com Alocacao Estatica
5/14
Listas LinearesConsiste em um tipo de estrutura que permite representar um conjunto de
dados de maneira a preservar a relao de ordem linear entre eles. Podem ser:
contguas (alocao esttica) ou encadeadas (alocao dinmica). considerada
uma das estruturas de dados mais simples. Exemplos de lista linear so os dias
da semana: [segunda, tera, quarta, quinta, sexta, sbado, domingo] ou os
andares de um edifcio: [subsolo, trreo, sobreloja, primeiro, segundo, ,
ensimo]. Deste modo, uma lista linear pode ser entendida como uma seqncia
de n elementos [a1, a2, ..., ai, ..., an], onde:
O primeiro elemento da lista a1;
O segundo elemento da lista a2;
O i-simo elemento da lista ai;
O ltimo elemento da lista an.
Em uma lista linear contgua os elementos podem ser inseridos, removidos
ou substitudos em qualquer posio.
Exemplos de Operaesa) acessar o n-simo n da lista, para alter-lo ou simplesmente consult-lo;
b) inserir um novo n na n-sima posio da lista;
c) remover o n-simo n da lista;
d) determinar o nmero de ns de uma lista
e) localizar o n que contm um determinado valor;
f) concatenar duas listas.
Listas Lineares ContguasA representao por contigidade explora a seqencialidade da memria do
computador, de tal forma que os ns de uma determinada lista sejam
armazenados em endereos contguos.
Implementao#include #include
Estrutura de Dados 5
Prof. Cludio L. V. Oliveira
n n + 1 n + 2 n + 3 ... n + t
-
8/3/2019 ED-Estruturas Com Alocacao Estatica
6/14
#define TAMANHO_LINHA 80#define TAMANHO 100
int lista[TAMANHO];int fim = 0;
char obter_caracter();int obter_numero(char *mensagem);char menu();int obter_posicao();
void consultar_lista();void inserir_item();void alterar_item();void remover_item();void contar_nos();
void procurar_no();
int main(int argc, char* argv[]){ char opcao;while ((opcao = menu()) != '0'){ if (opcao == '1')
consultar_lista();else if (opcao == '2')inserir_item();
else if (opcao == '3')
alterar_item();else if (opcao == '4')remover_item();
else if (opcao == '5')contar_nos();
else if (opcao == '6')procurar_no();
}return 0;
}
void consultar_lista(){ printf ("\n\n Lista: ");for (int i = 0; i < fim; i++)printf ("%d, ", lista[i]);
printf ("\n\n");}
Estrutura de Dados 6
Prof. Cludio L. V. Oliveira
-
8/3/2019 ED-Estruturas Com Alocacao Estatica
7/14
void inserir_item(){ int posicao = obter_numero("Digite a posicao: ");int valor = obter_numero("Digite o valor: ");if ((posicao < 0) || (posicao > fim))printf ("A posicao digitada fora do intervalo!\n\n");
else{ for (int i = (fim - 1); i >= posicao; i--)
lista[i + 1] = lista[i];fim++;lista[posicao] = valor;
}}
void alterar_item(){ int posicao = obter_numero("Digite a posicao: ");int valor = obter_numero("Digite o valor: ");
if ((posicao < 0) || (posicao >= fim))printf ("A posicao digitada fora do intervalo!\n\n");elselista[posicao] = valor;
}
void remover_item(){ int posicao = obter_numero("Digite a posicao: ");if ((posicao < 0) || (posicao >= fim))printf ("A posicao digitada fora do intervalo!\n\n");
else{ for (int i = posicao; i < (fim - 1); i++)
lista[i] = lista[i + 1];fim--;
}}
void contar_nos(){ printf ("A lista possui no momento %d nos.\n\n", fim);
}
Estrutura de Dados 7
Prof. Cludio L. V. Oliveira
-
8/3/2019 ED-Estruturas Com Alocacao Estatica
8/14
void procurar_no(){ int i;int valor = obter_numero("Digite o valor: ");bool achou = false;for (i = 0; i < fim; i++){ if (lista[i] == valor){ achou = true;
break;}
}if (achou)printf ("O no foi localizado na posicao %d.\n\n", i);
elseprintf ("Nenhum no com o valor %d foi localizado.\n\n",
valor);}
char obter_caracter(){ char c[TAMANHO_LINHA];gets (c);return (c[0]);
}
int obter_numero(char *mensagem){ char n[TAMANHO_LINHA];if (mensagem)
printf("%s", mensagem);gets (n);return (atoi(n));
}
char menu(){ printf("Digite a opcao desejada:\n\n");printf("1. Consultar a lista\n");printf("2. Inserir um elemento a lista\n");
printf("3. Alterar um elemento da lista\n");printf("4. Remover um elemento da lista\n");printf("5. Determinar o numero de nos\n");printf("6. Localizar o no que possui determinado valor\n");printf("0. Encerrar");printf("=>");return (obter_caracter());
}
Estrutura de Dados 8
Prof. Cludio L. V. Oliveira
-
8/3/2019 ED-Estruturas Com Alocacao Estatica
9/14
Exerccios
1) Desenvolver uma funo que verifique se uma lista linear contgua encontra-se
vazia.
2) Desenvolver uma funo que verifique se uma lista linear contgua encontra-se
cheia.
3) Elaborar uma funo que insira uma lista linear contgua ao final de outra lista
linear contgua, ou seja, realize a concatenao das duas listas.
4) Implementar uma agenda telefnica, utilizando uma lista linear contgua, com
as seguintes operaes: a) consultar a agenda; b) inserir um elemento na agenda
(em qualquer posio vlida); c) alterar um elemento da agenda; d) apagar um
elemento da agenda; e) determinar o nmero de ns utilizados; f) localizar o no
que possui determinado nome.
Estrutura de Dados 9
Prof. Cludio L. V. Oliveira
-
8/3/2019 ED-Estruturas Com Alocacao Estatica
10/14
2
7
10
12
5
Topo
PilhasA pilha uma estrutura de dados com disciplina de acesso do tipo LIFO
(Last In First Out), ou seja, o ltimo elemento que entra na pilha ser o primeiro a
sair.
Basicamente uma pilha deve oferecer as operaes de empilhar, ou seja,
insero de um elemento no topo da pilha, desempilhar, isto , remover o
elemento que est no topo e consultar, que consiste em obter o valor que est
armazenado. Desta forma, possvel observar que todas as operaes em uma
pilha ocorrem sempre a partir do topo.
// Implementacao de uma pilha com alocao esttica
#include #define TAM 100
struct pilha{ int valor;};
struct pilha p[TAM];int topo = 0;
void empilhar(){ int v;if (topo < TAM)
{ printf ("\nDigite um numero: ");scanf ("%d", &v);p[topo].valor= v;topo++;
}elseprintf("\nA pilha esta cheia!\n\n");
}
void desempilhar(){ if (topo > 0)topo--;
elseprintf("\nA pilha esta vazia!\n\n");
}
void consultar(){ if (topo == 0)
printf("\nA pilha esta vazia!\n\n");elseprintf("\nElemento do topo: %d\n\n", p[topo - 1].valor);
Estrutura de Dados 10
Prof. Cludio L. V. Oliveira
-
8/3/2019 ED-Estruturas Com Alocacao Estatica
11/14
}
int main (int argc, char *argv[]){ char opcao;do{ printf("IMPLEMENTACAO DE UMA PILHA COM ALOCACAO
ESTATICA\n");
printf("1.Empilhar\t2.Desempilhar\t3.Consultar\t0.Fim.Opcao? ");
fflush(stdin);opcao = getchar();
switch (opcao){ case '1': empilhar(); break;
case '2': desempilhar(); break;case '3': consultar(); break;
}} while (opcao != '0');return 0;
}
Estrutura de Dados 11
Prof. Cludio L. V. Oliveira
-
8/3/2019 ED-Estruturas Com Alocacao Estatica
12/14
12 8 9 2
incio fim
FilasUma estrutura de fila apresenta um tipo de acesso conhecido como FIFO
(First In First Out), ou seja, o primeiro elemento a entre ser o primeiro a sair.
Neste caso, torna-se necessrio, realizar o controle do incio e do final da fila,
pois, inseres apenas so possveis ao seu final. Por outro lado, a consultas e
retiradas podem ocorrer apenas no incio da fila.
// Implementao de uma fila com alocao esttica
#include #define TAM 100
struct fila{ int valor;};
struct fila f[TAM];int inicio = 0;int fim = -1;
void inserir(){ int v;if (fim < (TAM - 1)){ printf ("\nDigite um numero: "); scanf ("%d", &v);fim++;
f[fim].valor= v;}elseprintf("\nA fila esta cheia!\n\n");
}
void retirar(){ if (inicio > fim)
printf("\nA fila esta vazia!\n\n");elseinicio++;
}
void consultar(){ if (inicio > fim)
printf("\nA fila esta vazia!\n\n");elseprintf("\nElemento do inicio da fila: %d\n\n",
f[inicio].valor);
}
Estrutura de Dados 12
Prof. Cludio L. V. Oliveira
-
8/3/2019 ED-Estruturas Com Alocacao Estatica
13/14
int main (int argc, char *argv[]){ char opcao;do{ printf("IMPLEMENTACAO DE UMA FILA COM ALOCACAO ESTATICA\n");printf("1. Inserir\t2. Retirar\t3. Consultar\t0. Fim. Opcao
? ");fflush(stdin);
opcao = getchar();
switch (opcao){ case '1': inserir(); break;case '2': retirar(); break;case '3': consultar(); break;
}} while (opcao != '0');return 0;
}
Exerccios
1. Considerando a seguinte estrutura de pilha:
struct pilha{ int valor;
};struct pilha p[100];int topo = 0;
a) Escrever uma funo que remova todos os ns da pilha;
b) Implementar um algoritmo que verifique se a pilha est vazia ou no;
c) Desenvolver uma funo que empilhe um elemento apenas se ele for mltiplo
do elemento que est no topo.
d) Escrever um algoritmo que imprima todos os ns da pilha.
2. Considerando a seguinte estrutura de fila:
struct fila{ char nome[20];};struct fila f[100];int inicio = 0;int fim = -1;
a) Escrever uma funo que remova todos os ns da fila;
Estrutura de Dados 13
Prof. Cludio L. V. Oliveira
-
8/3/2019 ED-Estruturas Com Alocacao Estatica
14/14
b) Implementar um algoritmo que verifique se a fila est vazia ou no;
c) Desenvolver um algoritmo que faa o re-aproveitamento das posies no
utilizadas na fila, ou seja, as posies menores que o valor indicado pela varivel
incio.
d) Escrever uma funo que imprima todos os ns da fila.
3. Escrever os algoritmos necessrios para inverter um determinado vetor V
utilizando para isso, uma determinada pilha P com alocao esttica.
4. Criar um algoritmo que permita realizar a insero de um elemento em uma fila
com alocao esttica, desde que essa fila esteja vazia ou o elemento que ser
inserido seja mltiplo do valor que se encontra no incio dessa fila.
Estrutura de Dados 14
Prof. Cludio L. V. Oliveira