Índice. Capítulo 2 Estrutura de Dados sequencial com armazenamento sequencial
|
|
- Nicolas Machado de Sá
- 8 Há anos
- Visualizações:
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 ALGORITMOS DE BUSCA EM LISTAS COM ALOCAÇÃO SEQÜENCIAL Busca em Listas Lineares A operação de busca é
Leia maisBusca. 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 maisEstruturas 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 maisEAD Á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 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 maisPesquisa 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 maisProf. 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 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 maisINF 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 mais1/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 maisEstruturas 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 maisPesquisa 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 maisMé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 mais1. 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 maisINF1007: 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 mais2ª 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 maisLinguagem 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 maisDAS5102 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 maisPesquisa 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 maisESTRUTURAS 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 maisMé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 maisProgramas 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 maisAná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 maisEAD Á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 maisProgramaçã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 maisALGORITMOS 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 maisEAD 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 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 maisINF1007 - 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 maisFigura 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 maisAlgoritmos 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 maisPossui 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 maisIntroduçã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 maisTrabalho 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 maisOrientaçã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 maisTabela 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 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 maisAlgoritmos 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 maisPROGRAMAÇÃ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 maisEstruturas 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 maisPesquisa 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 maisESTRUTURAS 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 maisPesquisa: 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 maisAlgoritmos 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
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 maisCT-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 maisARRAYS. 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 maisFACULDADE 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 maisPROGRAMAÇÃ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 maisAná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 maisTabelas 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 mais2. 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 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 maisUNIVERSIDADE 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 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 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 maisAlgoritmos 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 maisEstrutura 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 maisFUNDAÇÃ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 maisINF 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 maisBusca 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 maisFicheiros 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 maisDAS5102 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 maisCAPÍ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 maisPragmá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 maisHashing. 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
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 maisstruct 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 maisCapí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 maisResumo 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 maisComandos 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 maisOPERADORES 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 maisAlgoritmos 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 maisArmazenamento 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 mais20 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 maisAlgoritmos 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 maisEstrutura 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 maisP 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 maisPersistê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 maisUniversidade 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 maisA 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 maisProgramaçã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 maisAlgoritmos 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 maisAlgoritmos 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 maisIFTO 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 maisUnidade 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 maisCAPÍ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 maisEdwar 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 maisProgramaçã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 maisSistemas 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 maisFigura 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 maisEstrutura 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 maisMé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 maisIntroduçã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 maisPesquisa 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 maisSistemas 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