Índice. Capítulo 2 Estrutura de Dados sequencial com armazenamento sequencial

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

Download "Índice. Capítulo 2 Estrutura de Dados sequencial com armazenamento sequencial"

Transcrição

1 Índice i Índice Capítulo 2 Estrutura de Dados sequencial com armazenamento sequencial 1. A Estrutura Abstrata de Dados Lista Definição Implementação de Listas utilizando armazenamento sequencial Implementação de Listas utilizando armazenamento não sequencial Listas - armazenamento sequencial usando memória estática Introdução Declaração Criar um elemento Criar uma lista Lista vazia e lista cheia Inserir um elemento numa lista Inserir no início Inserir no fim Inserir por ordem Remover um elemento duma lista Listar/mostrar um elemento ou os elementos duma lista Destruir uma lista Índice

2 ii Índice 3. Listas - armazenamento sequencial usando memória dinâmica Introdução Declaração Criar um elemento Criar uma lista Lista vazia e lista cheia Inserir um elemento numa lista Inserir no início Inserir no fim Inserir por ordem Remover um elemento duma lista Listar/mostrar um elemento ou os elementos duma lista Destruir uma lista Ordenação duma lista Seleção Linear Bubblesort Quicksort Por Inserção Pesquisa dum elemento numa lista Pesquisa exaustiva Pesquisa Sequencial Pesquisa Binária Índice

3 A Estrutura Abstrata de Dados Lista 1 Capítulo 2 Estrutura de Dados sequencial com armazenamento sequencial 1. A Estrutura Abstrata de Dados Lista 1.1. Definição Uma EAD Lista é uma sequência linear de tipos de dados do mesmo tipo com as seguintes propriedades: 1. Existe um primeiro elemento (a cabeça) com um único sucessor (o próximo); 2. Existe um último elemento (a cauda) sem sucessor; 3. Qualquer outro elemento tem um sucessor (próximo) e um antecessor (anterior); sobre a qual se realiza as seguintes operações: 1. Criar um elemento 2. Criar uma lista 3. Verificar se uma lista está vazia (não tem elementos) 4. Procurar um elemento 5. Procurar o antecessor de um elemento 6. Remover/eliminar um elemento 7. Inserir um elemento atrás de um elemento específico 8. Inserir um elemento à frente de um elemento específico 9. Recuperar um elemento 10. Atualizar um elemento 11. Ordenar uma lista 12. Imprimir/listar uma lista 13. Determinar a quantidade de elementos da lista (tamanho/comprimento) 14. Eliminar/destruir uma lista 15. Verificar se existe espaço para outro elemento

4 2 A Estrutura Abstrata de Dados Lista Os tipos de dados podem ser considerados muito abstratos. A regra principal na estrutura da EAD Lista é utilizar ponteiros. Os elementos numa lista estão sempre ligados pela sua relação sucessor-antecessor. Uma EAD Lista pode ser implementada num espaço de armazenamento sequencial ou num espaço de armazenamento não sequencial. No caso da implementação num espaço sequencial podem-se usar array's, os quais podem ser declarados usando memória estática ou memória dinâmica. No caso do armazenamento não sequencial será usado ponteiros e memória dinâmica Implementação de Listas utilizando armazenamento sequencial Ao implementar uma estrutura de dados num espaço de armazenamento sequencial/contínuo, todos os dados na estrutura são mantidos num array. Os array's podem ser declarados com um tamanho que é fixado quando o programa é escrito, não podendo ser alterado enquanto o programa está a ser executado, ou então usando memória dinâmica em que o tamanho não é fixado quando o programa é escrito e vai sendo alterado à medida que o programa vai sendo executado, consoante as necessidades de espaço de armazenamento. No primeiro caso, quando se está a escrever um programa, tem que se decidir qual é o limite máximo de memória que vai ser necessário para os array's e estabelecer este limite nas declarações. Se o programa for executado com um pequeno conjunto de dados, então muito deste espaço nunca vai ser utilizado. Se pelo contrário, o programa for executado com um grande conjunto de dados, então pode-se esgotar o espaço estabelecido na declaração e encontrar uma situação de overflow. Isto pode ocorrer mesmo no caso da memória do computador não estar totalmente usada, devido aos limites iniciais do array serem muito pequenos. No segundo caso, apenas é necessário declarar um apontador/ponteiro para uma variável do mesmo tipo dos elementos da lista, sendo que a lista vai crescendo em tamanho à medida das necessidades de inserção de elementos na lista. Esta estratégica tem como grande problema a possibilidade de inexistência um bloco de memória contígua necessário para receber todos os elementos da lista. As dificuldades anteriores podem ser ultrapassadas usando outra forma de manter as estruturas de dados na memória sem usar array's, como é o caso das listas ligadas.

5 Listas - armazenamento sequencial usando memória estática 3 No tipo de implementação de Listas usando array's, a definição de cada um dos seus elementos consiste nos seguintes campos: 1. Dados; 2. Chave (opcional) campo pelo qual a lista está ordenada; 3. Localização (índice) na lista. Numa lista L: o elemento de índice 0 (primeira posição L[0]) não tem antecessor; o elemento de índice N-1 (última posição L[N-1]) não tem sucessor; o elemento da lista com índice k tem: - o elemento de índice k-1 como seu antecessor, - o elemento de índice k+1 como seu sucessor Implementação de Listas utilizando armazenamento não sequencial Uma Lista implementada num espaço de armazenamento não sequencial, a memória de cada elemento é reservada individualmente, usando ponteiros e alocação de memória, e o seu tamanho é atualizado à medida que vão sendo inseridos ou removidos elementos da Lista. Neste tipo de implementação enquadram-se os conceitos de Lista ligada, usando ligações simples, duplas ou circulares. 2. Listas - armazenamento sequencial usando memória estática 2.1. Introdução Na implementação de Listas utilizando armazenamento sequencial em memória estática, todos os elementos da Lista são mantidos num array (estático), cujo tamanho máximo é fixado quando o programa é escrito e não pode ser alterado enquanto o programa está a ser executado. Quando se está a escrever um programa, tem que se decidir qual é o limite máximo de memória que vai ser necessário para os array's e estabelecer este limite nas declarações (tamanho máximo), o que implica que o número de elementos da lista (tamanho efetivo) não pode exceder aquele valor. Se o programa for executado com um pequeno conjunto de dados (tamanho efetivo muito inferior ao tamanho máximo), então muito deste espaço nunca vai ser utilizado. Se pelo contrário, o programa for executado com um grande conjunto de dados, então pode-se esgotar o espaço estabelecido na declaração (tamanho efetivo superior ao tamanho máximo) e

6 4 Listas - armazenamento sequencial usando memória estática encontrar uma situação de overflow. Isto pode ocorrer mesmo no caso da memória do computador não estar totalmente usada, devido ao limite inicial do array (tamanho máximo) sere muito baixo. É importante fazer uma distinção entre estes dois conceitos (tamanho efetivo e tamanho máximo). Numa lista de N (tamanho efetivo) elementos, pode ser inserido ou eliminado um elemento, donde, se N = 3 então a lista contém somente 3 elementos (tamanho efetivo igual a 3), se N = 19 então a lista contém 19 elementos (tamanho efetivo igual a 3) o tamanho da lista é variável. De qualquer forma, o valor de N (tamanho efetivo) não pode ser superior ao valor do tamanho máximo da lista; caso isto não aconteça, está-se perante uma situação de overflow. Uma lista é, por definição, uma estrutura dinâmica de dados porque o seu tamanho pode variar. Um array estático é uma estrutura de dados fixa porque o seu tamanho é fixado quando o programa é compilado. Os conceitos de lista e array estático estão relacionados uma vez que uma lista de tamanho variável pode ser implementada usando um array com tamanho fixo (com algumas posições do array não sendo utilizadas). Existem diferentes formas de implementar uma lista e não se deve confundir decisões de implementação com decisões de escolha e especificação da estrutura de dados. Exemplo: uma lista com no máximo 100 elementos (valores inteiros). #define TamMax 100; int Lista[TamMax], N, k; N = 50; for (k = 0; k < N; k++) scanf( %d, &Lista[k]); N = 100; for (k = 50; k < N; k++) scanf( %d, &Lista[k]); N = 102; for (k = 100; k < N; k++) scanf( %d, &Lista[k]); // ERRO: Não existem os elementos Lista[100] e Lista[101] (o maior índice é 99) overflow

