INF1007 - PROGRAMAÇÃO II LISTA DE EXERCÍCIOS 15



Documentos relacionados
INF 1007 Programação II

INF1007: Programação 2 10 Árvores Binárias. (c) Dept. Informática - PUC-Rio 1

Linguagem C: Árvores Binarias

Estruturas de Dados. Prof. Gustavo Willam Pereira Créditos: Profa. Juliana Pinheiro Campos

Métodos Computacionais. Árvores

Busca. Pesquisa sequencial

Estruturas de Dados I

Figura 13.1: Um exemplo de árvore de diretório.

Trabalho 3: Agenda de Tarefas

Estruturas de Dados Aula 15: Árvores 17/05/2011

Árvore Binária de Busca

EAD Árvore árvore binária

ESTRUTURAS DE DADOS AVANÇADAS (INF 1010) (a) Seja um TAD definido por uma lista circular implementada em um vetor.

BUSCA EM LISTAS LISTAS SEQÜENCIAIS, LISTAS SIMPLESMENTE E DUPLAMENTE ENCADEADAS E LISTAS CIRCULARES

Pesquisa em Memória Primária. Algoritmos e Estruturas de Dados II

ALGORITMOS E ESTRUTURAS DE DADOS CES-11 CES-11 CES-11

Estruturas de Dados. Árvores AVL. Cesar Tadeu Pozzer. Curso de Ciência da Computação UFSM (12/12/2007)

Árvores Binárias de Busca

Pesquisa Sequencial e Binária

- UNIVERSIDADE DO VALE DO RIO DOS SINOS CIÊNCIAS EXATAS E TECNOLÓGICAS Curso: Informática / Ciência da Computação

EAD Árvore - representação usando listas ligadas

2ª Lista de Exercícios

INF 1620 P1-10/04/02 Questão 1 Nome:

Métodos Computacionais. Fila

ÁRVORES ABB (ÁRVORES BINÁRIAS DE BUSCAS) Sérgio Carlos Portari Júnior

Algoritmos e Estruturas de Dados: Árvore Binária

Prof. Yandre Maldonado - 1 PONTEIROS. Prof. Yandre Maldonado e Gomes da Costa

FACULDADE CAMPO LIMPO PAULISTA MESTRADO EM CIÊNCIA DA COMPUTAÇÃO. Projeto e Análise de Algoritmos II Lista de Exercícios 2

Árvores Binárias - continuação

INF PROGRAMAÇÃO II LISTA DE EXERCÍCIOS 4

Tipos de Dados, Tipos Abstratos de Dados Estruturas de Dados

Aula 3 Alocação Dinâmica

Árvores Binárias de Busca

Árvores Binárias. Observação: Material elaborado a partir do material do Professor Marcos Costa.

Árvores Binárias Balanceadas

struct arv { char info; struct arv* esq; struct arv* dir; };

struct LISTA item quant

CIÊNCIA DA COMPUTAÇÃO PROVA PARA TRANSFERÊNCIA

Pesquisa em Memória Primária. Prof. Jonas Potros

Algoritmos e Estruturas de Dados: Árvore Binária de Busca

Este trabalho tem como objetivo praticar o uso de tipos abstratos de dados e estruturas do tipo Lista.

Árvores binárias de pesquisa com balanceamento. Algoritmos e Estruturas de Dados II

DAS5102 Fundamentos da Estrutura da Informação

Departamento de Informática - PUC-Rio INF 1007 Programação 2 P3 23/06/2010

UFJF - DCC - Estrutura de Dados e Laboratório de Programação II

1. Introdução Definição Conceitos relacionados... 2

10. Listas Encadeadas

INF 1010 Estruturas de Dados Avançadas. Árvores binárias

BC1424 Algoritmos e Estruturas de Dados I. Aula 16: Árvores (introdução) Prof. Jesús P. Mena-Chalco. jesus.mena@ufabc.edu.br

INF 1007 Programação II

