UNIVERSIDADE NOVE DE JULHO - UNINOVE Pesquisa e Ordenação. Introdução. Material disponível para download em:

Tamanho: px
Começar a partir da página:

Download "UNIVERSIDADE NOVE DE JULHO - UNINOVE Pesquisa e Ordenação. Introdução. Material disponível para download em:"

Transcrição

1 UNIVERSIDADE NOVE DE JULHO - UNINOVE Pesquisa e Ordenação 1 Introdução Material disponível para download em: Estruturas de Dados EMENTA: Recursividade, Quick sort; Divisão e Conquista, Guloso, Backtracking; Complexidade; Alocação dinâmica de memória: Listas encadeadas; Árvores.. 2 OBJETIVOS: Aprofundar os conhecimentos em estruturas de dados no sentido de uma sólida formação que os capacitem a construir aplicativos de propósito geral. Levá-los a conhecer os fundamentos teóricos da estrutura de dados e como estes fundamentos implicam na definição de um sistema. METODOLOGIA DE ENSINO: Nas aulas teóricas os conceitos serão expostos por meio de utilização de lousa, retroprojetor, datashow, sendo disponibilizado para os alunos o material de apoio utilizado. Serão propostas atividades individuais ou em grupo para melhor fixação dos conceitos. As aulas práticas serão no laboratório de informática utilizando como ferramenta de apoio a linguagem de programação C. Todas as aulas práticas serão duas das quatro aulas no período. SISTEMA DE AVALIAÇÃO: O critério de avaliação deverá ser composto por 3 notas oficiais (AV1, AV2 e AV3), oriundas de instrumentos diversificados de avaliação. Para a composição da média serão consideradas as duas maiores notas obtidas entre a AV1, AV2 e AV3, sendo que as duas maiores notas serão somadas e divididas por 2, considerando-se aprovado o aluno que obtiver média final maior ou igual a 6, (seis).

2 Bibliografia BIBLIOGRAFIA BÁSICA: PEREIRA, Silvio do Lago; Estruturas de Dados Fundamentais Conceitos e Aplicações. 4ª ed. São Paulo, Érica, 2, 264 p. ASCENCIO, Ana Fernanda Gomes. Lógica de programação com Pascal. Ed. Makron Books, 1999, 355 p. VILLAS, Marcos Viana. Estruturas de Dados: Conceitos e Técnicas de Implementação. Ed. Campus, Schildt, Herbert. C Completo e Total. São Paulo : Pearson : Makron Books, 26, c1997 Aho, Alfred V. The design and analysis of computer algorithms Massachussets, EUA : Addison- Wesley, c BIBLIOGRAFIA COMPLEMENTAR: Pereira, Vania C.S. Algorítmos e lógica de programação: 1 exercícios resolvidos em pseudocódigo e linguagem C Isbn: São Paulo, 211 ZIVIANI, Nivio. Projeto de algoritmos com implementação em Pascal e C. Ed. Thomson, 2. BUCKNALL, Julian. Algoritmos e Estruturas de dados com Delphi. Ed. Berkeley, 22 UNIVERSIDADE NOVE DE JULHO - UNINOVE Pesquisa e Ordenação 4 Revisão de Pilhas Material disponível para download em:

3 Pilhas Uma pilha é uma lista linear em que apenas as operações de acesso, inserção e remoção são possíveis. 5 Todas estas operações deve ser realizadas num mesmo extremo denominado topo. Devido às características das operações da pilha, o último elemento a ser inserido será o primeiro a ser retirado. Estruturas desse tipo são conhecidas como "LIFO" (last in, first out). Exemplo: Em uma rua sem saída, tão estreita que apenas um carro passa por vez, o primeiro carro a sair será o último a ter entrado. Observe ainda que não podemos retirar qualquer carro e não podemos inserir um carro de tal forma que ele não seja o último. Operações com Pilhas Operações básicas 6 Seja P uma variável do tipo pilha e X um elemento qualquer push(p, x) - Procedimento que insere X no topo de P. (Empilha) pop(p) - Função que remove o elemento do topo da pilha P devolvendo o valor do topo para a rotina que a chamou. (Desempilha) top(p) - Função que retorna uma cópia do elemento do topo de P, devolvendo o valor do topo da pilha P para a rotina que a chamou. (Copia) Operações auxiliares init(p) Procedimento que esvazia a Pilha P. (Inicia / Esvazia) isfull(p) Função que retorna um valor lógico informando se a pilha está cheia. Verdadeiro se estiver cheia ou Falso caso contrário. (Pilha cheia) isempty(p) Função que retorna um valor lógico informando se a pilha está vazia. Verdadeiro se estiver vazia ou Falso caso contrário. (Pilha vazia)

4 Exemplo de uso de pilhas Dado um número inteiro, positivo em base decimal, convertê-lo para binário. # include <stdio.h> # include <stdlib.h> # include "pilhas.h" (decimal) = 111 (binário) int main() { int n, r; tppilha p; printf("digite um inteiro positivo: "); scanf("%d", &n); init ( &p ); do { r = n % 2; push ( &p, r ); n = n/2; while (n!= ); printf("\n\ncorrespondente ao Binario => "); while ( isempty ( &p ) == ) { r = pop ( &p ); printf("%d", r); printf("\n\n\n"); system("pause"); return ; Pilhas no Controle de Variáveis e Sub-Rotinas 1 # include <stdio.h> 8 2 void A( ) { 3 int A1, A2; void B ( ) { 7 float B1, B2; A ( ); Pilha 1 Pilha 2 12 int main( ) { 13 int P1, P2; 14 A ( ); B( );

5 UNIVERSIDADE NOVE DE JULHO - UNINOVE Pesquisa e Ordenação 9 Revisão de Ponteiros Material disponível para download em: Alocação de Memória Da área de memória que é reservada ao programa, uma parte é usada para armazenar as instruções a serem executadas e a outra é destina ao armazenamento de dados. 1 Quem determina quanto de memória será usado para as instruções é o compilador. Alocar área para armazenamento de dados, entretanto, é responsabilidade do programador. Quando a quantidade de memória utilizada pelos dados é previamente conhecida e definida no próprio código-fonte do programa, trata-se de alocação estática. Quando o programa é capaz de criar novas variáveis durante sua execução, dizemos que a alocação é dinâmica.

6 Ponteiros 11 PONTEIRO é... uma variável especial que contém o endereço de memória de outra variável. variável que contém endereços de posições de memória alocadas na memória. VARIÁVEL PONTEIRO VARIÁVEL DINÂMICA endereço de memória de outra variável conteúdo do tipo que se deseja acessar ptr <sem nome> (endereço 1FFA) 1FFA 5 Ponteiros Comandos básicos < tipo de dado > *< identificador > ; Declara uma variável do tipo ponteiro. Pode haver um ponteiro (ou apontador) para qualquer tipo de variável. 12 (void*) malloc(tamanho em bytes); Aloca dinamicamente, durante a execução do programa, células de memória. Esta função devolve um ponteiro void que deve ser ser convertido para o tipo desejado. O tamanho em bytes pode ser determinado utilizando a função sizeof() que retorna o tamanh em bytes que um tipo de dados ocupa. Exemplo: int *ptr; ptr = ( int * ) malloc ( sizeof ( int ) ) ; free (ponteiro) Libera as células de memória alocadas dinamicamente. Exemplo free ( ptr ); Para manipulação de valores utilizando ponteiros temos dois operadores: O operador * devolve o valor contido no endereço apontado pela variável ponteiro; O operador & devolve o endereço de memória alocado de uma variável. Profa. Vânia Cristina de Souza Pereira 212 Material de Apoio Notas de Aula Estruturas de Dados TADS

7 Exemplo 13 # include < stdio.h > # include < stdlib.h > int main ( ) { int *x, *y; int a, b; a = 27; b = 43; x = &a; y = &b; printf ( "*x = %d x = %d \n", *x, x ) ; printf ( "*y = %d y = %d \n\n", *y, y ) ; *x = *y ; printf ( "*x = %d x = %d \n", *x, x ) ; printf ( "*y = %d y = %d \n\n", *y, y ) ; *x = 27; y = x ; printf ( "*x = %d x = %d \n", *x, x ) ; printf ( "*y = %d y = %d \n\n", *y, y ) ; system ( "pause" ) ; return ; Declaração das variáveis ponteiro Recebe o endereço de memória da variável a. Ex.: 4A9B Recebe o endereço de memória da variável b. Ex.: 4AAB atribui a informação que está no endereço 4AAB para o endereço 4A9B a variável y está apontada para o endereço de x 4A9B UNIVERSIDADE NOVE DE JULHO - UNINOVE 14 Pesquisa e Ordenação Revisão de Arquivos Material disponível para download em:

8 Arquivos Um arquivo é semelhante a um vetor, exceto por alguns motivos: o vetor fica armazenado na memória RAM; o arquivo fica armazenado em disco; o vetor deve ter um tamanho fixo, definido em sua declaração; o tamanho do arquivo pode variar durante a execução do programa. Os vetores são manipulados através de um índice de controle, enquanto os arquivos são manipulados por um ponteiro de registro. 15 As estruturas de dados tipo arquivo são apropriadas para organizar: grande quantidade de dados informações processadas por diversas aplicações informações que requisitam armazenamento permanente Vantagens e desvantagens no uso de arquivos Vantagem: Os dados não são perdidos entre uma execução e outra do programa. Desvantagem: O acesso a disco é muito mais lento do que o acesso à memória. Arquivos Tipos de arquivo 16 Tipo Texto Estão capacitados a armazenar palavras, frases e também dados numéricos. Os números, entretanto, serão armazenados como um caractere do tipo alfanumérico. Ao serem lidos de um arquivo e passados para a memória, os dados numéricos são convertidos para o seu formato original. Tipo Binário usa o sistema binário para armazenar tanto as informações numéricas, quanto as informações literais, através do código ASCII, compostos por uma sequencia de bytes. Arquivos textos são legíveis devido a forma que os dados foram gravados, mas consumem mais espaço para armazenamento e para acessar uma informação é necessário percorrer sequencialmente o arquivo tornando a busca lenta. Arquivos binários não são legíveis uma vez que os dados são gravados do mesmo modo que estão na memória e consomem menos espaço de memória para o armazenamento. O acesso a uma informação em um arquivo binário é pode ser direto tornando a busca mais rápida.

9 Tabela com modos de abertura de arquivos 17 Modo "r" "w" "a" "rb" "wb" "ab" "r+" "w+" "a+" "r+b" "w+b" Significado Abre um arquivo texto para leitura. O arquivo deve existir antes de ser aberto. Abrir um arquivo texto para gravação. Se o arquivo não existir, ele será criado. Se já existir, o conteúdo anterior será destruído. Abrir um arquivo texto para gravação. Os dados serão adicionados no fim do arquivo ("append"), se ele já existir, ou um novo arquivo será criado, no caso de arquivo não existente anteriormente. Abre um arquivo binário para leitura. Igual ao modo "r" anterior, só que o arquivo é binário. Cria um arquivo binário para escrita, como no modo "w" anterior, só que o arquivo é binário. Acrescenta dados binários no fim do arquivo, como no modo "a" anterior, só que o arquivo é binário. Abre um arquivo texto para leitura e gravação. O arquivo deve existir e pode ser modificado. Cria um arquivo texto para leitura e gravação. Se o arquivo existir, o conteúdo anterior será destruído. Se não existir, será criado. Abre um arquivo texto para gravação e leitura. Os dados serão adicionados no fim do arquivo se ele já existir, ou um novo arquivo será criado, no caso de arquivo não existente anteriormente. Abre um arquivo binário para leitura e escrita. O mesmo que "r+" acima, só que o arquivo é binário. Cria um arquivo binário para leitura e escrita. O mesmo que "w+" acima, só que o arquivo é binário. Acrescenta dados ou cria uma arquivo binário para leitura e escrita. O mesmo que "a+" acima, só que o arquivo é binário "a+b" Exemplo de manipulação de Arquivo Binário # include < stdio.h > # include < stdlib.h > # include < string.h > typedef struct { char nome [ 51 ] ; char ra [ 11 ] ; float nota ; int falta ; tplista ; 18 int main ( ) { tplista regchamada; FILE *arqchamada; arqchamada = fopen("alunos.dat", "a+b"); if (arqchamada == NULL) arqchamada = fopen("alunos.dat", "w+b"); if (arqchamada == NULL) { printf ( "\no arquivo não pode ser criado!\n\n" ) ; system ( "pause" ) ; exit ( 1 ) ; FILE fopen tipo de dado para uma variável ponteiro para um arquivo função para abrir um arquivo deve receber os parâmetros nome do arquivo e o modo de abertura