7 Listas - armazenamento sequencial usando memória estática 5 Características fundamentais: Tamanho máximo: constante (= TamMax) ineficiência Tamanho efetivo: necessário atualizar e testar eventual transbordo (> TamMax) Acesso: direto Reordenamento trocas (ou vetor auxiliar) Inserção (e remoção) de elementos deslocamento de todos os elementos seguintes 2.2. Declaração Os elementos de uma lista podem ser declarados (definidos) como um tipo qualquer simples (por exemplo, inteiro, real ou carácter) ou estruturado (por exemplo, registo). Como se disse, uma lista pode ser definida como um vetor (array). Portanto, antes de se definir uma lista tem que se definir os elementos da lista. Considere-se, por exemplo, as seguintes definições em linguagem C: #define TamMax 100; typedef struct { char Nome[50], Morada[50]; int Idade, BI; char Sexo[1]; // Masculino(M/m) ou Feminino(F/f) ELEMENTO; ELEMENTO Lista[TamMax]; Nesta lista, cada um dos elementos consiste no seguinte: Dados informação associada (Nome, Morada, Idade, BI e Sexo) Chave campo que servirá de base para ordenar a lista (por exemplo, o Nome) Localização é o índice que lhe está associado (entre 0 e TamMax-1). Para controlar o tamanho da lista, utiliza-se uma variável global do tipo inteiro. Considere-se, por exemplo, a seguinte declaração em linguagem C: int N; { número de elementos (tamanho efetivo) da lista Nos capítulos seguintes, sempre que se referir à ordenação da lista, é suposto ser por ordem crescente do campo Chave, se nada se disser em contrário.