Algoritmos e Estrutura de Dados. Prof. Tiago A. E. Ferreira

INF 1010 Estruturas de Dados Avançadas

ESTRUTURAS DE DADOS I. Notas de Aula. Prof. Dr. Gilberto Nakamiti

PROGRAMAÇÃO II 4. ÁRVORE

ALGORITMOS E ESTRUTURAS DE DADOS Terceiro Trabalho Prático Recursividade e Pilhas

Algoritmos e Estruturas de Dados

Pesquisa digital. Algoritmos e Estruturas de Dados II

Programas operam sobre dados. Dados são relacionados e possuem estrutura. Como representar e manipular dados em um computador

UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA

ESTRUTURA DE DADOS DCC013

Árvores. Sérgio Carlos Portari Júnior

INF 1620 P4-27/06/02 Questão 1 Nome:

Estruturas de Dados Aula 11: TAD Pilha 09/05/2011

1. Fazer um programa em C que pergunta um valor em metros e imprime o correspondente em decímetros, centímetros e milímetros.

Lista de Exercícios. Vetores

Tabela de Símbolos. Análise Semântica A Tabela de Símbolos. Principais Operações. Estrutura da Tabela de Símbolos. Declarações 11/6/2008

Pedro Vasconcelos DCC/FCUP. Programação Funcional 15 a Aula Árvores de pesquisa

UNIVERSIDADE FEDERAL DO ESPÍRITO SANTO CENTRO UNIVERSITÁRIO NORTE DO ESPÍRITO SANTO

Pesquisa em Memória Primária. Prof. Jonas Potros

Métodos de Pesquisa em Memória Primária

INF 1620 P2-01/11/03 Questão 1 Nome:

Sumário. 5COP096 Teoria da Computação Aula 8 Pesquisa em Memória Primária

Estruturas de Dados. Parte dos slides a seguir são adaptações, extensões e traduções para C dos originais:

Universidade Federal do Vale do São Francisco. Estruturas de Dados. Professor: Marcelo Santos Linder

Estrutura da linguagem de programação C Prof. Tiago Eugenio de Melo tiago@comunidadesol.org

;(define conta-folhas ; (lambda ( ) ; (cond ; ( ( ) ) ; ( (and ) ) ; ( else ; ) ) ))

Algoritmos e Estruturas de Dados II. Trabalho Prático 2

Memória Flash. PdP. Autor: Tiago Lone Nível: Básico Criação: 11/12/2005 Última versão: 18/12/2006. Pesquisa e Desenvolvimento de Produtos

Exercícios de Revisão Java Básico

- UNIVERSIDADE DO VALE DO RIO DOS SINOS CENTRO DE CIÊNCIAS EXATAS E TECNOLÓGICAS (C6/6) Curso: Informática

Listas Duplamente Encadeadas

Algoritmos e Estrutura de Dados III. Árvores

Árvores. Algoritmos e Estruturas de Dados 2005/2006

/*(Atenção: Em se tratando de uma lista estaticamente alocada, temos utilizado a estratégia de passa o tamanho máximo do vetor.)*/

UNIVERSIDADE FEDERAL DE SANTA MARIA

DAINF - Departamento de Informática

Árvores AVL. Prof. Othon M. N. Batista Estrutura de Dados

Árvore B UNITINS ANÁLISE E DESENVOLVIMENTO DE SISTEMAS 3º PERÍODO 43

INF 1005 Programação I

Busca em Memória. Secundária

Estruturas de Dados Aula 16: Árvores com Número Variável 13/06/2011

Árvores Binárias de Busca (ABB) 18/11

Árvores Binárias e Busca. Jeane Melo

DAS5102 Fundamentos da Estrutura da Informação

Transcrição:

INF1007 - PROGRAMAÇÃO II LISTA DE EXERCÍCIOS 15 1. Um número racional é expresso por dois inteiros: um numerador e um denominador (este último diferente de zero!). Implemente um TAD para representar números racionais e definir algumas operações simples sobre esse tipo de dado. O tipo Racional deve ser representado pelo seguinte tipo estruturado: struct racional { int numerador; int denominador; }; O tipo Racional deve ser definido como um ponteiro para a estrutura racional: typedef struct racional *Racional; O TAD Racional deve implementar as seguintes funções: racional_cria A função recebe um numerador e denominador, aloca dinamicamente a estrutura que representará o número racional e retorna seu endereço. Caso não seja possível alocar a memória, a função deve exibir uma mensagem e retornar NULL. Essa Racional racional_cria(int numerador, int denominador); ATENÇÃO: a representação interna do racional deve sempre usar os menores números possíveis. Por exemplo, se o a função receber "4/6", deve-se armazenar "2/3". Para realizar essa transformação utilize o calculo do MDC: static int mdc(int x, int y) { if (y == 0) return x; return mdc(y, x % y); } A função mdc deve ser implementada dentro do TAD Racional e estar acessível somente internamente para o TAD. racional_mostra A função recebe um número Racional e deve exibir na tela o numerador e o denominador do número racional como uma fração. Exemplo 2/3 (isto é, colocando uma '/' entre eles). Essa void racional_mostra(racional r);

racional_libera A função recebe um Racional e libera a memória alocada pela estrutura. Essa void racional_libera(racional r); racional_multiplica A função recebe dois Racionais e retorna um novo Racional, que é o produto dos Racionais recebidos como parâmetros. Note que o novo Racional deve ter os menores valores possíveis para numerador e denominador. Essa Racional racional_multiplica(racional r1, Racional r2); racional_soma A função recebe dois Racionais e retorna um novo Racional, que é a soma dos Racionais recebidos como parâmetros. Note que o novo Racional deve ter os menores valores possíveis para numerador e denominador. Essa Racional racional_soma(racional r1, Racional r2); racional_compara A função recebe dois Racionais e deve retornar um valor menor que zero se o primeiro Racional é menor que o segundo, zero se são iguais e um valor maior que zero se o primeiro Racional é maior que o segundo. Essa int racional_compara(racional r1, Racional r2); Após implementar as funções, crie o módulo principal do programa para ler dois números racionais informados pelo usuário e realizar as operações de multiplicação, soma e comparação dos números racionais utilizando as funções do TAD Racional.

2. Implemente um TAD Pilha como lista encadeada para armazenar números inteiros. O TAD deve exportar e implementar as seguintes funções: Pilha* pilha_cria(); void pilha_push(pilha* p, int v); int pilha_pop(pilha* p); int pilha_vazia(pilha* p); void pilha_libera(pilha* p); Utilizando o TAD Pilha, implemente a seguinte função: mesclapilhas A função recebe duas pilhas (p1 e p2) e retorna uma terceira pilha (p3) que é composta pela mescla dos elementos das duas outras, segundo o exemplo a seguir (observe que ao final da execução p1 e p2 deverão estar vazias). ATENÇÃO: A função mesclapilhas não pertence ao módulo de implementação do TAD pilha! Ela pode usar apenas as funções definidas na interface deste TAD. A Pilha* mesclapilhas(pilha *p1, Pilha *p2); Continue a implementação do programa, adicionando a ele um TAD Lista, que armazena valores inteiros. Os nós desta lista simplesmente encadeada são representados pela seguinte estrutura: struct nolista { int info; struct nolista *prox; }; O TAD Lista deve exportar e implementar as seguintes funções:

NoLista* lista_insere(nolista * n, int a); NoLista* lista_retira(nolista * n, int a); void lista_libera(nolista * n); void lista_imprime(nolista * n); NoLista* lista_acessa_prox(nolista * n); int lista_acessa_info(nolista * n); void lista_atualiza_info(nolista * n, int a); Além das funções normais, o TAD Lista também deve implementar e exportar a seguinte função: lista_comparalistasinv A função recebe duas listas de inteiros e verifica se uma lista é o inverso da outra, isto é, se a segunda lista contém os mesmos valores inteiros da primeira, mas em ordem contrária. A função deve utilizar o TAD Pilha como estrutura temporária auxiliar. A função deve retornar 1 se uma lista é o inverso da outra e 0 caso contrário. Note que as listas recebidas pela função podem ter tamanhos diferentes! A int comparalistasinv(nolista *l1, NoLista *l2); Após implementar as funções, crie o módulo principal do programa para testar as funções criadas. 3. Implemente um TAD Árvore para armazenar números inteiros com as seguintes funções: NoArvore *arvore_criavazia(void); NoArvore *arvore_cria(int info, NoArvore *sae, NoArvore *sad); int arvore_vazia(noarvore *a); void arvore_libera(noarvore *a); void arvore_imprime(noarvore *a, int nivel); Além das funções normais, o TAD Árvore também deve implementar e exportar as seguintes funções: arvore_somafolhas A função recebe uma árvore binária e retorna o a soma dos números inteiros armazenados em nós que são folhas da árvore (isto é, nós que não têm nenhum filho). Essa int arvore_somafolhas(noarvore* a); arvore_nivel Em uma árvore binária, o nível de um nó é definido como sendo igual à distância do caminho da raiz até o nó em questão. Assim, o nó raiz

está no nível 0, as raízes de suas sub-árvores no nível 1, as raízes das sub-árvores das sub-árvores no nível 2, e assim por diante. A função arvore_nivel recebe uma árvore binária e retorna o nível do nó cuja informação seja igual a um valor x dado. Se não existir um nó com o valor x, a função retornar o valor 1. Essa função tem o seguinte protótipo: int arvore_nivel(noarvore* a, int x); arvore_maiorsoma Considerando todos os possíveis caminhos da raiz até cada folha de uma árvore binária, podemos calcular uma valor referente a soma de todas as informações armazenadas nos nós de cada um destes caminhos. A função arvore_nivel recebe uma árvore binária e retorna a maior soma encontrada dentre todos os possíveis caminhos de uma árvore. Essa função tem o seguinte protótipo: int arvore_maiorsoma(noarvore* a); Após implementar as funções, crie o módulo principal do programa para testar as funções criadas. 4. Implemente um TAD Árvore Binária de Busca (ABB) para armazenar números inteiros. Os nós da ABB são definidos pela seguinte estrutura: struct noabb { int info; struct noabb *esq; struct noabb *dir; }; O TAD ABB deve implementar as seguintes funções: abb_cria A função deve criar uma nova ABB vazia retornando NULL. Essa NoABB *abb_cria(); abb_insere A função deve criar e inserir um novo nó na ABB respeitando a ordenação por valor dos nós. Essa NoABB *abb_insere(noabb *a, int valor);

abb_imprime A função de imprimir na tela todas os valores armazenados na ABB em ordem decrescente. Essa void abb_imprime(noabb *a); abb_libera a função deve liberar da memória todos os nós da ABB. Essa void abb_libera(noabb *a); Além das funções normais, o TAD ABB também deve implementar e exportar as seguintes funções: abb_valida A função recebe uma árvore e verifica se ela é uma árvore binária de busca valida (isto é, se todos os nós estão armazenados ordenadamente).a função deve retornar 1 se a árvore for uma árvore binária de busca, ou 0 caso contrario. Essa int abb_valida(noabb *a); abb_balanceada A função recebe uma árvore e verifica se ela está balanceada (isto é, se para cada nó da árvore, a diferença entre as alturas das suas sub-árvores (direita e esquerda) não é maior do que um).a função deve retornar 1 se a árvore estiver balanceada, ou 0 caso contrario. Essa função tem o seguinte protótipo: int abb_balanceada(noabb *a); Após implementar as funções, crie o módulo principal do programa para testar as funções criadas.