10 do { Exemplo system ( "cls" de ) ; manipulação de Arquivo Binário printf ( "Para encerrar digite '.' no campo Nome\n\n" ) ; printf ( "Nome... : " ) ; fflush ( stdin ) ; gets ( regchamada.nome ) ; if ( strcmp ( regchamada.nome, "." )!= ) { printf ( "Ra... : " ) ; fflush ( stdin ) ; gets ( regchamada.ra ) ; printf ( "Nota... : " ) ; scanf ( "%f", &regchamada.nota ) ; printf ( "Faltas.. : " ) ; scanf ( "%d", &regchamada.falta ) ; if ( fwrite ( &regchamada, sizeof ( tplista ), 1, arqchamada ) == NULL ) break; while ( strcmp ( regchamada.nome, "." )!= ) ; 19 fwrite - Função que grava os dados em um arquivo do tipo binário. - Deve receber quatro parâmetros: - variável que contém os dados a serem gravados; - número de bytes dos dados a serem gravados; - número de vezes que a gravação será executada; e - nome do arquivo onde os dados serão gravados. Exemplo de manipulação de Arquivo Binário system ( "cls" ) ; rewind ( arqchamada ) ; while ( 1 ) { fread ( &regchamada, sizeof ( tplista ), 1, arqchamada ) ; if ( feof ( arqchamada ) ) break ; printf ( "Ra...: %s\n", regchamada.ra ) ; printf ( "Nome..: %s\n", regchamada.nome ) ; printf ( "Nota..: %.1f\n", regchamada.nota ) ; printf ( "Faltas: %d\n\n", regchamada.falta ) ; fclose ( arqchamada ) ; system ( "pause" ) ; return ; 2 rewind fread feof fclose recoloca o leitor de posição no início do arquivo. lê os dados de um arquivo do tipo binário. Deve receber 4 parâmetros: - variável que receberá os dados lidos; - número de bytes dos dados que serão lidos; - número de vezes que a leitura será executada; e - nome do arquivo onde os dados estão gravados. informa se o final do arquivo foi atingido ou não, retornando ou 1 para F ou V fecha um arquivo aberto com a função fopen

11 Exemplo de manipulação de Arquivo Texto 21 #include < stdio.h > #include < conio.h > #include < stdlib.h > #include < string.h > int main ( ) { FILE *arq ; char nome [ 3 ] ; int idade, cont = ; float altura ; arq = fopen ( "dados.txt", "w" ) ; if ( arq == NULL ) { printf ( "\nerro na criação do arquivo dados.txt" ) ; getch ( ) ; exit ( 1 ) ; Exemplo de manipulação de Arquivo Texto 22 for ( ; ; ) { system ( "cls" ) ; printf ( "Nome (. para finalizar): " ) ; fflush ( stdin ) ; gets ( nome ) ; if ( strcmp ( nome, "." ) == ) break ; printf ( "Idade: " ) ; scanf ( "%i", &idade ) ; printf ( "Altura: ) ; scanf ( "%f", &altura ) ; fprintf ( arq, "%s %i %.2f \n", nome, idade, altura ) ; fclose ( arq ) ;

12 Exemplo de manipulação de Arquivo Texto printf ( "\nabertura e leitura do arquivo gravado\n" ) ; arq = fopen ( "dados.txt", "r" ) ; if ( arq == NULL ) { printf ( "\nerro na abertura do arquivo dados.dat" ) ; getch ( ) ; exit ( 1 ) ; while (!feof ( arq ) ) { fscanf ( arq, "%s %i %f \n", nome, &idade, &altura ) ; printf ( "\n Nome = %s Idade = %i Altura = %.2f", nome, idade, altura ) ; ++cont ; fclose ( arq ) ; printf ( "\n\narquivo com %d registros. Fechando o arquivo.\n", cont ) ; getch ( ) ; return ; 23 UNIVERSIDADE NOVE DE JULHO - UNINOVE Pesquisa e Ordenação 24 Recursão Material disponível para download em:

13 Recursão Trata-se de uma subrotina que chama a si mesma, porém, como todo algoritmo deve ser finito, isto é, deve terminar após ter executado uma quantidade finita de passos. 25 Uma imagem recursiva Exemplos: Ler um livro: (a) Ler uma página (b) Ler uma página e Ler o resto do livro. Examinar lista: (a) Examinar um elemento (b) Examinar um elemento e Examinar lista restante. Uma Imagem Recursiva Recursão Para garantir que uma chamada recursiva não criará um looping que será executado infinitamente, é necessário que ela esteja condicionada a uma expressão lógica que, em algum instante, torna-se-á falsa e permitirá que a recursão termine. 26 # include <stdio.h> # include <stdlib.h> int main ( ) { int num, fat; fat = 1; printf ( "Digite um numero => " ) ; scanf ( "%d", &num ) ; while ( num > ) { fat = fat * num; num - - ; printf ( "\n\nfatorial = %d.\n\n", fat ); system ( "pause" ) ; return ; # include <stdio.h> # include <stdlib.h> int fat ( int n ) { if ( n == ) return 1; else return ( n * fat ( n-1 ) ) ; int main ( ) { int num; printf ( "Digite um numero => " ) ; scanf ( "%d", &num ) ; printf ( "\n\nfatorial = %d.\n\n", fat ( num ) ); system ( "pause ) ; return ;

14 Recursão 27 Invocações geradas e valores retornados para o cálculo de fat ( 5 ). Fatorial é o produto dos números naturais desde 1 até o inteiro N. Por definição! = 1. Exemplo : 5! = 5 * 4 * 3 * 2 * 1 5! = 12. 5! = 5 * 4! 4! = 4 * 3! 3! = 3 * 2! 2! = 2 * 1! 1! = 1 *! int fat ( int n ) { if ( n == ) return 1; else return ( n * fat ( n-1 ) ) ; Fat (5) 5 * fat (4) 5 * Fat (4) 4 * fat (3) 4 * 6 24 Fat (3) 3 * fat (2) 3 * 2 6 Fat (2) 2 * fat (1) 2 * 1 2 Fat (1) 1 * fat () 1 * 1 1 Fat () 1 Quando aplicar recursão? É preciso analisar o problema e verificar se realmente vale a pena encontrar uma solução recursiva. 28 A decisão de usá-la ou não deverá ser tomada após a comparação das possíveis soluções recursiva e iterativa. Se bem utilizada, pode tornar o algoritmo claro, simples e conciso. Embora a recursão seja uma ferramenta bastante interessante para resolução de problemas, nem sempre ela poderá ser empregada, pois a solução mais eficiente é através do modo iterativo.

15 Exemplo de uso de recursão - MDC MDC Máximo Divisor Comum O primeiro tem que ser maior que o segundo; Dividir o primeiro pelo segundo; O segundo passa a ser o primeiro e o segundo será o resto da divisão; Quando o segundo for igual a zero o primeiro será o MDC. 29 # include <stdio.h> # include <stdlib.h> int mdc ( int p, int s ); int main ( ) { int x, y ; printf ( "Digite o 1o. numero => " ) ; scanf ( "%d", &x ) ; printf ( "\ndigite o 2o. numero => ) ; scanf ( "%d", &y ) ; printf ( "\n\nmdc = %d\n\n", mdc ( x, y ) ) ; system ( "pause" ) ; return ; int mdc ( int p, int s ) { if ( s > p ) return ( mdc ( s, p ) ); else if ( s == ) return ( p ); else return ( mdc ( s, p % s ) ); Exercícios: Recursão ) Escrever uma função recursiva chamada Potencia que receberá os parâmetros X e Y (argumentos inteiros e positivos), retornando o resultado, usando a seguinte definição: Potencia retorna X, se Y=1 ou Potencia retorna X * Potencia(X,Y-1). 2) Qual será o valor impresso após a execução do programa abaixo? # include <stdio.h> # include <stdlib.h> int f_rec ( int x, int y ) { if (x == ) return ( y ); else return ( f_rec ( x-1, y+1 ) ); int main( ) { int x, y, k; x = 7; y = 1; k = f_rec ( x, y ); printf("resultado => %d\n\n", k); system("pause"); return ; 3) Escreva uma função void recursiva que receba um número inteiro positivo n, e exiba na tela os números Profa. Vânia inteiros Cristina entre de Souza n e Pereira, inclusive. 212 Material Exemplo de Apoio n = 5 Notas será de Aula exibido Pesquisa 5 e Ordenação CC

16 Exercícios: Recursão - 2 4) Considerando a função a seguir, a chamada p(5) causa: 31 void p ( int n ) { if ( n!= ) { p ( n 2 ) ; printf("%d", n ) ; a) Apenas a exibição dos números 1, 3 e 5 nessa ordem b) A exibição dos números 1, 3 e 5 nessa ordem, seguido de erro de estouro de pilha c) Apenas a exibição dos números 5, 3 e 1 nessa ordem d) A exibição dos números 5, 3 e 1 nessa ordem, seguido de erro de estouro de pilha e) Apenas erro de estouro de pilha 5) Faça uma função recursiva para achar um elemento num vetor. A função deve retornar o índice do elemento no vetor ou -1 caso ele não exista. Exercícios: Recursão - 3 6) Qual será o valor impresso após a execução do programa ao lado? 32 # include <stdio.h> # include <stdlib.h> int x =, a; int rec ( int n, int i ); int main( ) { a = rec (5,2); printf("resultado = %d\n\n",a); system("pause"); return ; int rec ( int n, int i ) { if ( i > 9 ) return ( x ); else { x = n + i ; return ( rec ( n, i + 1 ) );

17 Exercícios: Recursão ) O que será impresso após a execução do programa abaixo, sabendo que x = arara? # include <stdio.h> # include <stdlib.h> # include <string.h> int pal(char a[6], int ini, int fim); int main( ) { char x[6]; int i, f, result; gets(x); i = ; f = strlen(x)-1; result = pal(x, i, f); if (result) printf("verdadeiro\n\n"); else printf("falso\n\n"); system("pause"); return ; int pal(char a[6], int ini, int fim) { if (a[ini] == a[fim]) if (ini == fim) return 1; else else return pal(a, ++ini, --fim); return ; UNIVERSIDADE NOVE DE JULHO - UNINOVE Pesquisa e Ordenação 34 Quick Sort Material disponível para download em:

18 Quick Sort É um método dos mais utilizados para ordenação de valores e de forma geral um dos mais eficientes. 35 Trata de um método de ordenação baseado no conceito da Divisão e Conquista e também em trocas (como na ordenação bubble sort ). Para a ordenação dos dados primeiramente o vetor deve ser dividido em tres partes onde: Uma parte deve conter apenas um elemento identificado como pivô. Uma parte deve conter todos os elementos com valores menores ou iguais ao pivo. Todos estes valores devem estar antes do índice que contém o valor do pivô. Uma parte deve conter todos os elementos com valores maiores ao pivô. Todos estes valores devem estar depois do índice que contém o valor do pivô. Atendidos os requisitos acima aplica-se recursivamente a técnica em cada um dos subvetores, enquanto a quantidade de elementos for maior ou igual a dois. Quick Sort Escolha do pivô pode feita aleatóriamente ou o elemento do meio do vetor. 36 A partir da escolha do pivô inicia-se as comparações entre os valores da seguinte forma: Comparar v[], v[1],... até encontrar um elemento v[a] > pivô; Comparar, a partir do final do vetor, os elementos v[n-1],v[n-2],... Até encontrar v[b]<=pivô. Uma vez encontrados os valores trocar v[a] com v[b] Retomar a busca, para cima a partir de v[a+1], e para baixo, a partir de v[b-1]; Terminar o processo de busca, quando os valores de a e b se inverterem, sendo que o valor do pivô estará em sua posição correta em relação aos valores da vetor conforme as regras descritas no slide anterior.