8 6 Listas - armazenamento sequencial usando memória estática 2.3. Criar um elemento Quando se pretende inserir um novo elemento numa lista, este deve ser criado antes; isto é, atribuir valores a todos os campos da estrutura que suporta a informação associada a cada elemento da lista. Um possível algoritmo para criar um elemento é o seguinte: Dados de entrada: um elemento E (sem informação) Dados de saída: o elemento E (preenchido com a informação desejada) Para cada campo do elemento E fazer Pedir informação Introduzir informação Uma função que traduz o algoritmo é a que se segue, a qual recebe um elemento E sem informação e devolve o elemento E com a informação desejada introduzida. void CriarElemento (ELEMENTO *E) { printf( Insira o nome : \n ); fflush(stdin); // para esvaziar o buffer do teclado gets(e->nome); printf( Insira a morada : \n ); fflush(stdin); gets(e->morada); printf( Insira a idade : \n ); scanf( %d, &(E->Idade)); printf( Insira o BI : \n ); scanf( %d, &(E->BI)); printf( Insira o sexo (M/m; F/f) : \n ); fflush(stdin); gets(e->sexo); Ordem complexidade (pior caso): O(0). Prova: total de operações = Criar uma lista Quando se pretende criar uma lista, isto deve ser realizado com a introdução de um elemento (que será o primeiro). Um possível algoritmo para criar uma lista é o seguinte:

9 Listas - armazenamento sequencial usando memória estática 7 Dados de entrada: o tamanho da lista (que é 0) Dados de saída: a lista L com um só elemento e o seu tamanho (que é 1) Criar um novo elemento Inserir o novo elemento na posição 1 (índice 0) da lista L (L[0]) Atualizar o tamanho da lista, atribuindo o valor 1 a N Uma função que traduz o algoritmo é a que se segue, a qual recebe o tamanho da lista (N = 0) e devolve a lista L com um elemento e o seu tamanho a valer 1. void CriarLista (ELEMENTO L[], int *N) { ELEMENTO E; CriarElemento(&E); L[0] = E; *N = 1; Ordem complexidade (pior caso): O(0). Prova: total de operações = 13 (CriarElemento) Lista vazia e lista cheia Uma lista está vazia quando não tem qualquer elemento e, está cheia quando não pode receber mais elementos. Para se verificar se a lista está vazia ou cheia, basta analisar o valor da variável associada ao tamanho da Lista (TAM), da seguinte forma: N = 0 lista vazia N = TamMax lista cheia Um possível algoritmo para verificar se uma lista está vazia é o seguinte: Dados de entrada: uma lista L e o tamanho da lista (N) Dados de saída: 1 (se a lista L está vazia) e 0 (se a lista L não está vazia) Se N = 0 Então Devolver 1 (a lista L está vazia) Senão Devolver 0 (a lista L não está vazia)

10 8 Listas - armazenamento sequencial usando memória estática Uma função que traduz o algoritmo é a que se segue, a qual recebe o tamanho de uma lista (N) e, devolve 0 ou 1 consoante a lista L está vazia ou não. int ListaVazia (int N) { if (N == 0) return 1; // a lista está vazia return 0; // a lista não está vazia Ordem complexidade (pior caso): O(0). Prova: C = 0 e A = 1. Um possível algoritmo para verificar se uma lista está cheia é o seguinte: Dados de entrada: uma lista L e o tamanho da lista (N) Dados de saída: 1 (se a lista L está cheia) e 0 (se a lista L não está cheia) Se N = TamMax Então devolver 1 (a lista L está cheia) Senão devolver 0 (a lista L não está cheia) Uma função que traduz o algoritmo é a que se segue, a qual recebe uma lista (L) e o seu tamanho (N) e, devolve 0 ou 1 consoante a lista L está cheia ou não. int ListaCheia (ELEMENTO L[], int N) { if (N == TamMax) return 1; // a lista L está cheia return 0; // a lista L não está cheia Ordem complexidade (pior caso): O(0). Prova: C = 0 e A = Inserir um elemento numa lista Na resolução deste problema tem de ser analisadas três situações distintas, consoante a forma como se pretende inserir o elemento: no início, no fim ou com a lista ordenada. No entanto, esta operação só deve ser realizada caso a lista não esteja cheia Inserir no início Neste caso tem que se fazer avançar uma posição a todos os elementos para que a posição 1 (índice 0) fique liberta, para que esta possa receber o novo elemento. Um possível algoritmo é o que se segue.

11 Listas - armazenamento sequencial usando memória estática 9 Dados de entrada: o elemento X, a lista L e o tamanho da lista (N) Dados de saída: a lista L e o seu tamanho (N) atualizados Avançar uma posição todos os elementos da lista L Inserir X na posição 1 (índice 0) Atualizar o tamanho da lista, incrementando um valor a N Uma função que traduz o algoritmo é a que se segue, que recebe o elemento a inserir (X), uma lista (L) e o tamanho da lista (*N) e, devolve a lista e o seu tamanho atualizados. void InserirInicio (ELEMENTO X, ELEMENTO L[], int *N) { int k; *N = *N + 1; // atualizar o tamanho da lista, incrementando um valor for (k = *N-1; k > 0; k--) L[k] = L[k-1]; // avançar todos os elementos da lista uma posição L[0] = X; // colocar o elemento X na 1ª posição (índice 0) Ordem complexidade (pior caso): O(N). Prova: C = 0 e A = (N 1) + 2 = N + 1; C + A = N Inserir no fim Aqui apenas é necessário introduzir o novo elemento na posição seguinte à do último elemento da lista, passando a ser este novo elemento o último da lista. Um possível algoritmo é o que se segue. Dados de entrada: o elemento X, a lista L e o tamanho da lista (N) Dados de saída: a lista L e o seu tamanho (N) atualizados Inserir X na posição N+1 (uma posição à frente do último elemento da lista) Atualizar o tamanho da lista, incrementando um valor a N Uma função que traduz o algoritmo é a que se segue, que recebe o elemento a inserir (X), uma lista (L) e o seu tamanho (*N) e, devolve a lista L e o seu tamanho atualizados. void InserirFim (ELEMENTO X, ELEMENTO L[], int *N) { *N = *N + 1; // atualizar o tamanho da lista, incrementando um valor L[*N-1] = X; // colocar o elemento X na última posição (*N-1) Ordem complexidade (pior caso): O(0). Prova: C = 0 e A = 2.

12 10 Listas - armazenamento sequencial usando memória estática Inserir por ordem Este é o caso mais utilizado, começando-se por pesquisar a posição onde inserir o elemento, para depois se fazer avançar uma posição todos os elementos que se encontram depois da posição pesquisada, para que esta posição fique liberta para receber o novo valor. Um possível algoritmo é o que se segue. Dados de entrada: o elemento X, a lista L e o tamanho da lista (N) Dados de saída: a lista L e o seu tamanho atualizados (lista ordenada crescentemente) Determinar a posição k onde inserir o elemento X Avançar uma posição todos os elementos da lista L que estão depois da posição k Inserir X na posição k Atualizar o tamanho da lista, incrementando N em um valor A função que traduz o algoritmo é a que se segue, a qual recebe o elemento X a inserir, a lista L e o tamanho da lista (*N), e devolve a lista e o seu tamanho atualizados. void InserirOrdem (ELEMENTO X, ELEMENTO L[], int *N) { int k, pos = 0; while (pos < *N && L[pos].BI < X.BI) pos = pos + 1; // o elemento X deve ser inserido na posição pos da lista L *N = *N + 1; // atualizar o tamanho da lista, incrementando um valor for (k = *N-1; k > pos; k--) L[k] = L[k-1]; // avançar uma posição os elementos de L depois de pos L[pos] = X; // colocar o elemento X na posição pos Ordem complexidade (pior caso): O(N). Prova: C = N e A = 1 + k + (N k) + 2 = 3 + N; C + A = N N = x N Remover um elemento duma lista Este problema consiste em remover (eliminar) um dado elemento de uma lista, a qual pode ou não estar ordenada. No entanto, apesar destas duas situações serem diferentes, em termos algorítmicos essa diferença encontra-se apenas na forma de pesquisar a posição do elemento a remover. Para tal, basta apenas aplicar um dos métodos existentes para o efeito (ver Pesquisa exaustiva pág. 30), o que mais se adequar à lista: ordenada ou não

13 Listas - armazenamento sequencial usando memória estática 11 ordenada. No entanto, esta operação só deve ser realizada caso a lista não esteja vazia. Desta forma, um possível algoritmo é o que se segue. Dados de entrada: o elemento X, uma lista L e o tamanho da lista (N) Dados de saída: a lista L e o seu tamanho (N) atualizados k posição do elemento X na lista L (utilizar um dos métodos de pesquisa) Recuar uma posição todos os elementos posicionados depois da posição k Atualizar o tamanho da lista, decrementando N em um valor Uma função que traduz o algoritmo é a que se segue, a qual recebe o elemento a remover (X), uma lista ordenada (L) e o tamanho da lista (*N) e, devolve a lista e o seu tamanho atualizados. int Remover (ELEMENTO X, ELEMENTO L[], int *N) { int k, pos; pos = PesquisaExaustiva(X, L, *N); if (pos == -1) // o elemento a remover, X, não pertence à lista L return 0; // para indicar que o elemento X não foi removido for (k = pos; k < *N-1; k++) L[k] = L[k+1]; *N = *N 1; // atualizar o tamanho da lista, decrementando um valor return 1; // para indicar que o elemento X foi removido No entanto, a forma mais comum de tratar este problema não é fornecer o elemento a remover, mas sim apenas a posição daquele elemento, sendo o trabalho de pesquisa da posição do referido elemento, assim como a verificação se aquele elemento pertence ou não à lista, feito antes da remoção. Isto é, antes de se remover um elemento duma lista, verifica-se se aquele elemento pertence à lista e, caso pertença, em que posição se encontra, o que se pode fazer recorrendo a um dos métodos de pesquisa existentes (ver Pesquisa dum elemento numa lista, pág. 30). Um possível algoritmo é o que se segue. Dados de entrada: a posição (Pos) do elemento a remover, a lista L e o seu tamanho (N) Dados de saída: a lista L e o seu tamanho (N) atualizados Recuar uma posição todos os elementos que se encontram em posição após Pos Atualizar o tamanho da lista, decrementando N em um valor

14 12 Listas - armazenamento sequencial usando memória estática Uma função que traduz o algoritmo é a que se segue, a qual recebe a posição do elemento a remover (Pos), uma lista (L) e o tamanho da lista (N) e, devolve a lista L e o seu tamanho atualizados. void Remover (int Pos, ELEMENTO L[], int *N) { int k; for (k = Pos; k < *N-1; k++) L[k] = L[k+1]; // recuar uma posição os elementos desde k *N = *N 1; // atualizar o tamanho da lista, decrementando a *N um valor Ordem complexidade (pior caso): O(N). Prova: C = 0 e A = (N - 1) + 1 = N; C + A = N Listar/mostrar um elemento ou os elementos duma lista Uma das operações muito úteis é aquela que permite mostrar um ou todos os elementos de uma lista. Para mostrar apenas um elemento, um possível algoritmo é o seguinte: Dados de entrada: um elemento E Dados de saída: nada (apenas mostra no écran os dados do elemento dado) Para cada campo do elemento E fazer Mostrar informação Uma função que traduz o algoritmo é a que se segue, a qual recebe um elemento E e mostra no écran a informação que lhe está associada. void MostrarElemento (ELEMENTO E) { printf( Nome: ); puts(e.nome); printf( Morada: ); puts(e.morada); printf( Idade: %d\n, E.Idade); printf( BI: %d\n, E.BI); printf( Sexo: ); puts(e.sexo); printf( \n );

15 Listas - armazenamento sequencial usando memória estática 13 Para mostrar todos os elementos de uma lista, um possível algoritmo é o seguinte: Dados de entrada: uma lista L e o seu tamanho N Dados de saída: nada (apenas mostra no écran os dados dos elementos da lista L) Para cada elemento k da lista L fazer Mostrar o elemento da posição/índice k Uma função que traduz o algoritmo é a que se segue, a qual recebe uma lista L e o seu tamanho N e mostra no écran a informação que está associada a cada elemento de L. void MostrarLista (ELEMENTO L[], int N) { int k; for (k = 0; k < N; k++) { printf( L[%d]: \n, k); MostrarElemento(L[k]); printf( \n ); 2.9. Destruir uma lista Quando se pretende destruir uma lista, basta atribuir ao seu tamanho o valor nulo (N = 0). Um possível algoritmo para criar uma lista é o seguinte: Dados de entrada: o tamanho da lista (N) Dados de saída: o valor do tamanho da lista a nulo (N = 0) Atualizar ao tamanho da lista o valor 0 (N = 0) Uma função que traduz o algoritmo é a que se segue, a qual recebe o tamanho da lista (N = 0) e devolve a lista L com um elemento e o seu tamanho a valer 1. void DestruirLista (int *N) { *N = 0; Ordem complexidade (pior caso): O(0).

16 14 Listas - armazenamento sequencial usando memória dinâmica 3. Listas - armazenamento sequencial usando memória dinâmica 3.1. Introdução No caso da utilização de armazenamento sequencial com memória dinâmica, todos os elementos da Lista são mantidos num array (array dinâmico), cujo tamanho não é fixado quando o programa é escrito e vai sendo alterado à medida que o programa vai sendo executado, consoante as alterações que sofrerá. Quando se está a escrever um programa, apenas terá que se definir uma variável do tipo apontador para um elemento do tipo de dados da Lista, assim como uma variável para guardar o seu tamanho. Ou seja, no início apenas se declara um ponteiro que receberá o endereço do primeiro elemento do array (ou Lista), mas que no início não tem elementos (tamanho nulo). Desta forma, a memória necessária para armazenar cada elemento do array será reservada à medida que um novo elemento é inserido na Lista e libertada à medida que os elementos são removidos, sendo que os elementos são inseridos sequencialmente na memória. No entanto, e no que respeita às restantes operações a efetuar sobre um array dinâmico (ou Lista), estas são efetuadas exatamente da mesma forma como é feita sobre um array estático. Numa lista cada um dos elementos consiste no seguinte: 1. Dados; 2. Chave (opcional) campo pelo qual a lista está ordenada; 3. Localização (índice) na lista. Numa lista L: O elemento de índice 0 (primeira posição L[0]) não tem antecessor; O elemento de índice N-1 (última posição L[N-1]) não tem sucessor; O elemento da lista com índice k tem: - o elemento de índice k-1 como seu antecessor, - o elemento de índice k+1 como seu sucessor. Numa lista de N elementos, pode ser inserido ou eliminado um elemento, donde, se N = 3 então a lista contém somente 3 elementos, se N = 19 então a lista contém 19 elementos o tamanho da lista é variável. Uma lista é, por definição, uma estrutura dinâmica de dados porque o seu tamanho pode variar. Um array dinâmico é também uma estrutura de dados variável porque o seu tamanho é atualizado à medida que o programa vai sendo executado.

17 Listas - armazenamento sequencial usando memória dinâmica 15 Os conceitos de lista e array dinâmico estão relacionados uma vez que uma lista de tamanho variável pode ser implementada usando um array com tamanho variável, aumentando ou diminuindo de tamanho à medida que novos elementos são inseridos ou elementos são removidos. Existem diferentes formas de implementar uma lista e não se deve confundir decisões de implementação com decisões de escolha e especificação da estrutura de dados. Exemplo: uma lista com 50 elementos (valores inteiros) numa primeira fase, que passa para 100 elementos numa segunda fase. int *Lista, N, k; N = 50; Lista = (int *) malloc (N*sizeof(int)); for (k = 0; k < N; k++) scanf( %d, &Lista[k]); N = 100; Lista = (int *) realloc (Lista, N*sizeof(int)); for (k = 50; k < N; k++) scanf( %d, &Lista[k]); N = 102; Lista = (int *) realloc (Lista, N*sizeof(int)); for (k = 100; k < N; k++) scanf( %d, &Lista[k]); Características fundamentais: Tamanho máximo: variável eficiência Tamanho atual: necessário atualizar (testar disponibilidade de memória antes de aumentar o tamanho para inserir novos elementos). Acesso: direto Reordenamento trocas (ou vetor auxiliar) Inserção/Remoção de elementos deslocamento de todos os elementos seguintes

18 16 Listas - armazenamento sequencial usando memória dinâmica 3.2. Declaração Os elementos de uma lista podem ser definidos como um tipo qualquer simples (por exemplo, inteiro, real ou carácter) ou estruturado (por exemplo, registo). Como se disse, uma lista pode ser definida como um vetor (array). Portanto, antes de se definir uma lista tem que se definir os elementos da lista. Considere-se, por exemplo, as seguintes definições em linguagem C: typedef struct { char Nome[50], Morada[50]; int Idade, BI; char Sexo[1]; // Masculino(M/m) ou Feminino(F/f) ELEMENTO; ELEMENTO *Lista; int N; Nesta lista, cada um dos elementos consiste no seguinte: 1. Dados informação associada (Nome, Morada, Idade, BI e Sexo) 2. Chave campo que servirá de base para ordenar a lista (por exemplo, o Nome) 3. N número de elementos (tamanho) da Lista 4. Localização é o índice que lhe está associado (entre 0 e N-1). Nos capítulos seguintes, sempre que se referir à ordenação da lista, é suposto ser por ordem crescente do campo Chave, se nada se disser em contrário Criar um elemento Quando se pretende inserir um novo elemento numa lista, este deve ser criado antes; isto é, atribuir valores a todos os campos da estrutura que suporta a informação associada a cada elemento da lista. Um possível algoritmo para criar um elemento é o seguinte: Dados de entrada: nada Dados de saída: retorna o endereço de um elemento E (criado e preenchido com a informação desejada localmente, usando alocação de memória) Para cada campo do elemento E fazer Pedir informação Introduzir informação

19 Listas - armazenamento sequencial usando memória dinâmica 17 Uma função que traduz o algoritmo é a que se segue (a função apresentada no capítulo anterior para o mesmo efeito também serve), a qual recebe um elemento E sem informação e devolve o elemento E com a informação desejada introduzida. ELEMENTO *CriarElemento { ELEMENTO *E; E = (ELEMENTO *) malloc(sizeof(elemento)); if (E == NULL) return NULL; printf( Insira o nome : \n ); fflush(stdin); gets(e->nome); printf( Insira a morada : \n ); fflush(stdin); gets(e->morada); printf( Insira a idade : \n ); scanf( %d, &(E->Idade)); printf( Insira o BI : \n ); scanf( %d, &(E->BI)); printf( Insira o sexo (M/m; F/f) : \n ); fflush(stdin); gets(e->sexo); return E; Ordem complexidade (pior caso): O(0) Criar uma lista Quando se pretende criar uma lista, isto deve ser realizado com a introdução de um elemento (que será o primeiro). Um possível algoritmo para criar uma lista é o seguinte: Dados de entrada: o tamanho da lista (que é o) Dados de saída: a lista L com um só elemento e o seu tamanho (que é 1)

20 18 Listas - armazenamento sequencial usando memória dinâmica Criar um novo elemento Inserir o novo elemento na posição 1 (índice 0) da lista L (L[0]) Atualizar o tamanho da lista, atribuindo o valor 1 a N Uma função que traduz o algoritmo é a que se segue, a qual recebe o tamanho da lista (N = 0) e devolve a lista L com um elemento e o seu tamanho a valer 1. ELEMENTO *CriarLista (int *N) { ELEMENTO *L, *E; E = CriarElemento(); L = (ELEMENTO *) malloc(sizeof(elemento)); if (L == NULL) return NULL; L[0] = *E; *N = 1; free(e); return L; Ordem complexidade (pior caso): O(0) Lista vazia e lista cheia Uma lista está vazia quando não tem qualquer elemento e, está cheia quando não existe memória que permita acrescentar mais elementos à lista L. Para se verificar se uma lista está vazia, basta analisar o valor da variável N (se é nulo) ou o endereço contido em L (se for NULL, L está vazia), da seguinte forma: if (N == 0) ou if (L == NULL) Uma lista está cheia se a alocação de memória para mais um elemento não for conseguida; ou seja: V = (ELEMENTO *) realloc ((N+1) * sizeof(elemento)) if (V == NULL) return 1; // realocação de memória não conseguida (lista cheia) Uma função para verificar se uma lista está vazia, pode ser um dos dois que se seguem: o primeiro recebe uma lista (L) e o segundo recebe o tamanho de uma lista (N), e ambos devolvem o valor 1 (lista vazia) ou 0 (lista não vazia).

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

BUSCA EM LISTAS LISTAS SEQÜENCIAIS, LISTAS SIMPLESMENTE E DUPLAMENTE ENCADEADAS E LISTAS CIRCULARES BUSCA EM LISTAS LISTAS SEQÜENCIAIS, LISTAS SIMPLESMENTE E DUPLAMENTE ENCADEADAS E LISTAS CIRCULARES ALGORITMOS DE BUSCA EM LISTAS COM ALOCAÇÃO SEQÜENCIAL Busca em Listas Lineares A operação de busca é

Leia mais

Busca. Pesquisa sequencial

Busca. Pesquisa sequencial Busca Banco de dados existem para que, de tempos em tempos, um usuário possa localizar o dado de um registro, simplesmente digitando sua chave. Uma tabela ou um arquivo é um grupo de elementos, cada um

Leia mais

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

Estruturas de Dados. Prof. Gustavo Willam Pereira Créditos: Profa. Juliana Pinheiro Campos Estruturas de Dados Prof. Gustavo Willam Pereira Créditos: Profa. Juliana Pinheiro Campos Árvores Conceitos Árvores binárias Árvores binárias de pesquisa Árvores binárias balanceadas Árvores ESTRUTURAS

Leia mais

EAD Árvore árvore binária

EAD Árvore árvore binária EAD Árvore árvore binária - Uma árvore binária é um conjunto finito de elementos (nodos) que pode ser vazio ou particionado em três subconjuntos: - raiz da árvore (elemento inicial, que é único); - subárvore

Leia mais

Árvores Binárias de Busca

Árvores Binárias de Busca Árvores Binárias de Busca Uma Árvore Binária de Busca T (ABB) ou Árvore Binária de Pesquisa é tal que ou T = 0 e a árvore é dita vazia ou seu nó contém uma chave e: 1. Todas as chaves da sub-árvore esquerda

Leia mais

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

Pesquisa em Memória Primária. Prof. Jonas Potros Pesquisa em Memória Primária Prof. Jonas Potros Pesquisa em Memoria Primária Estudo de como recuperar informação a partir de uma grande massa de informação previamente armazenada. A informação é dividida

Leia mais

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

Prof. Yandre Maldonado - 1 PONTEIROS. Prof. Yandre Maldonado e Gomes da Costa Prof. Yandre Maldonado - 1 PONTEIROS Prof. Yandre Maldonado e Gomes da Costa PONTEIROS Prof. Yandre Maldonado - 2 Ponteiro é uma variável que possui o endereço de outra variável; É um poderoso recurso

Leia mais

Árvores Binárias de Busca

Árvores Binárias de Busca Árvores Binárias de Busca Definição Uma Árvore Binária de Busca possui as mesmas propriedades de uma AB, acrescida da seguinte propriedade: Para todo nó da árvore, se seu valor é X, então: Os nós pertencentes

Leia mais

INF 1007 Programação II

INF 1007 Programação II INF 1007 Programação II Aula 14 Árvores Binárias Edirlei Soares de Lima Árvores Uma estrutura de dados do tipo árvore permite que dados sejam organizados de maneira hierárquica.

Leia mais

1/36 LISTAS. Programação II

1/36 LISTAS. Programação II 1/36 LISTAS Estrutura de Dados 2/36 Estrutura de Dados Definição - Uma Estrutura de Dados é: - uma coleção de tipos de dados, composta por tipos não estruturados básicos, tipos estruturados ou uma mistura

Leia mais

Estruturas de Dados I

Estruturas de Dados I UFES - Curso de verão 2011 Estruturas de Dados I Profa. Juliana Pinheiro Campos jupcampos@gmail.com Árvores binárias de busca (ou São árvores projetadas para dar suporte a operações de busca de forma eficiente.

Leia mais

Pesquisa Sequencial e Binária

Pesquisa Sequencial e Binária Pesquisa Sequencial e Binária Prof. Túlio Toffolo http://www.toffolo.com.br BCC202 Aula 20 Algoritmos e Estruturas de Dados I Pesquisa em Memória Primária Introdução - Conceitos Básicos Pesquisa Sequencial

Leia mais

Métodos Computacionais. Árvores

Métodos Computacionais. Árvores Métodos Computacionais Árvores Árvores Vetores e Listas são ótimos para representar estrutura de dados lineares, mas não para modelar dados hierárquicos Exemplos de dados hierárquicos: sistema de arquivos

Leia mais

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

1. Introdução... 1 1.1. Definição... 1 1.2. Conceitos relacionados... 2 Índice i Índice Capítulo 4 Estrutura de Dados não sequencial com armazenamento não sequencial ( Árvore ) 1. Introdução... 1 1.1. Definição... 1 1.2. Conceitos relacionados... 2 2. Árvores binárias... 2

Leia mais

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

INF1007: Programação 2 10 Árvores Binárias. (c) Dept. Informática - PUC-Rio 1 INF1007: Programação 2 10 Árvores Binárias (c) Dept. Informática - PUC-Rio 1 Tópicos Principais Introdução Árvores binárias Representação em C Ordens de percurso em árvores binárias Altura de uma árvore

Leia mais

2ª Lista de Exercícios

2ª Lista de Exercícios Universidade Federal de Minas Gerais Departamento de Ciência da Computação Algoritmos e Estruturas de Dados II (Turmas M, N, W, F) 1º Semestre de 2012 Profs. Camilo Oliveira, Gisele Pappa, Ítalo Cunha,

Leia mais

Linguagem C: Árvores Binarias

Linguagem C: Árvores Binarias Instituto de C Linguagem C: Árvores Binarias Luis Martí Instituto de Computação Universidade Federal Fluminense lmarti@ic.uff.br - http://lmarti.com Tópicos Principais Introdução Árvores binárias Implementação

Leia mais

DAS5102 Fundamentos da Estrutura da Informação

DAS5102 Fundamentos da Estrutura da Informação Pilhas A estrutura de dados Pilha emula a forma de organização de objetos intuitiva que é utilizada diariamente nos mais diversos contextos da vida humana. Containeres são empilhados e desempilhados diariamente

Leia mais

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

Pesquisa em Memória Primária. Algoritmos e Estruturas de Dados II Pesquisa em Memória Primária Algoritmos e Estruturas de Dados II Pesquisa em Memória Primária Pesquisa: Recuperação de informação em um grande volume de dados Informação é dividida em registros e cada

Leia mais

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

ESTRUTURAS DE DADOS I. Notas de Aula. Prof. Dr. Gilberto Nakamiti ESTRUTURAS DE DADOS I Notas de Aula 1 SUMÁRIO 1. INTRODUÇÃO... 2 1.1 Array (vetores)... 2 2. BUSCA DE ELEMENTOS... 3 2.1 Busca Seqüencial... 3 2.2 Busca Binária... 3 2.3 Busca Indexada... 3 2.4 Busca Hash...

Leia mais

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

Métodos de Pesquisa em Memória Primária Algoritmos e Estrutura de Dados II Métodos de Pesquisa em Memória Primária Prof Márcio Bueno ed2tarde@marciobueno.com / ed2noite@marciobueno.com Pesquisa Por pesquisa (procura ou busca) entende-se o ato

Leia mais

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

Programas operam sobre dados. Dados são relacionados e possuem estrutura. Como representar e manipular dados em um computador Programas operam sobre dados Dados são relacionados e possuem estrutura Como representar e manipular dados em um computador Para representar um baralho precisamos: Representar cartas: naipe e valor struct

Leia mais

Análise de complexidade

Análise de complexidade Introdução Algoritmo: sequência de instruções necessárias para a resolução de um problema bem formulado (passíveis de implementação em computador) Estratégia: especificar (definir propriedades) arquitectura

Leia mais

EAD Árvore - representação usando listas ligadas

EAD Árvore - representação usando listas ligadas 4.1. Definição É uma árvore binária em que os seus nodos têm associado uma chave, que - determina a sua posição de colocação na árvore e - obedece às seguintes regras: a chave de um nodo é - maior do que

Leia mais

Programação de Computadores I. Ponteiros

Programação de Computadores I. Ponteiros Ponteiros Prof. Edwar Saliba Júnior Outubro de 2012 Unidade 13 Ponteiros 1 Identificadores e Endereços Na linguagem C, uma declaração de variável faz associação entre um identificador e endereços de memória;

Leia mais

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

ALGORITMOS E ESTRUTURAS DE DADOS CES-11 CES-11 CES-11 ALGORITMOS E ESTRUTURAS DE DADOS Prof. Paulo André Castro pauloac@ita.br Sala 110 Prédio da Computação www.comp.ita.br/~pauloac IECE - ITA Uma árvore binária é: uma árvore vazia; ou uma árvore onde qualquer

Leia mais

EAD Fila. - algumas operações realizam-se na frente/cabeça e outras na cauda da Fila

EAD Fila. - algumas operações realizam-se na frente/cabeça e outras na cauda da Fila EAD Fila - os seus elementos são processados por ordem de chegada: - o primeiro elemento a entrar na Fila é o primeiro a sair - FIFO ( First In First Out ). - algumas operações realizam-se na frente/cabeça

Leia mais

Árvore Binária de Busca

Árvore Binária de Busca Árvore Binária de Busca 319 Árvore Binária de Busca! construída de tal forma que, para cada nó:! nós com chaves menores estão na sub-árvore esquerda! nós com chaves maiores (ou iguais) estão na subárvore

Leia mais

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

INF1007 - PROGRAMAÇÃO II LISTA DE EXERCÍCIOS 15 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

Leia mais

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

Figura 13.1: Um exemplo de árvore de diretório. 13. Árvores W. Celes e J. L. Rangel Nos capítulos anteriores examinamos as estruturas de dados que podem ser chamadas de unidimensionais ou lineares, como vetores e listas. A importância dessas estruturas

Leia mais

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

Algoritmos e Estrutura de Dados. Prof. Tiago A. E. Ferreira Algoritmos e Estrutura de Dados Aula 7 Estrutura de Dados: Listas Prof. Tiago A. E. Ferreira Introdução Um das formas mais usadas para se manter dados agrupados é a lista Lista de compras, itens de estoque,

Leia mais

Possui como idéia central a divisão de um universo de dados a ser organizado em subconjuntos mais gerenciáveis.

Possui como idéia central a divisão de um universo de dados a ser organizado em subconjuntos mais gerenciáveis. 3. Tabelas de Hash As tabelas de hash são um tipo de estruturação para o armazenamento de informação, de uma forma extremamente simples, fácil de se implementar e intuitiva de se organizar grandes quantidades

Leia mais

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

Introdução a Programação. Ponteiros e Strings, Alocação Dinâmica Introdução a Programação Ponteiros e Strings, Alocação Dinâmica Tópicos da Aula Hoje aprenderemos a relação entre ponteiros e strings Ponteiros para strings X Vetores de Caracteres Vetores de ponteiros

Leia mais

Trabalho 3: Agenda de Tarefas

Trabalho 3: Agenda de Tarefas INF 1620 Estruturas de Dados Semestre 08.2 Trabalho 3: Agenda de Tarefas O objetivo deste trabalho é a implementação de um conjunto de funções para a manipulação de uma agenda de tarefas diárias, de forma

Leia mais

Orientação a Objetos

Orientação a Objetos 1. Domínio e Aplicação Orientação a Objetos Um domínio é composto pelas entidades, informações e processos relacionados a um determinado contexto. Uma aplicação pode ser desenvolvida para automatizar ou

Leia mais

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

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 Tabela de Símbolos Análise Semântica A Tabela de Símbolos Fabiano Baldo Após a árvore de derivação, a tabela de símbolos é o principal atributo herdado em um compilador. É possível, mas não necessário,

Leia mais

Árvores Binárias e Busca. Jeane Melo

Árvores Binárias e Busca. Jeane Melo Árvores Binárias e Busca Jeane Melo Roteiro Parte 1 Árvores Relação hierárquica Definição Formal Terminologia Caminhamento em Árvores Binárias Exemplos Parte 2 Busca seqüencial Busca Binária Grafos Conjunto

Leia mais

Algoritmos de pesquisa. Tabelas de dispersão/hash

Algoritmos de pesquisa. Tabelas de dispersão/hash Algoritmos de pesquisa Tabelas de dispersão/hash Introdução Motivação: Considerar o problema de pesquisar um determinado valor num vetor (array). Se o vetor não está ordenado, a pesquisa requer O(n) de

Leia mais

PROGRAMAÇÃO ESTRUTURADA. CC 2º Período

PROGRAMAÇÃO ESTRUTURADA. CC 2º Período PROGRAMAÇÃO ESTRUTURADA CC 2º Período PROGRAMAÇÃO ESTRUTURADA Aula 06: Ponteiros Declarando e utilizando ponteiros Ponteiros e vetores Inicializando ponteiros Ponteiros para Ponteiros Cuidados a serem

Leia mais

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

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

Leia mais

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

Pesquisa em Memória Primária. Prof. Jonas Potros Pesquisa em Memória Primária Prof. Jonas Potros Procedimento para Inserir na Árvore Binária Critérios: Atingir um ponteiro nulo em um processo de pesquisa significa uma pesquisa sem sucesso. O ponteiro

Leia mais

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

ESTRUTURAS DE DADOS AVANÇADAS (INF 1010) (a) Seja um TAD definido por uma lista circular implementada em um vetor. PUC-Rio Departamento de Informática Período: 2015.1 Horário: 2as-feiras e 4as-feiras de 17-19 30 de março de 2015 ESTRUTURAS DE DADOS AVANÇADAS (INF 1010) 1 a Lista de Exercícios 1. Lista (a) Seja um TAD

Leia mais

Pesquisa: localização de um Registo num Ficheiro (para aceder ao registo: ler/alterar informação) R. P. António Viera, 23. R. Carlos Seixas, 9, 6º

Pesquisa: localização de um Registo num Ficheiro (para aceder ao registo: ler/alterar informação) R. P. António Viera, 23. R. Carlos Seixas, 9, 6º Pesquisa Pesquisa: localização de um Registo num Ficheiro (para aceder ao registo: ler/alterar informação) Ficheiro (ou tabela) Campos Nome Endereço Telefone Antunes, João A. R. P. António Viera, 23 720456

Leia mais

Algoritmos de Busca em Tabelas

Algoritmos de Busca em Tabelas Dentre os vários algoritmos fundamentais, os algoritmos de busca em tabelas estão entre os mais usados. Considere por exemplo um sistema de banco de dados. As operações de busca e recuperação dos dados

Leia mais

Árvores Binárias - continuação

Árvores Binárias - continuação Tópicos Avançados em Estrutura de Dados 6º Período Ciência da Computação Uma Aplicação de Árvores Binárias Árvores Binárias - continuação As árvore binárias são estruturas importantes toda vez que uma

Leia mais

CT-234. Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches

CT-234. Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches CT-234 Estruturas de Dados, Análise de Algoritmos e Complexidade Estrutural Carlos Alberto Alonso Sanches CT-234 4) Árvores balanceadas AVL, Rubro-Negras, B-Trees Operações em árvores binárias de busca

Leia mais

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo. Cursos: Análise, Ciência da Computação e Sistemas de Informação Programação I - Prof. Aníbal Notas de aula 8 ARRAYS Introdução Até agora, utilizamos variáveis individuais. Significa que uma variável objeto

Leia mais

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

FACULDADE CAMPO LIMPO PAULISTA MESTRADO EM CIÊNCIA DA COMPUTAÇÃO. Projeto e Análise de Algoritmos II Lista de Exercícios 2 FACULDADE CAMPO LIMPO PAULISTA MESTRADO EM CIÊNCIA DA COMPUTAÇÃO Projeto e Análise de Algoritmos II Lista de Exercícios 2 Prof. Osvaldo. 1. Desenvolva algoritmos para as operações abaixo e calcule a complexidade

Leia mais

PROGRAMAÇÃO II 4. ÁRVORE

PROGRAMAÇÃO II 4. ÁRVORE 4. ÁRVORE PROGRAMAÇÃO II Prof. Jean Eduardo Glazar Uma árvore impõe uma estrutura hierárquica em uma coleção de itens. Um exemplo familiar é a árvore genealógica. Árvores despontam de forma natural em

Leia mais

Análises Geração RI (representação intermediária) Código Intermediário

Análises Geração RI (representação intermediária) Código Intermediário Front-end Análises Geração RI (representação intermediária) Código Intermediário Back-End Geração de código de máquina Sistema Operacional? Conjunto de Instruções do processador? Ambiente de Execução O

Leia mais

Tabelas vista de estrutura

Tabelas vista de estrutura Tabelas vista de estrutura A vista de estrutura permite definir a configuração dos dados Vamos adicionar os restantes campos à tabela carros, de acordo com o modelo de dados feito no papel 47 Tabelas vista

Leia mais

2. OPERADORES... 6 3. ALGORITMOS, FLUXOGRAMAS E PROGRAMAS... 8 4. FUNÇÕES... 10

2. OPERADORES... 6 3. ALGORITMOS, FLUXOGRAMAS E PROGRAMAS... 8 4. FUNÇÕES... 10 1. TIPOS DE DADOS... 3 1.1 DEFINIÇÃO DE DADOS... 3 1.2 - DEFINIÇÃO DE VARIÁVEIS... 3 1.3 - VARIÁVEIS EM C... 3 1.3.1. NOME DAS VARIÁVEIS... 3 1.3.2 - TIPOS BÁSICOS... 3 1.3.3 DECLARAÇÃO DE VARIÁVEIS...

Leia mais

Árvores Balanceadas. Árvore binária completamente balanceada. Ocorre quando a árvore está cheia ou quase cheia com o nível n-1 completo

Árvores Balanceadas. Árvore binária completamente balanceada. Ocorre quando a árvore está cheia ou quase cheia com o nível n-1 completo Árvores Balanceadas As árvores binárias de pesquisa são, em alguns casos, pouco recomendáveis para as operações básicas (inserção, remoção e busca) Árvores binárias de pesquisa degeneradas tornam as operações

Leia mais

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

UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA Responda 1) Quem desenvolveu a linguagem C? Quando? 2) Existe alguma norma sobre a sintaxe da linguagem C? 3) Quais são os tipos básicos de dados disponíveis na linguagem C? 4) Quais são as principais

Leia mais

ÁRVORES BINÁRIAS DE PESQUISA

ÁRVORES BINÁRIAS DE PESQUISA ÁRVORES BINÁRIAS DE PESQUISA Árvores binárias de pesquisa são uma estrutura alternativa do tipo árvore binária, para guardar valores de tal forma que a recuperação dos mesmos pode ser efectuada de forma

Leia mais

Árvores Binárias Balanceadas

Árvores Binárias Balanceadas Árvores Binárias Balanceadas Elisa Maria Pivetta Cantarelli Árvores Balanceadas Uma árvore é dita balanceada quando as suas subárvores à esquerda e à direita possuem a mesma altura. Todos os links vazios

Leia mais

Algoritmos e Estrutura de Dados III. Árvores

Algoritmos e Estrutura de Dados III. Árvores Algoritmos e Estrutura de Dados III Árvores Uma das mais importantes classes de estruturas de dados em computação são as árvores. Aproveitando-se de sua organização hierárquica, muitas aplicações são realizadas

Leia mais

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

Estrutura da linguagem de programação C Prof. Tiago Eugenio de Melo tiago@comunidadesol.org Estrutura da linguagem de programação C Prof. Tiago Eugenio de Melo tiago@comunidadesol.org Breve Histórico A linguagem de programação C foi criada na década de 70, por Dennis Ritchie, que a implementou,

Leia mais

FUNDAÇÃO EDUCACIONAL DE ITUIUTABA

FUNDAÇÃO EDUCACIONAL DE ITUIUTABA FUNDAÇÃO EDUCACIONAL DE ITUIUTABA ASSOCIADA À UNIVERSIDADE DO ESTADO DE MINAS GERAIS CURSO DE SISTEMA DE INFORMAÇÃO PILHA E FILA Prof. Walteno Martins Parreira Júnior www.waltenomartins.com.br waltenomartins@yahoo.com

Leia mais

INF 1010 Estruturas de Dados Avançadas

INF 1010 Estruturas de Dados Avançadas INF 1010 Estruturas de Dados Avançadas Listas de Prioridades e Heaps 1 Listas de Prioridades Em muitas aplicações, dados de uma coleção são acessados por ordem de prioridade A prioridade associada a um

Leia mais

Busca em Memória. Secundária

Busca em Memória. Secundária UNIVERSIDADE ESTADUAL DE MARINGÁ DEPARTAMENTO DE INFORMÁTICA Busca em Memória Secundária e Gomes da Costa yandre@din.uem.br 1 Busca de um item em uma massa de dados que não cabe na memória principal; Procura-se

Leia mais

Ficheiros binários 1. Ficheiros binários

Ficheiros binários 1. Ficheiros binários Ficheiros binários 1 Ficheiros binários 1. Considere que dispõe de ficheiros binários cujo conteúdo é constituído por uma ou mais estruturas como a indicada a seguir struct registo { int ref; float var;

Leia mais

DAS5102 Fundamentos da Estrutura da Informação

DAS5102 Fundamentos da Estrutura da Informação Fila de Prioridade A fila de prioridade nada mais é que uma fila comum que permite que elementos sejam adicionados associados com uma prioridade. Cada elemento na fila deve possuir um dado adicional que

Leia mais

CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES

CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES 3.1 - IDENTIFICADORES Os objetos que usamos no nosso algoritmo são uma representação simbólica de um valor de dado. Assim, quando executamos a seguinte instrução:

Leia mais

Pragmática das Linguagens de Programação 2004/2005

Pragmática das Linguagens de Programação 2004/2005 Instituto Superior Técnico Pragmática das Linguagens de Programação 2004/2005 Segundo Exame 11/2/2005 Número: Turma: Nome: Escreva o seu número em todas as folhas do teste. O tamanho das respostas deve

Leia mais

Hashing. Rafael Nunes LABSCI-UFMG

Hashing. Rafael Nunes LABSCI-UFMG Hashing Rafael Nunes LABSCI-UFMG Sumário Mapeamento Hashing Porque utilizar? Colisões Encadeamento Separado Endereçamento Aberto Linear Probing Double Hashing Remoção Expansão Quando não usar! Mapeamento

Leia mais

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

- UNIVERSIDADE DO VALE DO RIO DOS SINOS CIÊNCIAS EXATAS E TECNOLÓGICAS Curso: Informática / Ciência da Computação Programação 1I Prof. Osório Árvores Binárias Pag.: 1 - UNIVERSIDADE DO VALE DO RIO DOS SINOS CIÊNCIAS EXATAS E TECNOLÓGICAS Curso: Informática / Ciência da Computação Programação II Disciplina: Linguagem

Leia mais

struct LISTA item quant

struct LISTA item quant UNIVERSIDADE SÃO JUDAS TADEU ESTRUTURA DE DADOS - PROF. H. Senger IMPLEMENTAÇÃO DE LISTAS COM VETORES A implementação de listas utilizando vetores é simples. Existe apenas uma pequena questão, com relação

Leia mais

Capítulo 2: Introdução à Linguagem C

Capítulo 2: Introdução à Linguagem C Capítulo 2: Introdução à Linguagem C INF1005 Programação 1 Pontifícia Universidade Católica Departamento de Informática Programa Programa é um algoritmo escrito em uma linguagem de programação. No nosso

Leia mais

Resumo da Matéria de Linguagem de Programação. Linguagem C

Resumo da Matéria de Linguagem de Programação. Linguagem C Resumo da Matéria de Linguagem de Programação Linguagem C Vitor H. Migoto de Gouvêa 2011 Sumário Como instalar um programa para executar o C...3 Sintaxe inicial da Linguagem de Programação C...4 Variáveis

Leia mais

Comandos Sequenciais if else, e Switch

Comandos Sequenciais if else, e Switch Introdução à Programação Comandos Sequenciais if else, e Switch 1º ano - ESI e IGE (2011/2012) Engenheiro Anilton Silva Fernandes (afernandes@unipiaget.cv) O computador pensa? Muitas vezes utiliza-se a

Leia mais

OPERADORES E ESTRUTURAS DE CONTROLE

OPERADORES E ESTRUTURAS DE CONTROLE OPERADORES E ESTRUTURAS DE CONTROLE 3.1 Operadores Os operadores indicam o tipo de operação matemática que será executada gerando novos valores a partir de um ou mais operadores. São muito utilizados em

Leia mais

Algoritmos e Programação Estruturada

Algoritmos e Programação Estruturada Algoritmos e Programação Estruturada Virgínia M. Cardoso Linguagem C Criada por Dennis M. Ritchie e Ken Thompson no Laboratório Bell em 1972. A Linguagem C foi baseada na Linguagem B criada por Thompson.

Leia mais

Armazenamento de Dados. Prof. Antonio Almeida de Barros Junior

Armazenamento de Dados. Prof. Antonio Almeida de Barros Junior Armazenamento de Dados Prof. Antonio Almeida de Barros Junior 1 Armazenamento de Dados Todos os dados que utilizamos até o momento, ficavam armazenados apenas na memória. Ao final da execução dos programas,

Leia mais

20 Caracteres - Tipo char

20 Caracteres - Tipo char 0 Caracteres - Tipo char Ronaldo F. Hashimoto e Carlos H. Morimoto Até agora vimos como o computador pode ser utilizado para processar informação que pode ser quantificada de forma numérica. No entanto,

Leia mais

Algoritmos e Programação _ Departamento de Informática

Algoritmos e Programação _ Departamento de Informática 16 ARQUIVOS Um arquivo corresponde a um conjunto de informações (exemplo: uma estrutura de dados-registro), que pode ser armazenado em um dispositivo de memória permanente, exemplo disco rígido. As operações

Leia mais

Estrutura de Dados. Introdução a Ponteiros. Prof. Gerson Borges Estrutura de Dados I 1

Estrutura de Dados. Introdução a Ponteiros. Prof. Gerson Borges Estrutura de Dados I 1 Estrutura de Dados Introdução a Ponteiros Prof. Gerson Borges Estrutura de Dados I 1 Sumário è Explicação da importância do planejamento de ensino; è Métodos e técnicas que iremos trabalhar durante o semestre;

Leia mais

P r o g r a m a ç ã o d e C o m p u t a d o r e s 1 o S e m - 2 0 1 3 P r o f. A n d r é A m a r a n t e L u i z L A B 5 tag %2d while printf PE1:

P r o g r a m a ç ã o d e C o m p u t a d o r e s 1 o S e m - 2 0 1 3 P r o f. A n d r é A m a r a n t e L u i z L A B 5 tag %2d while printf PE1: Inteligência É a faculdade de criar objetos artificiais, especialmente ferramentas para fazer ferramentas. Henri Bergson. WHILE Além dos comandos if-else e switch, o controle de fluxo de um programa pode

Leia mais

Persistência de Dados

Persistência de Dados Persistência de s Universidade do Estado de Santa Catarina - Udesc Centro de Ciências Tecnológicas - CCT Departamento de Ciência da Computação Tecnologia de Sistemas de Informação Estrutura de s II - DAD

Leia mais

Universidade da Beira Interior Cursos: Matemática /Informática e Ensino da Informática

Universidade da Beira Interior Cursos: Matemática /Informática e Ensino da Informática Folha 1-1 Introdução à Linguagem de Programação JAVA 1 Usando o editor do ambiente de desenvolvimento JBUILDER pretende-se construir e executar o programa abaixo. class Primeiro { public static void main(string[]

Leia mais

A memória é um recurso fundamental e de extrema importância para a operação de qualquer Sistema Computacional; A memória trata-se de uma grande

A memória é um recurso fundamental e de extrema importância para a operação de qualquer Sistema Computacional; A memória trata-se de uma grande A memória é um recurso fundamental e de extrema importância para a operação de qualquer Sistema Computacional; A memória trata-se de uma grande região de armazenamento formada por bytes ou palavras, cada

Leia mais

Programação III / Estruturas de Dados. Enunciado do Trabalho Prático

Programação III / Estruturas de Dados. Enunciado do Trabalho Prático Programação III / Estruturas de Dados Enunciado do Trabalho Prático 1. Objectivo Pretende-se implementar uma base de dados que sirva para ajudar uma agência de viagens a planear as viagens a realizar pelos

Leia mais

Algoritmos e Estruturas de Dados

Algoritmos e Estruturas de Dados Introdução aos Algoritmos e Estruturas de Dados 2 o Teste - A Ano lectivo: 2010/2011 2 o Semestre RESOLUÇÃO DO 2 o TESTE Grupo I (2.0 + 2.5 + 2.0 = 6.5 val.) I.a) Considere os tipos enum ocasiao e Presente

Leia mais

Algoritmos e Programação

Algoritmos e Programação Universidade Federal do Vale do São Francisco Curso de Engenharia da Produção / Elétrica Algoritmos e Programação Parte 05 Prof. Jorge Cavalcanti jorge.cavalcanti@univasf.edu.br www.univasf.edu.br/~jorge.cavalcanti

Leia mais

IFTO LÓGICA DE PROGRAMAÇÃO AULA 05

IFTO LÓGICA DE PROGRAMAÇÃO AULA 05 IFTO LÓGICA DE PROGRAMAÇÃO AULA 05 Prof. Manoel Campos da Silva Filho Tecnólogo em Processamento de Dados / Unitins Mestre em Engenharia Elétrica / UnB http://lab.ifto.edu.br/~mcampos http://manoelcampos.com

Leia mais

Unidade IV: Ponteiros, Referências e Arrays

Unidade IV: Ponteiros, Referências e Arrays Programação com OO Acesso em Java a BD Curso: Técnico em Informática Campus: Ipanguaçu José Maria Monteiro Pontifícia Universidade Católica do Rio de Janeiro PUC-Rio Departamento Clayton Maciel de Informática

Leia mais

CAPÍTULO 7 NÍVEL DE LINGUAGEM DE MONTAGEM

CAPÍTULO 7 NÍVEL DE LINGUAGEM DE MONTAGEM CAPÍTULO 7 NÍVEL DE LINGUAGEM DE MONTAGEM 71 Introdução Difere dos níveis inferiores por ser implementado por tradução A tradução é usada quando um processador está disponível para uma mensagem fonte mas

Leia mais

Edwar Saliba Júnior. Dicas, Comandos e Exemplos Comparativos entre Linguagem Algorítmica e Linguagem C / C++

Edwar Saliba Júnior. Dicas, Comandos e Exemplos Comparativos entre Linguagem Algorítmica e Linguagem C / C++ Edwar Saliba Júnior Dicas, Comandos e Exemplos Comparativos entre Linguagem Algorítmica e Linguagem C / C++ Belo Horizonte 2009 Sumário 1 Nota:... 2 2 Comandos e Palavras Reservadas:... 3 3 Dicas... 4

Leia mais

Programação Recursiva versão 1.02

Programação Recursiva versão 1.02 Programação Recursiva versão 1.0 4 de Maio de 009 Este guião deve ser entregue, no mooshak e no moodle, até às 3h55 de 4 de Maio. AVISO: O mooshak é um sistema de avaliação e não deve ser utilizado como

Leia mais

Sistemas Operacionais

Sistemas Operacionais Sistemas Operacionais Aula 13 Gerência de Memória Prof.: Edilberto M. Silva http://www.edilms.eti.br Baseado no material disponibilizado por: SO - Prof. Edilberto Silva Prof. José Juan Espantoso Sumário

Leia mais

Figura 1 Busca Linear

Figura 1 Busca Linear ----- Evidentemente, possuir os dados não ajuda o programador ou o usuário se eles não souberem onde os dados estão. Imagine, por exemplo, uma festa de casamento com cem convidados na qual não se sabe

Leia mais

Estrutura de Dados Básica

Estrutura de Dados Básica Estrutura de Dados Básica Professor: Osvaldo Kotaro Takai. Aula 4: Tipos de Dados O objetivo desta aula é apresentar os tipos de dados manipulados pela linguagem C, tais como vetores e matrizes, bem como

Leia mais

Métodos de Pesquisa 472

Métodos de Pesquisa 472 472 Métodos de Pesquisa 473 Objetivos e Caracterizações Para que se possa falar em algoritmos de pesquisa, é necessário inicialmente introduzir a noção de mapeamento que é uma das mais primitivas em programação.

Leia mais

Introdução a Java. Hélder Nunes

Introdução a Java. Hélder Nunes Introdução a Java Hélder Nunes 2 Exercício de Fixação Os 4 elementos básicos da OO são os objetos, as classes, os atributos e os métodos. A orientação a objetos consiste em considerar os sistemas computacionais

Leia mais

Pesquisa Sequencial e Binária

Pesquisa Sequencial e Binária Pesquisa Sequencial e Binária Prof. Wylliams Barbosa Santos wylliamss@gmail.com Introdução à Programação Crédito de Conteúdo: Professora Ceça Moraes Agenda Pesquisa Sequencial Noções de complexidade Pesquisa

Leia mais

Sistemas Operacionais e Introdução à Programação. Programação com linguagem C

Sistemas Operacionais e Introdução à Programação. Programação com linguagem C Sistemas Operacionais e Introdução à Programação Programação com linguagem C 1 Variáveis na linguagem C: tipo char O tipo char representa um caractere ASCII (ocupa só 1 byte) int main(int argc, char **

Leia mais