Sie sind auf Seite 1von 14

ESTRUTURA DE DADOS Contedo

Introduo s Estruturas de Dados Reviso de Vetores e Matrizes Estruturas com Alocao Esttica de Memria o 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

Introduo

As 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.

Bibliografia

Tanenbaum, Aaron M. Estrutura de Dados Usando C. Makron Books. 1995. Pereira, Slvio L. Estruturas de dados fundamentais: conceitos e aplicaes. Editora rica. 1996.

Estrutura de Dados Prof. Cludio L. V. Oliveira

Alocao Esttica de Memria: Vetores e Matrizes

Os 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:

0 v: 8

1 4

2 3

3 7

4 1

Neste primeiro exemplo temos que o primeiro elemento do vetor encontrase 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 determinada posio relativa: i i+1 i+2 i+3 i+4

v:

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.

n-4 n-3 n-2 n-1 n v: 8 4 3 7 1

Estrutura de Dados Prof. Cludio L. V. Oliveira

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 Acesso
As 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 <stdio.h> #include <stdlib.h> #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 Prof. Cludio L. V. Oliveira

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 Prof. Cludio L. V. Oliveira

Listas Lineares

Consiste 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 Operaes

a) 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 Contguas


A 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.

n+1

n+2

n+3

...

n+t

Implementao #include <stdio.h> #include <stdlib.h>


Estrutura de Dados Prof. Cludio L. V. Oliveira 5

#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 Prof. Cludio L. V. Oliveira

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"); else lista[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 Prof. Cludio L. V. Oliveira

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); else printf ("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 Prof. Cludio L. V. Oliveira

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 Prof. Cludio L. V. Oliveira

Pilhas

A 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 <stdio.h> #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++; } else printf("\nA pilha esta cheia!\n\n"); } void desempilhar() { if (topo > 0) topo--; else printf("\nA pilha esta vazia!\n\n"); } void consultar() { if (topo == 0) printf("\nA pilha esta vazia!\n\n"); else printf("\nElemento do topo: %d\n\n", p[topo - 1].valor);
Estrutura de Dados Prof. Cludio L. V. Oliveira 10

2 7 10 12 5

Topo

} 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 Prof. Cludio L. V. Oliveira

11

Filas

Uma 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 <stdio.h> #define TAM 100 struct fila { int valor; }; struct fila f[TAM]; int inicio = 0; int fim = -1;

12

incio

fim

void inserir() { int v; if (fim < (TAM - 1)) { printf ("\nDigite um numero: "); scanf ("%d", &v); fim++; f[fim].valor= v; } else printf("\nA fila esta cheia!\n\n"); } void retirar() { if (inicio > fim) printf("\nA fila esta vazia!\n\n"); else inicio++; } void consultar() { if (inicio > fim) printf("\nA fila esta vazia!\n\n"); else printf("\nElemento do inicio da fila: %d\n\n", f[inicio].valor); }

Estrutura de Dados Prof. Cludio L. V. Oliveira

12

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 Prof. Cludio L. V. Oliveira 13

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 Prof. Cludio L. V. Oliveira

14