19 Quick Sort 37 void quick(int v[max], int inicio, int fim) { int baixo, alto, meio, pivo, k; baixo = inicio; alto = fim; meio = (int) ((baixo + alto) / 2); pivo = v[meio]; while (baixo <= alto) { while (v[baixo] < pivo) baixo++; while (v[alto] > pivo) alto--; if (baixo < alto) { k = v[baixo]; v[baixo++] = v[alto]; v[alto--] = k; else if ( baixo == alto ) { baixo++; alto--; if(alto > inicio) quick(v, inicio, alto); if(baixo < fim) quick(v, baixo, fim); Quick Sort 38 baixo alto meio v[] v[1] v[2] v[3] v[4] v[5] v[6] v[7] v[8] v[9] > 31 e 11 < 31, então trocar 41 e > 31 e 13 < 31, então trocar 93 e > 31 e 31 = 31, então trocar 95 e = 21 e 13 < 21, então trocar 21 e > 45 e 41 < 45, então trocar 95 e = 95 e 85 < 95, então trocar 95 e = 93 e 85 < 93, então trocar 93 e

20 # include <stdio.h> void quick ( int v [ MAX ], int inicio, int fim ) { # include <stdlib.h> int baixo, alto, meio, pivo, k; # define MAX 8 baixo = inicio; alto = fim; void quick ( int v [ MAX ], int inicio, int fim ); meio = ( int ) ( ( baixo + alto ) / 2 ); pivo = v [ meio ]; int main ( ) { while ( baixo <= alto ) { int vetor [ MAX ] = { 12, 1, 56, 16, 8, 19, 23, 49 ; while ( v [ baixo ] < pivo ) int i; baixo ++; printf ( "Vetor Desordenado:\n" ); while ( v [ alto ] > pivo ) for ( i = ; i < MAX; i++ ) alto --; printf ( "%d ", vetor [ i ] ); if ( baixo <= alto ) { printf ( "\n\n" ); k = v [ baixo ]; quick ( vetor,, MAX 1 ); v [ baixo ++ ] = v [ alto ]; printf ( "\n\nvetor Ordenado:\n" ); v [ alto -- ] = k; for ( i = ; i < MAX; i++ ) printf ( "%d ", vetor [ i ] ); else printf ( "\n\n" ); if ( baixo == alto ) { system ( "pause" ); baixo ++; return ; alto --; if ( alto > inicio ) quick ( v, inicio, alto ); if ( baixo < fim ) quick ( v, baixo, fim ); Exemplo 1 39 # include <stdio.h> void quick ( char v [ MAX ] [ 15 ], int inicio, int fim ){ # include <stdlib.h> int baixo, alto, meio; # include <string.h> char k [ 15 ], pivo [ 15 ]; # define MAX 8 baixo = inicio; void quick ( char v[max][15], int inicio, int fim ); alto = fim; meio = ( int ) ( ( baixo + alto ) / 2 ); int main( ){ strcpy ( pivo, v [ meio ] ); char vetor[ MAX ] [ 15 ] = {"Lucas", "Mariano", while ( baixo <= alto ) { "Alberto", "Douglas", "Leonardo", "Mateus", "Flavio", while ( strcmp ( v [ baixo ], pivo ) < ) "Luiz"; baixo ++; int i; while ( strcmp ( v [ alto ], pivo ) > ) printf ( "Vetor Desordenado:\n" ); alto --; for ( i = ; i < MAX; i++ ) if ( baixo <= alto ) { printf ( "%s\n", vetor [ i ] ); strcpy ( k, v [ baixo ] ); printf ( "\n\n" ); strcpy ( v [ baixo ++ ], v [ alto ] ); system ( "pause" ); strcpy ( v [ alto -- ], k ); quick ( vetor,, MAX-1 ); system ( "cls" ); else printf ( "Vetor Ordenado:\n" ); if ( baixo == alto ) { for ( i = ; i < MAX; i++ ) baixo ++; printf ( "%s\n", vetor[i] ); alto --; printf ( "\n\n" ); system ( "pause" ); return ; if ( alto > inicio ) quick ( v, inicio, alto ); if ( baixo < fim ) quick ( v, baixo, fim ); Exemplo 2 4

21 UNIVERSIDADE NOVE DE JULHO - UNINOVE Pesquisa e Ordenação 41 Listas encadeadas Material disponível para download em: Alocação de Memória Antes de abordarmos listas encadeadas vamos relembrar os conceitos de alocação de memória e ponteiros. 42 Da área de memória que é reservada ao programa, uma parte é usada para armazenar as instruções a serem executadas e a outra é destina ao armazenamento de dados. Quem determina quanto de memória será usado para as instruções é o compilador. Alocar área para armazenamento de dados, entretanto, é responsabilidade do programador. Quando a quantidade de memória utilizada pelos dados é previamente conhecida e definida no próprio código-fonte do programa, trata-se de alocação estática. Quando o programa é capaz de criar novas variáveis durante sua execução, dizemos que a alocação é dinâmica.

22 Ponteiros 43 PONTEIRO é... uma variável especial que contém o endereço de memória de outra variável. variável que contém endereços de posições de memória alocadas na memória. VARIÁVEL PONTEIRO VARIÁVEL DINÂMICA endereço de memória de outra variável conteúdo do tipo que se deseja acessar ptr <sem nome> (endereço 1FFA) 1FFA 5 Ponteiros Comandos básicos < tipo de dado > *< identificador > ; Declara uma variável do tipo ponteiro. Pode haver um ponteiro (ou apontador) para qualquer tipo de variável. 44 (void*) malloc(tamanho em bytes); Aloca dinamicamente, durante a execução do programa, células de memória. Esta função devolve um ponteiro void que deve ser ser convertido para o tipo desejado. O tamanho em bytes pode ser determinado utilizando a função sizeof() que retorna o tamanh em bytes que um tipo de dados ocupa. Exemplo: int *ptr; ptr = ( int * ) malloc ( sizeof ( int ) ) ; free (ponteiro) Libera as células de memória alocadas dinamicamente. Exemplo free ( ptr ); Para manipulação de valores utilizando ponteiros temos dois operadores: O operador * devolve o valor contido no endereço apontado pela variável ponteiro; O operador & devolve o endereço de memória alocado de uma variável.

23 Exemplo 45 # include <stdio.h> # include <stdlib.h> # include <string.h> int main ( ) { int *x, *y; x = ( int * ) malloc ( sizeof ( int ) ) ; y = ( int * ) malloc ( sizeof ( int ) ) ; *x = 27 ; *y = 43 ; printf ( "Valor: %d - %d \n\n", *x, *y ) ; *x = *y ; printf ( "Valor: %d - %d \n\n", *x, *y ) ; *x = 27 ; y = x ; printf ( "Valor: %d - %d \n\n", *x, *y ) ; free ( x ) ; system ( "pause" ) ; return ; # include <stdio.h> # include <stdlib.h> int main ( ) { int * x, * y ; int a, b ; a = 27 ; b = 43 ; x = &a ; y = &b ; printf ( "Valor: %d - %d \n\n", *x, *y ) ; *x = *y ; printf ( "Valor: %d - %d \n\n", *x, *y ) ; *x = 27 ; y = x ; printf ( "Valor: %d - %d \n\n", *x, *y ) ; system ( "pause") ; return ; Exemplo 46 # include <stdio.h> # include <stdlib.h> # include <string.h> int main ( ) { char *x, *y; x = ( char * ) malloc ( 12 * sizeof ( char ) ) ; y = ( char * ) malloc ( 12 * sizeof ( char ) ) ; strcpy ( x, "Estruturas" ) ; strcpy ( y, "de Dados" ) ; printf ( "%s %s\n\n", x, y ) ; strcpy ( y, x ) ; printf ( "%s %s\n\n", x, y ) ; strcpy ( y, "de Dados" ) ; printf ( "%s %s\n\n", x, y ); x = y ; printf ( "%s %s\n\n", x, y ) ; free( x ) ; system ( "pause" ) ; return ;

24 Exercícios: Ponteiros - 1 Codifique um programa que contenha uma variável ponteiro que aponte para um vetor de 5 elementos do tipo inteiro, insira dados neste vetor e mostre os mesmos. 47 Codifique um programa que contenha um vetor de 5 elementos do tipo ponteiro para um char, insira dados neste vetor e mostre os mesmos. Exercícios: Ponteiros - 2 O que será impresso após a execução do programa abaixo? # include <stdio.h> # include <stdlib.h> # include <string.h> int main ( ) { int *p1, *p2, p3 ; char *x1, *x2, x3 [ 7 ] ; p1 = ( int * ) malloc ( sizeof ( int ) ) ; p2 = ( int * ) malloc ( sizeof ( int ) ) ; x1 = ( char * ) malloc ( 7 * sizeof ( char ) ) ; x2 = ( char * ) malloc ( 7 * sizeof ( char ) ) ; *p1 = 7 ; strcpy ( x1,"teste" ) ; *p2 = 15 ; strcpy ( x2, "aula" ) ; p3 = 11 ; strcpy ( x3, "prova" ) ; p1 = p2 ; p2 = &p3 ; strcpy ( x2, x3 ) ; strcpy ( x1, x3 ) ; printf ( "%d \n", *p1 ) ; printf ( "%d \n", *p2 ) ; printf ( "%d \n", p3 ) ; printf ( "%s \n", x1 ) ; printf ( "%s \n", x2 ) ; printf ( "%s \n", x3 ) ; system ( "pause" ) ; return ; 48

25 Listas Encadeadas Por meio de ponteiros podemos alocar espaço para uma informação na memória e liberar este mesmo espaço quando não for mais necessário. 49 Quando precisamos guardar várias informações na memória, independente da quantidade, podemos utilizar uma estrutura conhecida como Lista Encadeada. Uma lista encadeada é uma sequência de informação armazenadas em algum lugar da memória, sendo que as mesmas estão ligadas entre si por um endereço (pointer). Um lista encadeada é criada a partir da estrutura de um registro (estrutura STRUCT). Estrutura de uma lista encadeada A estrutura mais básica deste registro conterá dois tipos de campos: O primeiro tipo serão os campos utilizados para armazenar as informações propriamente ditas e O segundo tipo será um campo do tipo ponteiro que irá armazenar o endereço da próxima informação existente na memória. Início 5 nome idade sexo proximo nome idade sexo proximo nome idade sexo proximo Para declarar a estrutura de uma lista encadeada devemos criar um tipo struct como por exemplo: struct reg { char nome[51]; int idade; char sexo; struct reg *proximo; tplista;

26 Exemplo de Lista Encadeada Declarações iniciais #include <stdio.h> #include <stdlib.h> 51 typedef char tpelem ; typedef struct registro { tpelem dado ; struct registro *prox ; tplista ; void insere ( tplista *noatual, tpelem x ) ; void mostra ( tplista *noatual ) ; tplista* procura(tplista *noatual, tpelem x) ; int retira ( tplista *noatual, tpelem x ) ; void esvazia( tplista *noatual ) ; tplista *lista = NULL ; Exemplo de Lista Encadeada função main( ) 52 int main( ) { fflush( stdin ) ; tpelem valor ; printf( "Dado a ser retirado: " ) ; scanf( "%c", &valor ) ; insere( lista, 'b' ) ; insere( lista, 'd' ) ; if ( retira ( lista, valor ) == ) insere( lista, 'c' ) ; printf( " Nao encontrado...\n\n\n" ) ; insere( lista, 'a' ) ; else printf( " Valor retirado...\n\n\n" ) ; mostra( lista ) ; mostra( lista ) ; printf( "\n\ndado a ser procurado: " ) ; scanf( "%c", &valor ) ; esvazia( lista ) ; if ( procura ( lista, valor ) == NULL ) printf( " Nao achou...\n\n" ) ; else printf( " Achou...\n\n" ) ; printf( "\n\n\n" ) ; system( "pause" ) ; return ;

27 Exemplo de Lista Encadeada função insere( ) void insere ( tplista *noatual, tpelem x ){ tplista *novono ; if ( noatual == NULL ) { lista=( tplista * ) malloc( sizeof( tplista )); lista->dado = x ; lista->prox = NULL ; else { while( noatual->prox!= NULL ) noatual = noatual->prox ; novono=(tplista *) malloc(sizeof(tplista)); novono->dado = x ; novono->prox = NULL ; noatual->prox = novono ; 53 Exemplo de Lista Encadeada função mostra( ) void mostra ( tplista *noatual ) { printf( "Valores atuais na lista => " ) ; while( noatual!= NULL ) { printf( "%c ",noatual->dado ) ; noatual = noatual->prox ; 54

28 Exemplo de Lista Encadeada função procura( ) tplista* procura(tplista *noatual, tpelem x) { while ( noatual!= NULL ) { if ( x == noatual->dado ) return noatual ; else noatual = noatual->prox ; return NULL ; 55 Exemplo de Lista Encadeada função retira( ) 56 int retira ( tplista *noatual, tpelem x ) { while ( noatual->prox!= NULL ){ tplista *libera ; if ( x == noatual->prox->dado ) { if ( noatual == NULL ) libera = noatual->prox ; return ; noatual->prox = libera->prox ; else free( libera ) ; if ( x == noatual->dado ) { return 1 ; libera = noatual ; lista = noatual->prox ; else free( libera ) ; noatual = noatual->prox ; return 1 ; else { return ;

29 Exemplo de Lista Encadeada função esvazia( ) void esvazia( tplista *noatual ) { while ( noatual!= NULL ) { lista = noatual->prox ; free( noatual ) ; noatual = lista ; 57 Lista duplamente encadeada A lista duplamente encadeada, é baseada em um registro (struct) contendo dois campos do tipo ponteiro e os campos que armazenarão os dados. 58 Cada nó da lista deve estar ligado a seu antecessor e a seu sucessor, ou seja, cada nó tem um ponteiro para o nó anterior e um ponteiro para o próximo nó. Assim é possível percorrer a lista do início ao fim e vice-versa. inicio anterior nome idade sexo proximo anterior nome idade sexo proximo anterior nome idade sexo proximo

30 Lista Duplamente Encadeada Declarações iniciais typedef char tpelem ; typedef struct registro { tpelem dado ; struct registro *ant ; struct registro *prox ; tplista ; 59 void insere ( tplista *noatual, tpelem x ) ; void mostra ( tplista *noatual ) ; tplista* procura(tplista *noatual, tpelem x) ; int retira ( tplista *noatual, tpelem x ) ; void esvazia( tplista *noatual ) ; tplista *lista = NULL ; Lista Duplamente Encadeada função main() int main( ) { tpelem valor, resposta ; insere( lista, 'a' ) ; insere( lista, 'b' ) ; insere( lista, 'c' ) ; insere( lista, 'd' ) ; insere( lista, 'e' ) ; insere( lista, 'f' ) ; insere( lista, 'g' ) ; insere( lista, 'h' ) ; mostra( lista ) ; printf( "\n\ndado a ser procurado: " ) ; fflush(stdin); scanf( "%c", &valor ) ; if ( procura ( lista, valor ) == NULL ) printf( "* * * Nao achou * * *\n\n" ) ; else printf( "* * * Achou * * *\n\n" ) ; fflush( stdin ) ; printf( "Dado a ser retirado: " ) ; scanf( "%c", &valor ) ; if ( retira ( lista, valor ) == ) printf( "* * * Nao encontrado * * *\n\n\n" ) ; else printf( "* * * Valor retirado * * *\n\n\n" ) ; mostra( lista ) ; esvazia( lista ) ; system( "pause" ) ; return ; 6

31 Lista Duplamente Encadeada função insere() void insere ( tplista *noatual, tpelem x ){ tplista *novono ; novono=(tplista *) malloc(sizeof(tplista)); novono->dado = x ; if ( noatual == NULL ) { lista = novono; lista->ant = NULL ; lista->prox = NULL; else { while( noatual->prox!= NULL ) noatual = noatual->prox ; novono->ant = noatual; novono->prox = NULL ; noatual->prox = novono ; 61 Lista Duplamente Encadeada função procura() tplista* procura(tplista *noatual, tpelem x){ while ( noatual!= NULL ) { if ( x == noatual->dado ) return noatual ; else noatual = noatual->prox ; return NULL ; 62

32 Lista Duplamente Encadeada função mostra() void mostra ( tplista *noatual ){ tplista *noant; printf( "Sequencia normal ====> " ) ; while( noatual!= NULL ){ printf( " %c ",noatual->dado ) ; noant = noatual->ant; noatual = noatual->prox ; printf( "\nsequencia invertida => " ) ; while (noant!= NULL) { printf( " %c ",noant->prox->dado ) ; noant = noant->ant; printf( " %c ",lista->dado ) ; 63 Lista Duplamente Encadeada função retira() int retira ( tplista *noatual, tpelem x ){ tplista *libera ; if ( noatual == NULL ) return ; else if ( x == noatual->dado ){ libera = noatual ; lista = noatual->prox ; lista -> ant = NULL; free( libera ) ; return 1 ; else{ while ( noatual->prox!= NULL ){ if ( x == noatual->prox->dado ) { libera = noatual->prox ; noatual->prox = libera->prox ; if (libera->prox!= NULL) libera->prox->ant = libera->ant; free( libera ) ; return 1 ; else noatual = noatual->prox ; return ; 64

33 Lista Duplamente Encadeada função esvazia() void esvazia( tplista *noatual ){ while ( noatual!= NULL ){ lista = noatual->prox ; free( noatual ) ; noatual = lista ; 65 UNIVERSIDADE NOVE DE JULHO - UNINOVE Pesquisa e Ordenação 66 Árvores Material disponível para download em:

34 Introdução Listas encadeadas, Filas e Pilhas, têm como base as listas lineares, podendo ser estáticas ou dinâmicas. Mesmo tendo uma série de aplicações na manipulação de dados alguns problemas são observados: A lista sequencial é eficiente para pesquisa de dados, mas não apresenta bom desempenho para inserir e remover dados; 67 A lista encadeada é eficiente para inserir e remover dinamicamente de dados, mas não apresenta bom desempenho para pesquisar dados. A estrutura de dados Árvore é uma lista não linear com desempenho mais eficiente para as operações de inserção, busca e remoção de dados, pois representam um conceito de hierarquias. Exemplo de uma árvore de estados brasileiros 68 Paraíba Pará Bahia Alagoas Amapá Goiás Paraná Maranhão Ceará Amazonas Piauí Roraima Rondônia Acre Sergipe

35 Raiz e Subárvores 69 Uma árvore é composta por um conjunto de nós. Uma árvore contém um nó inicial identificado por raiz, podendo ter ou não outros nós, chamados de subárvores. Usualmente uma árvore é representada graficamente com a raiz para cima. Raiz Paraíba Pará Bahia Alagoas Amapá Goiás Paraná Maranhão Ceará Amazonas Piauí Roraima Rondônia Subárvores Acre Sergipe Subárvores 7 Uma árvore é um conjunto finito de um ou mais nós de tal modo que os conjuntos de nós desdobrados a partir da raiz são chamados de subárvores. Seguindo o conceito acima, uma subárvore também é uma árvore e assim sucessivamente. Subárvore Paraíba Subárvore Pará Bahia Alagoas Raiz Amapá Goiás Paraná Maranhão Ceará Subárvore Amazonas Piauí Roraima Rondônia Acre Sergipe

36 Nós Pai, Filhos, Irmãos e Folhas 71 A raiz de uma árvore é chamada de pai dos nós de suas subárvores. As raízes das subárvores de um nó pai são chamados de filhos deste nó. Os filhos de um mesmo nó pai são denominados irmãos. Duas regras a respeito de pais: A raiz não tem pai. Todos os outros nós têm somente um pai. PAI Paraíba Um nó que não tem filho é chamado de folha. IRMÃOS Pará Bahia Alagoas FILHOS Amapá Goiás Paraná Maranhão Ceará Amazonas Piauí Roraima Rondônia Acre Sergipe Nós Pai, Filhos, Irmãos e Folhas 72 Nó Pai Paraíba Nós Filhos Pará, Bahia, Alagoas Paraíba Pará Amapá, Goiás Bahia - Pará Bahia Alagoas Alagoas Paraná, Maranhão, Ceará Amapá Amazonas, Piauí, Roraima, Rondônia Amapá Goiás Paraná Maranhão Ceará Goiás - Paraná - Amazonas Piauí Roraima Rondônia Acre Sergipe Maranhão Acre, Sergipe Ceará - Amazonas - Piauí - Roraima - Rondônia - Acre - Irmãos Pará, Bahia, Alagoas Amapá, Goiás Paraná, Maranhão, Ceará Amazonas, Piauí, Roraima, Rondônia Acre, Sergipe Sergipe - Folhas Bahia Goiás, Paraná, Ceará Amazonas, Piauí, Roraima, Rondônia, Acre, Sergipe

37 Grau de um nó e Grau de uma árvore Grau de um nó corresponde ao número de subárvores do próprio nó, ou seja a quantidade de filhos que este nó tem. Um nó folha tem grau, visto que mão tem filhos. 73 O grau da árvore é definido pelo nó, de maior grau, que ela possui. GRAU DA ÁRVORE: 4 Paraíba Pará Pará grau 2 Bahia Alagoas Amapá Amapá grau 4 Goiás Paraná Maranhão Ceará Amazonas Piauí Roraima Rondônia Acre grau Acre Sergipe Nível de um nó 74 Nível ou profundidade de um nó é definido a partir da raiz da árvore que é identificado por zero. Os níveis seguintes são definidos com base na soma de uma unidade ao nível do seu nó pai. Nível Paraíba Nível 1 Pará Bahia Alagoas Nível 2 Amapá Goiás Paraná Maranhão Ceará Nível 3 Amazonas Piauí Roraima Rondônia Acre Sergipe

38 Altura de um nó e Altura uma árvore A altura de um determinado nó em uma árvore é a distância entre o nó e o seu descendente mais afastado, ou seja, o caminho desde o nó até o descendente mais distante. Um nó folha, consequentemente tem altura A altura ou profundidade de uma árvore é definida com base no nível máximo entre todos os nós da árvore, ou seja, é a altura da raiz 75 ALTURA DA ÁRVORE: 3 Paraíba Pará Bahia Alagoas Amapá Goiás Paraná Maranhão Ceará Amazonas Piauí Roraima Rondônia Acre Sergipe Nó Altura Paraíba 3 Pará, Alagoas 2 Amapá, Maranhão 1 Bahia, Goiás, Paraná, Ceará, Amazonas, Piauí, Roraima, Rondônia, Acre, Sergipe Floresta Quando eliminamos um nó raiz de uma árvores, as suas subárvores formam duas árvores disjuntas, ou sejam árvores separadas. 76 A este conjunto de árvores disjuntas damos o nome de floresta. Por exemplo, se eliminarmos o nó raiz da árvore de bandeiras dos estados brasileiros, teremos uma Floresta formada por três árvores disjuntas. Pará Bahia Alagoas Amapá Goiás Paraná Maranhão Ceará Amazonas Piauí Roraima Rondônia Acre Sergipe

39 Formas de representação: Hierárquica 77 Paraíba Pará Bahia Alagoas Amapá Goiás Paraná Maranhão Ceará Amazonas Piauí Roraima Rondônia Acre Sergipe Formas de representação: Diagrama de Inclusão 78 Também conhecido como Diagrama de Venn ou Conjuntos aninhados Paraíba Pará Bahia Alagoas Goiás Paraná Ceará Amapá Maranhão Amazonas Piauí Acre Roraima Rondônia Sergipe

40 Formas de representação: Parenteses aninhados 79 ( Paraíba ( Pará ( Amapá ) ( Goiás ( Piauí ) ) ) ( Bahia ) ( Alagoas ( Ceará ( Acre ) ( Sergipe ) ) ) ) Paraíba Pará Bahia Alagoas Amapá Goiás Ceará Piauí Acre Sergipe Árvores: Exercícios Observe a árvore abaixo, representada na forma hierárquica, e responda: a) qual a altura da árvore? b) quantos nós folhas a árvore possui? c) em qual nível está o nó que contem a letra Q? d) qual o grau do nó que contém a letra E? e) os nós que contém as letras H, L, R, Q, S e G são todos irmãos? Justifique sua resposta. A 8 B U D E Y M H L R Q S G J P I F T C

41 Árvores: Exercícios Observe a árvore abaixo, representada na forma de parênteses aninhados, monte a árvore na forma de representação hierárquica e responda: a) quais os nós folha? b) o grau da árvore? c) quais os filhos do nó que contém a letra C? 81 ( A (B) ( C (D (G) (H)) (E) (F (I)) ) ) Árvores: Exercícios Observe a árvore abaixo, representada na forma hierárquica, e monte o diagrama de inclusão 82 F B G I J A D I H C E G I

42 Árvore Binária 83 O que caracteriza uma árvore como ÁRVORE BINÁRIA são as suas conexões com os outros nós. Para cada nó, uma árvore binária é permitido no máximo duas subárvores. Alguns nós possuem apenas uma subárvores. Em uma árvore binária é necessário sempre distinguir a subárvore esquerda e direita. As definições quanto a raiz, pai, filho, irmãos, folhas, grau, nível e altura, são as mesmas já vistas. Paraíba Pará Alagoas Amapá Goiás Ceará Piauí Acre Sergipe Árvore Binária Cheia 84 Consideramos uma árvore binária cheia se todos os nós tiverem duas subárvores, exceto os nós folhas, que estarão na mesma altura. Paraíba Pará Alagoas Amapá Goiás Paraná Ceará Amazonas Roraima Rondônia Piauí Acre Sergipe Maranhão Bahia

43 Árvores de Busca Binária Árvore binária, é denominada ÁRVORE DE BUSCA BINÁRIA se: Todos os elementos armazenados na subárvore esquerda são menores que do que o elemento armazenado na raiz; Todos os elementos armazenados na subárvore direita são iguais ou maiores que do que o elemento armazenado na raiz. As subárvores esquerda e direita também são árvores de busca binária. 85 Maranhão Amazonas Paraná Alagoas Ceará Pará Roraima Acre Amapá Bahia Goiás Paraíba Rondônia Sergipe Piauí Árvore de Busca Binária - Exercício Assinale quais são as árvores de busca binária a) F b) I 86 B G B O A C H I A D M R S J E C c) F d) 5 B J 2 6 A D H C E G I

44 Árvore de Busca Binária - Exercício 87 Analise os dados representados pelo diagrama de inclusão, construa a representação na forma hierárquica e para casa árvore responda: a) Qual a altura da árvore?; b) Quantos nós tem cada nível?; c) Qual a raiz da árvore? ; d) É uma árvore binária?; e) Se for uma árvore binária: É uma árvore cheia?; É uma árvore de busca binária? Obs. Considere a disposição de cada nó na representação gráfica como sendo filho esquerdo ou direito. A D a) B C F E B D b) A C G E F c) Profa. Vânia Cristina de Souza Pereira Material de Apoio ao Aluno - Notas de Aula Pesquisa e Ordenação Atravessamento em Árvores de Busca Binária Uma vez criada uma árvore, como fazer para percorrer todos os seus nós? Que critérios usar? Ir inicialmente para a esquerda ou direita? De cima para baixo? 88 Maranhão Amazonas Paraná Alagoas Ceará Pará Roraima Acre Amapá Goiás Piauí Rondônia

45 Atravessamento em Árvores Binárias Significa percorrer de forma sistemática, por cada um de seus nodos, realizando um certo processamento. 89 Tipos básicos de atravessamento: em-ordem pré-ordem pós-ordem Os tipos de atravessamento são facilmente compreendidos se fizermos uma analogia entre eles e as notações segundo uma expressão aritmética pode ser escrita: infixa, prefixa e pósfixa. Operações Básicas - Atravessamento Considerando a expressão infixa A + B, podemos usar a seguinte representação na forma de árvore binária: + 9 A B O atravessamento em-ordem da árvore será o acesso aos dados da seguinte maneira: Vai para o nó esquerdo, mostra o valor do nó, vai para o nó direito (ERD). Exemplo: A + B O atravessamento pré-ordem da árvore será o acesso aos dados da seguinte maneira: Mostra o valor do nó, vai para o nó esquerdo, vai para o nó direito (RED). Exemplo: + A B O atravessamento pós-ordem da árvore será o acesso aos dados da seguinte maneira: Vai para o nó esquerdo, vai para o nó direito, mostra o valor do nó (EDR). Exemplo: A B +

46 Atravessamento Préordem Maranhão 8 Amazonas Paraná Alagoas Ceará Pará Roraima Acre Amapá Goiás Piauí 12 Rondônia Maranhão, Amazonas, Alagoas, Acre, Amapá, Ceará, Goiás, Paraná, Pará, Roraima, Piauí, Rondônia Atravessamento Emordem Maranhão 9 Amazonas Paraná Alagoas Ceará Pará Roraima Acre Amapá Goiás Piauí 11 Rondônia Acre, Alagoas, Amapá, Amazonas, Ceará, Goiás, Maranhão, Pará, Paraná, Piauí, Rondônia, Roraima

47 Atravessamento Pósordem Maranhão 11 Amazonas Paraná Alagoas Ceará Pará Roraima Acre Amapá Goiás Piauí 8 Rondônia Acre, Amapá, Alagoas, Goiás. Ceará, Amazonas, Pará, Rondônia, Piauí, Roraima, Paraná, Maranhão Atravessamentos - Exercícios 94 Monte as ABB e faça os atravessamentos préordem, emordem e pósordem. a) 12, 4, 8, 26, 2, 5, 2, 22, 1, 13 b) F, H, I, B, C, A, G, B, E c) Ivani, Paulo, Marli, Carla, Ester, Alice, Sofia, Denis d) Percorrendo-se uma ABB foram produzidas as seguintes sequências emordem ( A B C D E F G H I J L ) e pósordem ( A B D E C G H L J I F ). A partir destas informações monte a ABB. e) Ache as expressões geradas a partir da árvore abaixo desenhada após atravessarmos através dos tipos préordem, emordem e pósordem. + * * c + d * a b f + g h

48 Operações Básicas 95 Estrutura básica de Árvore de Busca Binária typedef char tpelem; typedef struct registro { struct registro* esq; tpelem dado; struct registro*dir; tparvore; tparvore *raiz = NULL; Operações Básicas - Inserção É uma operação bastante simples. Basta verificar se a árvore não está vazia. 96 Se estiver, a inserção será na própria raiz Se a árvore não estiver vazia, deve-se verificar se o novo elemento é menor do que a raiz Sendo verdadeiro, a inserção será na sub-árvore esquerda Sendo falso, a inserção será na sub-árvore direita.

49 Operações Básicas - Inserção Inserção de dados em uma Árvore de Busca Binária 97 void insere ( tparvore **t, tpelem x ) { if ( *t == NULL ) { *t = ( tparvore * ) malloc ( sizeof ( tparvore ) ); ( *t ) -> esq = NULL; ( *t ) -> dir = NULL; ( *t ) -> dado = x; else if ( x < ( *t ) -> dado ) insere( & ( ( *t ) -> esq ), x ); else insere( & ( ( *t ) -> dir ), x ); Operações Básicas - Busca Considerando uma árvore de busca binária T e um elemento x a ser procurado entre seus nós, existem 4 possibilidades: 98 Se T é uma árvore vazia, não há o que procurar; Se a raiz de T armazena o elemento x, a solução é imediata; Se x é menor que o valor da raiz T, a busca prossegue na subárvore esquerda de T; Se x é maior que o valor da raiz T, a busca prossegue na subárvore direita de T.

50 Operações Básicas - Busca Inserção de dados em uma Árvore de Busca Binária 99 tparvore* busca ( tparvore *t, tpelem x ) { if ( t == NULL ) return NULL; else if ( t -> dado == x ) return t; else if ( x < t -> dado ) return busca ( t -> esq, x ); else return busca ( t -> dir, x ); Operações Básicas - Atravessamento Atravessamentos em uma Árvore de Busca Binária 1 void emordem ( tparvore *t ) { if (t!= NULL) { emordem ( t -> esq ); printf (" %c ", t -> dado ); emordem ( t -> dir ); void preordem ( tparvore *t ) { if ( t!= NULL ) { printf (" %c ", t -> dado ); preordem ( t -> esq ); preordem ( t -> dir ); void posordem ( tparvore *t ) { if ( t!= NULL ) { posordem ( t -> esq ); posordem ( t -> dir ); printf (" %c ", t -> dado );

51 Operações Básicas - Remoção Podemos considerar que a remoção de um nó de uma árvore é a rotina mais trabalhosa para ser desenvolvida e compreendida. Ainda assim, após analisarmos todos os possíveis casos, a remoção parecerá bastante simples. Por uma questão de simplificação, vamos admitir que inicialmente o elemento a ser removido encontra-se na raiz da árvore de busca binária T, então, as seguintes hipóteses devem ser avaliadas: 11 A raiz não possui filhos: A solução é imediata. Podemos removê-la e anular T; Se a raiz possui um único filho: Podemos remover o nó raiz e o nó filho toma seu lugar; Se a raiz possuir dois filhos, não é possível quem ambos assumam o lugar do pai. Neste ponto surgem algumas perguntas: Qual das duas subárvores deve assumir o lugar do nó pai removido? O que deve ser feito com a subárvore que não foi a escolhida? Seu nó ficaria órfão? Operações básicas - Remoção A resposta para as questões anteriores é: 12 Devemos buscar o nó que armazena o menor elemento na subárvore direita de T, este nó deve ser removido e o elemento armazenado por ele entrará na raiz da árvore T. Para entender a solução adotada precisamos lembrar da definição de árvore de busca binária. Não podemos ter elementos maiores nem iguais à raiz numa subárvore esquerda; Não podemos ter elementos menores que a raiz numa subárvore direita. Então, se tomarmos o menor elemento da subárvore direita e o posicionarmos na raiz, então continua valendo a definição. Sabemos que o maior elemento numa árvore binária ordenada encontra-se no nó que ocupa a posição mais à direita possível. Este nó certamente não terá um filho direito, pois se o tivesse não seria o maior da árvore; Pode, entretanto, ter um filho esquerdo (menor).

UNIVERSIDADE NOVE DE JULHO - UNINOVE. Pesquisa e Ordenação. Introdução. Material disponível para download em:

UNIVERSIDADE NOVE DE JULHO - UNINOVE. Pesquisa e Ordenação. Introdução. Material disponível para download em: UNIVERSIAE NOVE E JULHO - UNINOVE 1 Pesquisa e Ordenação Introdução Material disponível para download em: www.profvaniacristina.com Pesquisa e Ordenação 2 EMENTA: Recursividade, Quick sort; ivisão e Conquista,

Leia mais

CAP. IX - MANIPULAÇÃO DE ARQUIVOS Generalidades sobre Arquivos. 9.2 Abertura e Fechamento de Arquivos. Operações com arquivos:

CAP. IX - MANIPULAÇÃO DE ARQUIVOS Generalidades sobre Arquivos. 9.2 Abertura e Fechamento de Arquivos. Operações com arquivos: CAP. IX - MANIPULAÇÃO DE ARQUIVOS 9.1 Generalidades sobre arquivos 9.2 Abertura e fechamento de arquivos 9.3 Arquivos textos e arquivos binários 9.4 Leitura e escrita em arquivos binários 9.5 Procura direta

Leia mais

INF 1620 P2-23/10/04 Questão 1 Nome:

INF 1620 P2-23/10/04 Questão 1 Nome: INF 1620 P2-23/10/04 Questão 1 Considere um tipo abstrato de dados para representar uma disciplina da PUC-Rio, com as seguintes informações: Nome da disciplina: com até 50 caracteres Código da disciplina:

Leia mais

Algoritmos e Estrutura de Dados II. Árvore. Prof a Karina Oliveira.

Algoritmos e Estrutura de Dados II. Árvore. Prof a Karina Oliveira. Algoritmos e Estrutura de Dados II Árvore Prof a Karina Oliveira kkco@dei.unicap.br Introdução Estruturas de dados lineares (pilha, fila) são estruturas que guardam coleções de elementos que são acessados

Leia mais

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

Departamento de Informática - PUC-Rio INF 1007 Programação 2 P3 23/06/2010 Departamento de Informática - PUC-Rio INF 1007 Programação 2 P3 23/06/2010 Aluno: Instruções: 1) Escreva seu nome completo, matrícula e turma em todas as folhas desta prova; 2) A prova deve ser completamente

Leia mais

Arquivos em C. Material da Prof. Ana Eliza

Arquivos em C. Material da Prof. Ana Eliza em C Material da Prof. Ana Eliza Definição Um arquivo é uma estrutura de dados linear ( lista ) que é mantida fora da memória principal, em um dispositivo de armazenamento (memória secundária). Um arquivo

Leia mais

INF 1620 P4 11/12/06 Questão 1 Nome:

INF 1620 P4 11/12/06 Questão 1 Nome: INF 1620 P4 11/12/06 Questão 1 Considere que o cálculo da multa para o pagamento de um determinado imposto varia de acordo com a tabela a seguir: Valor do Imposto Original Multa por mês de atraso até R$

Leia mais

Árvores & Árvores Binárias

Árvores & Árvores Binárias Árvores & Árvores Binárias Problema Implementações do TAD Lista Linear Lista encadeada eficiente para inserção e remoção dinâmica de elementos, mas ineficiente para busca Lista seqüencial (ordenada) Eficiente

Leia mais

INF 1620 P4 30/06/07 Questão 1 Nome:

INF 1620 P4 30/06/07 Questão 1 Nome: INF 1620 P4 30/06/07 Questão 1 O maior divisor comum (MDC) de dois números inteiros é o maior número inteiro que faz uma divisão exata (com resto zero) desses dois números. Por exemplo, o MDC de 32 e 40

Leia mais

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

INF 1620 P2-01/11/03 Questão 1 Nome: INF 1620 P2-01/11/03 Questão 1 Considere a implementação de uma lista encadeada para armazenar as notas dos alunos de uma turma dada pelo tipo abaixo: struct lista { char nome[81]; int mat; float p1, p2,

Leia mais

Computação 2. Aula 8. Profª. Fabiany Arquivos

Computação 2. Aula 8. Profª. Fabiany Arquivos Computação 2 Aula 8 Arquivos Profª. Fabiany fabianyl@utfpr.edu.br E/S com Arquivos A linguagem C não possui nenhum comando de E/S. Todas as operações de E/S ocorrem mediante chamadas a funções de biblioteca

Leia mais

INF 1620 P3-25/11/05 Questão 1 Nome:

INF 1620 P3-25/11/05 Questão 1 Nome: INF 1620 P3-25/11/05 Questão 1 Dizemos que uma matriz quadrada é um quadrado mágico se a soma dos elementos de cada linha, a soma dos elementos de cada coluna e a soma dos elementos de sua diagonal principal

Leia mais

INF 1620 P4-09/07/03 Questão 1 Nome:

INF 1620 P4-09/07/03 Questão 1 Nome: INF 1620 P4-09/07/03 Questão 1 Um ponto geométrico no espaço 2D é representado pelas coordenadas reais x e y. Considere uma aplicação que precisa manipular pontos, através da implementação de duas funções.

Leia mais

Fontes Bibliográficas. Estruturas de Dados Aula 15: Árvores. Livros:

Fontes Bibliográficas. Estruturas de Dados Aula 15: Árvores. Livros: Fontes Bibliográficas Estruturas de Dados Aula 15: Árvores Livros: Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo 13; Projeto de Algoritmos (Nivio Ziviani): Capítulo 5; Estruturas

Leia mais

Computação 2. Aula 9. Diego Addan Arquivos

Computação 2. Aula 9. Diego Addan Arquivos Computação 2 Aula 9 Arquivos Diego Addan diegoaddan@gmail.com E/S com Arquivos A linguagem C não possui nenhum comando de E/S. Todas as operações de E/S ocorrem mediante chamadas a funções de biblioteca

Leia mais

INF 1620 P3-29/06/04 Questão 1 Nome:

INF 1620 P3-29/06/04 Questão 1 Nome: INF 1620 P3-29/06/04 Questão 1 Considere um arquivo texto que descreve um conjunto de retângulos e círculos. Cada linha do arquivo contém a descrição de uma figura. O primeiro caractere da linha indica

Leia mais

REVISÃO DE C. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

REVISÃO DE C. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos REVISÃO DE C Vanessa Braganholo Estruturas de Dados e Seus Algoritmos REVISÃO DE C Ponteiros Alocação dinâmica de memória Recursão INSTITUTO DE COMPUTAÇÃO - UFF 2 PONTEIROS PONTEIROS C permite o armazenamento

Leia mais

Estruturas de Dados Aula 11: TAD Pilha

Estruturas de Dados Aula 11: TAD Pilha Estruturas de Dados Aula 11: TAD Pilha Fontes Bibliográficas Livros: Projeto de Algoritmos (Nivio Ziviani): Capítulo 3; Introdução a Estruturas de Dados (Celes, Cerqueira e Rangel): Capítulo 10; Estruturas

Leia mais

SCC Algoritmos e Estruturas de Dados I

SCC Algoritmos e Estruturas de Dados I SCC 202 - Algoritmos e Estruturas de Dados I TAD Pilha Lembrem...TADs são tipos definidos em termos de seu comportamento e não de sua representação (que pode variar na busca de eficiência) 12/8/2010 Pilha

Leia mais

13a. Aula Manipulação de arquivos

13a. Aula Manipulação de arquivos 13a. Aula Manipulação de arquivos 2013.2 O sistema de entrada e saída do ANSI C é composto por uma série de funções (fopen, fprintf, fgets, fclose) cujos protótipos estão reunidos em stdio.h Todas estas

Leia mais

Árvores & Árvores Binárias

Árvores & Árvores Binárias SCE 182 SCC122 Algoritmos Estruturas e Estruturas de Dados de Dados I Árvores & Árvores Binárias Prof. Material Original: Walter Aoiama Nagai; Maria das Graças Volpe Nunes; Definições Árvore T é um conjunto

Leia mais

Aula 14 Oficina de Programação Tópicos Especiais em C: Arquivos. Profa. Elaine Faria UFU

Aula 14 Oficina de Programação Tópicos Especiais em C: Arquivos. Profa. Elaine Faria UFU Aula 14 Oficina de Programação Tópicos Especiais em C: Arquivos Profa. Elaine Faria UFU - 2017 Uso da Memória Secundária Em muitos casos necessitamos da memória secundária (auxiliar), para armazenar informações

Leia mais

Aluno: Valor Nota Q1 3.0 Q2 2.5 Q3 2.5 Q4 2.0 Total 10.0

Aluno: Valor Nota Q1 3.0 Q2 2.5 Q3 2.5 Q4 2.0 Total 10.0 P4 Programação II 2012.2 Departamento de Informática/PUC- Rio Aluno: Matrícula: Turma: 1. A prova é sem consulta e sem perguntas. A interpretação do enunciado faz parte da prova. 2. A prova deve ser completamente

Leia mais

Pilhas e Filas. Nádia Félix e Hebert Coelho

Pilhas e Filas. Nádia Félix e Hebert Coelho Pilhas e Filas Nádia Félix e Hebert Coelho Vários slides foram adaptados de Nina Edelwais e Renata Galante Estrutura de Dados Série de Livros Didáticos - Informática - UFRGS Pilhas e filas Listas lineares

Leia mais

INF 1620 P3-21/06/08 Questão 1 Nome:

INF 1620 P3-21/06/08 Questão 1 Nome: INF 1620 P3-21/06/08 Questão 1 Dada uma lista encadeada de números inteiros cujo tipo que representa um nó da lista é dado por: struct lista { int info; struct lista *prox; typedef struct lista Lista;

Leia mais

Algoritmos e Estruturas de dados

Algoritmos e Estruturas de dados Algoritmos e Estruturas de dados Listas Encadeadas Prof. Dr. Fábio Rodrigues de la Rocha (Listas Encadeadas) 1 / 21 Definição: Anteriormente estudamos listas encadeadas que foram implementadas como vetores

Leia mais

Pilha. SCC-202 Algoritmos e Estruturas de Dados I. Lucas Antiqueira

Pilha. SCC-202 Algoritmos e Estruturas de Dados I. Lucas Antiqueira Pilha SCC-202 Algoritmos e Estruturas de Dados I Lucas Antiqueira Pilha O que é? Para que serve? 2 Problema: chamada de sub-rotinas Rotina A 1 print A 2 call C 3 call B 4 call D 5 return Rotina B 1 call

Leia mais

Departamento de Informática - PUC-Rio INF 1007 Programação 2 P4 07/12/2010

Departamento de Informática - PUC-Rio INF 1007 Programação 2 P4 07/12/2010 Departamento de Informática - PUC-Rio INF 1007 Programação 2 P4 07/12/2010 Aluno: Matrícula: Turma: Instruções: 1) Escreva seu nome completo, matrícula e turma; 2) A prova deve ser completamente resolvida

Leia mais

ALGORITMOS E ESTRUTURAS DE DADOS CES-11

ALGORITMOS E ESTRUTURAS DE DADOS CES-11 ALGORITMOS E ESTRUTURAS DE DADOS CES-11 Prof. Paulo André Castro pauloac@ita.br Sala 110 Prédio da Computação www.comp.ita.br/~pauloac IECE - ITA Revisão CES-11 Tipos escalares primitivos Tipos constituídos

Leia mais

ESTRUTURA DE DADOS. Árvores, árvores binárias e percursos. Cristina Boeres

ESTRUTURA DE DADOS. Árvores, árvores binárias e percursos. Cristina Boeres ESTRUTURA DE DADOS Árvores, árvores binárias e percursos Cristina Boeres 2 Árvores! utilizada em muitas aplicações! modela uma hierarquia entre elementos árvore genealógica diagrama hierárquico de uma

Leia mais

P3 Programação II Departamento de Informática/PUC-Rio 27 de junho de 2013

P3 Programação II Departamento de Informática/PUC-Rio 27 de junho de 2013 P3 Programação II 2013.1 Departamento de Informática/PUC-Rio 27 de junho de 2013 Aluno: Matrícula: Turma: Declaro ter lido as instruções abaixo e estar ciente das normas da aplicação da Prova. Assinatura:

Leia mais

DAS5102 Fundamentos da Estrutura da Informação

DAS5102 Fundamentos da Estrutura da Informação Ponteiros e Funções Funções ou sub-rotinas são parcelas de código que podem ser invocadas a partir do programa principal ou até mesmo por outras sub-rotinas. Elas têm como objetivo a execução de uma tarefa

Leia mais

ÁRVORES BINÁRIAS DE BUSCA. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

ÁRVORES BINÁRIAS DE BUSCA. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos ÁRVORES BINÁRIAS DE BUSCA Vanessa Braganholo Estruturas de Dados e Seus Algoritmos REFERÊNCIA Szwarcfiter, J.; Markezon, L. Estruturas de Dados e seus Algoritmos, 3a. ed. LTC. Cap. 4 INSTITUTO DE COMPUTAÇÃO

Leia mais

Departamento de Sistemas de Computação Universidade de São Paulo Introdução a Ciência de Computação I. Aula 13 Arquivos

Departamento de Sistemas de Computação Universidade de São Paulo Introdução a Ciência de Computação I. Aula 13 Arquivos Departamento de Sistemas de Computação Universidade de São Paulo Introdução a Ciência de Computação I Aula 13 Arquivos Responsável Seiji Isotani, Rafaela V. Rocha sisotani@icmc.usp.br rafaela.vilela@gmail.com

Leia mais

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

Departamento de Informática - PUC-Rio INF 1007 Programação 2 P3 26/11/2010 Departamento de Informática - PUC-Rio INF 1007 Programação 2 P3 26/11/2010 Aluno: Matrícula: Turma: Instruções: 1) Escreva seu nome completo, matrícula e turma em todas as folhas desta prova; 2) A prova

Leia mais

SSC INTRODUÇÃO À COMPUTAÇÃO PARA ENGENHARIA AMBIENTAL REGISTROS E ARQUIVOS. Profa. Dra. Milena Guessi Margarido

SSC INTRODUÇÃO À COMPUTAÇÃO PARA ENGENHARIA AMBIENTAL REGISTROS E ARQUIVOS. Profa. Dra. Milena Guessi Margarido SSC 301 - INTRODUÇÃO À COMPUTAÇÃO PARA ENGENHARIA AMBIENTAL REGISTROS E ARQUIVOS Profa. Dra. Milena Guessi Margarido (milena@icmc.usp.br) Número Bairro CEP Cidade Logradouro Endereço País REGISTRO Estrutura

Leia mais

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C Estruturas de Dados Revisão de Ponteiros Prof. Ricardo J. G. B. Campello Sumário Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C Operações Ponteiros e Arranjos

Leia mais

UNIVERSIDADE DA BEIRA INTERIOR

UNIVERSIDADE DA BEIRA INTERIOR UNIVERSIDADE DA BEIRA INTERIOR Programação II 2º Semestre Exame Época Norma (15 val) Resolução 22/06/2018 1 [1,00 val + 1,00 val] - Memória Dinâmica Considere as seguintes declarações de variáveis: int

Leia mais

Variáveis, Tipos de Dados e Operadores

Variáveis, Tipos de Dados e Operadores ! Variáveis, Tipos de Dados e Operadores Engenharias Informática Aplicada 2.o sem/2013 Profa Suely (e-mail: smaoki@yahoo.com) VARIÁVEL VARIÁVEL É um local lógico, ligado a um endereço físico da memória

Leia mais

Estruturas de Dados II

Estruturas de Dados II Estruturas de Dados II Rodrigo Porfírio da Silva Sacchi rodrigosacchi@ufgd.edu.br 3410-2086 Aula 2: Árvores http://www.do.ufgd.edu.br/rodrigosacchi Árvores Definição: Árvores Uma árvore T é um conjunto

Leia mais

INF 1620 P4-01/07/08 Questão 1 Nome:

INF 1620 P4-01/07/08 Questão 1 Nome: INF 1620 P4-01/07/08 Questão 1 Escreva uma função em C que receba duas strings, cujos caracteres estão ordenados em ordem crescente, e retorne uma nova string alocada dinamicamente, que contém todos os

Leia mais

Estrutura de Dados. Carlos Eduardo Batista. Centro de Informática - UFPB

Estrutura de Dados. Carlos Eduardo Batista. Centro de Informática - UFPB Estrutura de Dados Carlos Eduardo Batista Centro de Informática - UFPB bidu@ci.ufpb.br Árvores (parte 2) Estruturas de Dados 2 Organização dos dados: Linear: Listas, pilhas, filas. Relação sequencial.

Leia mais

1. Listas sequenciais versus listas ligadas. Lista sequencial

1. Listas sequenciais versus listas ligadas. Lista sequencial Alocação Dinâmica Listas Ligadas 1. Listas sequenciais versus listas ligadas Lista sequencial Uma lista sequencial é um conjunto de elementos contíguos na memória. Um vetor é o melhor exemplo de lista

Leia mais

Programação II. Arquivos - Conceito. Arquivos

Programação II. Arquivos - Conceito. Arquivos Programação II Arquivos Jocélio Passos joceliodpassos@bol.com.br C Comp Total, Cap 9 Espaço para armazenar dados em memória auxiliar (não volátil) Arquivos em C podem ser também terminais ou impressoras

Leia mais

13. ALOCAÇÃO DINÂMICA DE MEMÓRIA

13. ALOCAÇÃO DINÂMICA DE MEMÓRIA 787878787878787878787878787878787878787878787878787878 13. ALOCAÇÃO DINÂMICA DE MEMÓRIA Sempre é necessário declarar o número de elementos do array. Mas e se ele for desconhecido? E se ele variar? Pode

Leia mais

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

INF 1620 P4-06/12/02 Questão 1 Nome: INF 1620 P4-06/12/02 Questão 1 (a) Escreva uma função em C que receba como parâmetro um número inteiro não negativo e retorne, como resultado da função, o valor do seu fatorial. O cabeçalho desta função

Leia mais

Módulo 5 Vetores e Alocação Dinâmica

Módulo 5 Vetores e Alocação Dinâmica Estruturas de Dados Módulo 5 Vetores e Alocação Dinâmica 1/9/2005 (c) Dept. Informática - PUC-Rio 1 Referências Waldemar Celes, Renato Cerqueira, José Lucas Rangel, Introdução a Estruturas de Dados, Editora

Leia mais

Árvores. SCC-202 Algoritmos e Estruturas de Dados I. Lucas Antiqueira

Árvores. SCC-202 Algoritmos e Estruturas de Dados I. Lucas Antiqueira Árvores SCC-202 Algoritmos e Estruturas de Dados I Lucas Antiqueira Listas e árvores Listas lineares Um nó após o outro, adjacentes Nó sucessor e antecessor Diversas aplicações necessitam de estruturas

Leia mais

LINGUAGEM C: ARQUIVOS

LINGUAGEM C: ARQUIVOS LINGUAGEM C: ARQUIVOS Prof. André Backes Arquivos 2 Por que usar arquivos? Permitem armazenar grande quantidade de informação; Persistência dos dados (disco); Acesso aos dados poder ser não seqüencial;

Leia mais

Computação Eletrônica. Aula 12 Arquivos Texto e Binário. Prof: Luciano Barbosa. CIn.ufpe.br

Computação Eletrônica. Aula 12 Arquivos Texto e Binário. Prof: Luciano Barbosa. CIn.ufpe.br Computação Eletrônica Aula 12 Arquivos Texto e Binário Prof: Luciano Barbosa Relembrando a Arquitetura Básica de um Computador Até agora, toda a informação armazenada por nossos programas estava na memória

Leia mais

Fundamentos de Programação 1

Fundamentos de Programação 1 Fundamentos de Programação 1 Linguagem C Arquivos Seqüências ou de Texto. Slides 18 Prof. SIMÃO Jean Marcelo SIMÃO 1 Arquivo de Escrita 1 fopen ( nome.txt", "w" ); fputc ( caracter, arquivo); 2 #include

Leia mais

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Computadores Digitais 2. Prof. Rodrigo de Souza Couto Computadores Digitais 2 Linguagens de Programação DEL-Poli/UFRJ Prof. Miguel Campista Aula de Hoje Arquivos Funções para abrir e fechar arquivos Arquivos em modo texto Arquivos em modo binário ATENÇÃO

Leia mais

Universidade Estadual Paulista Júlio de Mesquita Filho UNESP

Universidade Estadual Paulista Júlio de Mesquita Filho UNESP Introdução à Computação II AULA 16 BCC Noturno - EMA896115B Prof. Rafael Oliveira olivrap@gmail.com Universidade Estadual Paulista Júlio de Mesquita Filho UNESP Rio Claro 2014 (Sem 2) Estruturas de Dados

Leia mais

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: ponteiros e alocação dinâmica

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: ponteiros e alocação dinâmica Universidade Federal de Uberlândia Faculdade de Computação Linguagem C: ponteiros e alocação dinâmica Prof. Renato Pimentel 1 Ponteiros 2 Prof. Renato Pimentel 1 Ponteiros: introdução Toda a informação

Leia mais

Capítulo 6: Arquivos

Capítulo 6: Arquivos Capítulo 6: Arquivos Waldemar Celes e Roberto Ierusalimschy 29 de Fevereiro de 2012 1 Funções de entrada e saída em arquivos Nos capítulos anteriores, desenvolvemos programas que capturam seus dados de

Leia mais

Estruturas de Dados. Módulo 11 Pilhas. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Estruturas de Dados. Módulo 11 Pilhas. 9/8/2005 (c) Dept. Informática - PUC-Rio 1 Estruturas de Dados Módulo 11 Pilhas 9/8/2005 (c) Dept. Informática - PUC-Rio 1 Referências Waldemar Celes, Renato Cerqueira, José Lucas Rangel, Introdução a Estruturas de Dados, Editora Campus (2004)

Leia mais

Programação: Vetores

Programação: Vetores Programação de Computadores I Aula 09 Programação: Vetores José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011-1 1/62 Motivação Problema Faça um programa que leia

Leia mais

INF 1620 P2-14/10/05 Questão 1 Nome:

INF 1620 P2-14/10/05 Questão 1 Nome: INF 1620 P2-14/10/05 Questão 1 Considere um cadastro de produtos de um estoque, com as seguintes informações para cada produto: Código de identificação do produto: representado por um valor inteiro Nome

Leia mais

INF 1620 P3-27/11/04 Questão 1 Nome:

INF 1620 P3-27/11/04 Questão 1 Nome: INF 1620 P3-27/11/04 Questão 1 Considere um arquivo texto com as notas dos alunos de uma disciplina. Os dados de cada aluno são armazenados em duas linhas do arquivo: uma com o seu nome (cadeia com até

Leia mais

Revisão: Tipo Abstrato de Dados Recursividade

Revisão: Tipo Abstrato de Dados Recursividade Algoritmos e Estrutura de Dados II Revisão: Tipo Abstrato de Dados Recursividade Prof a Karina Oliveira kkco@dei.unicap.br Introdução Estudo das estruturas de dados envolve dois objetivos complementares:

Leia mais

Permite modularidade (dividir programa em partes): Facilita a depuração (debug) e portabilidade.

Permite modularidade (dividir programa em partes): Facilita a depuração (debug) e portabilidade. 222222222222222222222222222 8 - FUNÇÕES 81 - Características básicas É um trecho independente de código, com objetivos bem definidos Programas em C, geralmente consistem em várias pequenas funções, ao

Leia mais

Programação II. Listas Encadeadas (Linked Lists) Bruno Feijó Dept. de Informática, PUC-Rio

Programação II. Listas Encadeadas (Linked Lists) Bruno Feijó Dept. de Informática, PUC-Rio Programação II Listas Encadeadas (Linked Lists) Bruno Feijó Dept. de Informática, PUC-Rio Vetores vs Estruturas Dinâmicas Vetores (arrays): Ocupa um espaço contíguo de memória Permite acesso randômico

Leia mais

ÁRVORES E ÁRVORE BINÁRIA DE BUSCA

ÁRVORES E ÁRVORE BINÁRIA DE BUSCA ÁRVORES E ÁRVORE BINÁRIA DE BUSCA Prof. André Backes Definição 2 Diversas aplicações necessitam que se represente um conjunto de objetos e as suas relações hierárquicas Uma árvore é uma abstração matemática

Leia mais

Alocação de Memória. Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR)

Alocação de Memória. Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR) Alocação de Memória Linguagem de Programação Estruturada 1 Alocação dinâmica e ponteiros Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR) Sumario Introdução Alocação Estática

Leia mais

Prof. Jesus José de Oliveira Neto

Prof. Jesus José de Oliveira Neto Prof. Jesus José de Oliveira Neto São estruturas de dados adequadas para a representação de hierarquias. Uma árvore é composta por um conjunto de nós. Existe um nó r, denominado raiz, que contém zero ou

Leia mais

Estruturas de Dados. Módulo 17 - Busca. 2/6/2005 (c) Dept. Informática - PUC-Rio 1

Estruturas de Dados. Módulo 17 - Busca. 2/6/2005 (c) Dept. Informática - PUC-Rio 1 Estruturas de Dados Módulo 17 - Busca 2/6/2005 (c) Dept. Informática - PUC-Rio 1 Referências Waldemar Celes, Renato Cerqueira, José Lucas Rangel, Introdução a Estruturas de Dados, Editora Campus (2004)

Leia mais

ÁRVORES. Prof. Yan ndre Maldonado - 1. Prof. Yandre Maldonado e Gomes da Costa

ÁRVORES. Prof. Yan ndre Maldonado - 1. Prof. Yandre Maldonado e Gomes da Costa ÁRVORES Prof. Yan ndre Maldonado - 1 Prof. Yandre Maldonado e Gomes da Costa Árvores Prof. Yan ndre Maldonado - 2 Árvores são estruturas de dados que caracterizam uma relação entre os dados que a compõem;

Leia mais

Disciplina de Introdução à Ciência da Computação ICC 1 - Teoria

Disciplina de Introdução à Ciência da Computação ICC 1 - Teoria USP - ICMC - SSC SSC 0501-1o. Semestre 2015 Disciplina de Introdução à Ciência da Computação ICC 1 - Teoria Prof. Fernando Santos Osório Email: fosorio [at] icmc. usp. br, gmail. com Página Pessoal: http://www.icmc.usp.br/~fosorio/

Leia mais

Programação para Computação 13ª Aula

Programação para Computação 13ª Aula Programação para Computação 13ª Aula Arquivos em C O sistema de E/S da linguagem C utiliza o conceito de streams e arquivos, como um nível de abstração entre o programador e o dispositivo utilizado. Uma

Leia mais

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

INF 1010 Estruturas de Dados Avançadas. Árvores binárias INF 1010 Estruturas de Dados Avançadas Árvores binárias 1 Árvore estrutura hierárquica: A B E F C D G A B C E F D G A B C D E F G (A (B (E, F)), C, (D (G))) 05/09/16 2 Árvore - definições árvore: nó raiz

Leia mais

Aula: ARQUIVOS. Introdução à Ciência da Computação I Simone Senger Souza. ICMC/USP São Carlos

Aula: ARQUIVOS. Introdução à Ciência da Computação I Simone Senger Souza. ICMC/USP São Carlos Aula: ARQUIVOS Introdução à Ciência da Computação I Simone Senger Souza ICMC/USP São Carlos Introdução As estruturas vistas anteriormente armazenam as informações na memória principal do computador. Nem

Leia mais

Alocação Dinâmica em C

Alocação Dinâmica em C Universidade de São Paulo São Carlos Instituto de Ciências Matemáticas e de Computação Alocação Dinâmica em C Profa Rosana Braga Adaptado de material preparado pela profa Silvana Maria Affonso de Lara

Leia mais

Alocação Dinâmica de Memória - Exercício

Alocação Dinâmica de Memória - Exercício Alocação Dinâmica de Memória - Exercício Construa um programa que leia da entrada padrão o número de linhas e de colunas de uma matriz de floats, aloque espaço dinamicamente para esta e a inicialize, com

Leia mais

Árvores Binárias. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich

Árvores Binárias. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich Árvores Binárias SCC0202 - Algoritmos e Estruturas de Dados I Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista. Figuras editadas por Isadora Maria Mendes http://www.icmc.usp.br/~paulovic

Leia mais

Atividade de laboratório listas encadeadas simples

Atividade de laboratório listas encadeadas simples Atividade de laboratório listas encadeadas simples 1. Estrutura básica Uma lista encadeada simples é uma estrutura de dados composta de uma seqüência de estruturas elementares chamadas nós. Cada nó contém

Leia mais

Algoritmos e Estruturas de Dados Prof. Osório PIP/CA - Aula 05 Pag.: 1

Algoritmos e Estruturas de Dados Prof. Osório PIP/CA - Aula 05 Pag.: 1 Algoritmos e Estruturas de Dados Prof. Osório PIP/CA - Aula 05 Pag.: 1 - UNIVERSIDADE DO VALE DO RIO DOS SINOS CENTRO DE CIÊNCIAS EXATAS E TECNOLÓGICAS (C6/6) PIP/CA - Programa Interdisciplinar de Pós-Graduação

Leia mais

SCC 202 Algoritmos e Estruturas de Dados I. Pilhas (Stacks) (implementação dinâmica)

SCC 202 Algoritmos e Estruturas de Dados I. Pilhas (Stacks) (implementação dinâmica) SCC 202 Algoritmos e Estruturas de Dados I Pilhas (Stacks) (implementação dinâmica) Operações alocação encadeada dinâmica typedef struct elem{ tipo_info info; struct elem *lig; tipo_elem; typedef struct{

Leia mais

Existe uma quantidade de informação que pode ser armazenada para resolver o problema.

Existe uma quantidade de informação que pode ser armazenada para resolver o problema. Arquivos Introdução As estruturas vistas anteriormente armazenam as informações na memória principal do computador. Nem sempre é conveniente. Problemas: A informação é perdida; As estruturas de dados são

Leia mais

Estruturas de Dados Filas

Estruturas de Dados Filas Estruturas de Dados Filas Roteiro Introdução Definição de Fila (Queue) Aplicações Operações sobre Fila Implementação de Fila Com vetores Com listas encadeadas Exercícios Introdução Estamos acostumados

Leia mais

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco PONTEIROS E LISTAS Kalinka Regina Lucas Jaquie Castelo Branco kalinka@icmc.usp.br ALOCAÇÃO DINÂMICA DE MEMÓRIA Pode-se assumir que as variáveis declaradas na cláusula variável do pseudo-código do algoritmo

Leia mais

Estrutura de Dados: Aula 3 - Linguagem C

Estrutura de Dados: Aula 3 - Linguagem C Estrutura de Dados: Aula 3 - Linguagem C Uso de Memória Alocação de memória Estática Ocorre em tempo de compilação no momento em que se define uma variável ou estrutura é necessário que se definam seu

Leia mais

Arquivos. Programação de Computadores I. Natália Batista.

Arquivos. Programação de Computadores I. Natália Batista. Arquivos Programação de Computadores I Natália Batista nataliabatista@decom.cefetmg.br 1. Arquivos Estruturas de dados armazenadas fora da memória principal do computador, por exemplo em discos. Usados

Leia mais

Árvores. Prof. César Melo DCC/ICE/UFAM

Árvores. Prof. César Melo DCC/ICE/UFAM Árvores Prof. César Melo DCC/ICE/UFAM Introdução As estruturas anteriores são chamadas de unidimensionais (ou lineares) Exemplo são vetores e listas Não adequadas para representar hierarquias. Exemplo:

Leia mais

SUMÁRIO. Fundamentos Árvores Binárias Árvores Binárias de Busca

SUMÁRIO. Fundamentos Árvores Binárias Árvores Binárias de Busca ÁRVORES SUMÁRIO Fundamentos Árvores Binárias Árvores Binárias de Busca 2 ÁRVORES Utilizadas em muitas aplicações Modelam uma hierarquia entre elementos árvore genealógica Diagrama hierárquico de uma organização

Leia mais

Introdução a Programação. Ponteiros e Vetores, Alocação Dinâmica

Introdução a Programação. Ponteiros e Vetores, Alocação Dinâmica Introdução a Programação Ponteiros e Vetores, Alocação Dinâmica Tópicos da Aula Hoje aprenderemos que existe uma forte relação entre ponteiros e vetores Associação entre ponteiros e vetores Ponteiros constantes

Leia mais

1/24 FICHEIROS DE TEXTO

1/24 FICHEIROS DE TEXTO 1/24 FICHEIROS DE TEXTO Hardware de entrada/saída 2/24 Hardware de entrada/saída Grande variedade de dispositivos de E/S (Input/Output) - de memória: disco interno e externo, DVD, pen, CD,... - de transmissão:

Leia mais

Professora Jeane Melo

Professora Jeane Melo Professora Jeane Melo Roteiro Lista Encadeada Alocação: Estática x Dinâmica O que são Ponteiros? Ponteiros Variáveis que Armazenam Endereços de Memória Mas, toda variável não é armazenada na memória? Ponteiros

Leia mais

Introdução a Programação. Arquivos

Introdução a Programação. Arquivos Introdução a Programação Arquivos Tópicos da Aula Hoje aprenderemos a persistir dados Conceito de arquivos Importância de persistência Modos de acesso de arquivos em C Operações em arquivos Funções de

Leia mais

Lista Encadeada (Linked List)

Lista Encadeada (Linked List) Lista Encadeada (Linked List) As listas ou listas encadeadas são a estrutura de dados mais simples concebível excetuando-se naturalmente os arrays. Listas encadeadas nada mais são que uma seqüência de

Leia mais

Estrutura de Dados Listas

Estrutura de Dados Listas Universidade Federal da Paraíba Centro de Informática Departamento de Informática Estrutura de Dados Listas 1 Tiago Maritan tiago@ci.ufpb.br Conteúdos Abordados O Conceito de Listas Listas com Representação

Leia mais

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches Juliana de Melo Bezerra

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches Juliana de Melo Bezerra CES- Algoritmos e Estruturas de Dados Carlos Alberto Alonso Sanches Juliana de Melo Bezerra Árvores CES- Operações sobre uma árvore Estruturas para armazenar árvores Contígua Contígua melhorada Encadeada

Leia mais

Algoritmos e Programação

Algoritmos e Programação Algoritmos e Programação Aula 3 Introdução a Linguagem C Profa. Marina Gomes marinagomes@unipampa.edu.br 1 Aula de Hoje - Criar programas simples em C utilizando a estrutura básica; - Declarar variáveis;

Leia mais

ÁRVORES E ÁRVORES BINÁRIAS. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

ÁRVORES E ÁRVORES BINÁRIAS. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos ÁRVORES E ÁRVORES BINÁRIAS Vanessa Braganholo Estruturas de Dados e Seus Algoritmos ÁRVORES Árvores Árvores Binárias INSTITUTO DE COMPUTAÇÃO - UFF 2 ÁRVORES Fonte de consulta: Szwarcfiter, J.; Markezon,

Leia mais

1 Exercícios com ponteiros

1 Exercícios com ponteiros Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Oitava Aula Prática - 29 de outubro de 2010 O objetivo desta aula prática é exercitar ponteiros e funções. 1 Exercícios com ponteiros

Leia mais

Linguagem C: Introdução

Linguagem C: Introdução Linguagem C: Introdução Linguagem C É uma Linguagem de programação genérica que é utilizada para a criação de programas diversos como: Processadores de texto Planilhas eletrônicas Sistemas operacionais

Leia mais

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Computadores Digitais 2. Prof. Rodrigo de Souza Couto Computadores Digitais 2 Linguagens de Programação DEL-Poli/UFRJ Prof. Miguel Campista Tópicos Listas Encadeadas Introdução às listas encadeadas Manipulação de elementos Implementações recursivas Listas

Leia mais

Estrutura de Dados. Aula 07 Alocação Dinâmica

Estrutura de Dados. Aula 07 Alocação Dinâmica Estrutura de Dados Aula 07 Alocação Dinâmica 2 ALOCAÇÃO DINÂMICA Existem três modos de reservar espaço de memória para o armazenamento de informações: 1ª - através do uso de variáveis globais (e estáticas).

Leia mais

Programação Computacional Aula 17: Manipulação de arquivos

Programação Computacional Aula 17: Manipulação de arquivos Programação Computacional Aula 17: Manipulação de arquivos Profa. Madeleine Medrano madeleine@icte.uftm.edu.br Arquivos de registros Os dados manipulados pelos nossos programas (dados de entrada, dados

Leia mais

Estrutura de Dados. Carlos Eduardo Batista. Centro de Informática - UFPB

Estrutura de Dados. Carlos Eduardo Batista. Centro de Informática - UFPB Estrutura de Dados Carlos Eduardo Batista Centro de Informática - UFPB bidu@ci.ufpb.br Listas e Filas Estruturas de Dados 2 Estrututuras de dados lineares Pilhas (stack) Estrutura de dados onde a inserção

Leia mais