Í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).

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

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

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

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

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

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

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

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

Á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

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

Á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

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

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

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

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

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

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

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

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

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

Á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

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

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

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

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

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

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

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

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

Á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

Alocação dinâmica de memória

Alocação dinâmica de memória Alocação dinâmica de memória Jander Moreira 1 Primeiras palavras Na solução de problemas por meio algoritmos ou programas, é comum surgir a necessidade de manter todo o conjunto de dados a ser processado

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

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

Universidade Estadual de Mato Grosso do Sul - Curso de Ciência da Computação Disciplina: Estruturas de Dados Profª. Raquel Marcia Müller

Universidade Estadual de Mato Grosso do Sul - Curso de Ciência da Computação Disciplina: Estruturas de Dados Profª. Raquel Marcia Müller 1 Listas Lineares Dentre as estruturas de dados não primitivas, as listas lineares são as de manipulação mais simples. Uma lista linear agrupa informações referentes a um conjunto de elementos que, de

Leia mais

Aula 3 Alocação Dinâmica

Aula 3 Alocação Dinâmica Aula 3 Alocação Dinâmica Universidade Federal de Santa Maria Colégio Agrícola de Frederico Westphalen Curso Superior de Tecnologia em Sistemas de Internet Prof. Bruno B. Boniati www.cafw.ufsm.br/~bruno

Leia mais

Listas (Parte 2) Túlio Toffolo tulio@toffolo.com.br www.toffolo.com.br. BCC202 Aula 10 Algoritmos e Estruturas de Dados I

Listas (Parte 2) Túlio Toffolo tulio@toffolo.com.br www.toffolo.com.br. BCC202 Aula 10 Algoritmos e Estruturas de Dados I Listas (Parte 2) Túlio Toffolo tulio@toffolo.com.br www.toffolo.com.br BCC202 Aula 10 Algoritmos e Estruturas de Dados I Listas Encadeadas Características: Tamanho da lista não é pré-definido Cada elemento

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

Estruturas (Registros)

Estruturas (Registros) Estruturas (Registros) Agrupa conjunto de tipos de dados distintos sob um único nome string string inteiro inteiro inteiro float float Cadastro Pessoal Nome Endereço Telefone Idade Data de Nascimento Peso

Leia mais

Métodos Computacionais. Pilha

Métodos Computacionais. Pilha Métodos Computacionais Pilha Definição de Pilha Pilha é uma estrutura de dados dinâmica onde: Inserção e remoção de elementos no topo da pilha O primeiro elemento que sai é o último que entrou (LIFO) Operações

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

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

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

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

Leia mais

http://www.dcc.ufmg.br/algoritmos/transparenc ias.php

http://www.dcc.ufmg.br/algoritmos/transparenc ias.php Estruturas Aula 8: 10/09/2008 Listas de Informação (parte 2) TAD /* FLVazia(Lista). Faz Lista a lista (1) /* Insere(x, Input: Output: Pré-condição: Pós-condição: L L ficar L édefinida vazia */ Pós-condição:

Leia mais

1 Introdução. 2 Algumas funções úteis para lidar com strings

1 Introdução. 2 Algumas funções úteis para lidar com strings Departamento de Engenharia Electrotécnica PROGRAMAÇÃO DE MICROPROCESSADORES 2007 / 2008 Mestrado Integrado em Engenharia Electrotécnica e Computadores 1º ano 1º semestre Strings e apontadores http://tele1.dee.fct.unl.pt

Leia mais

1 se n = 0 n (n 1)! se n 1

1 se n = 0 n (n 1)! se n 1 Recursão versus Iteração Problema: Cálculo de n! = n (n 1)... 1 int facti(int n) { int fac=n; while(n>0){ fac=fac*n; n--; } return fac; } [epd94, Cap. 5.13-15] Definição recursiva: n! = { 1 se n = 0 n

Leia mais

04/03/2012. A fila é uma outra estrutura de dados muito utilizada em computação.

04/03/2012. A fila é uma outra estrutura de dados muito utilizada em computação. A fila é uma outra estrutura de dados muito utilizada em computação. Estrutura de Dados É uma analogia natural com o conceito de fila que usamos no nosso dia a dia: os elementos saem da fila seguindo a

Leia mais

INF1007: Programação 2 5 Tipos Estruturados. 05/03/2014 (c) Dept. Informática - PUC-Rio 1

INF1007: Programação 2 5 Tipos Estruturados. 05/03/2014 (c) Dept. Informática - PUC-Rio 1 INF1007: Programação 2 5 Tipos Estruturados 05/03/2014 (c) Dept. Informática - PUC-Rio 1 Tópicos Tipo estrutura Definição de novos tipos Aninhamento de estruturas Vetores de estruturas Vetores de ponteiros

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

CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DA PARAÍBA COORDENAÇÃO DO CURSO DE TECNOLOGIA EM TELEMÁTICA APOSTILA DE

CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DA PARAÍBA COORDENAÇÃO DO CURSO DE TECNOLOGIA EM TELEMÁTICA APOSTILA DE CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DA PARAÍBA COORDENAÇÃO DO CURSO DE TECNOLOGIA EM TELEMÁTICA APOSTILA DE ESTRUTURA DE DADOS PROF. CÂNDIDO EGYPTO JOÃO PESSOA / PB JULHO / 2003 SUMÁRIO 1 INTRODUÇÃO...

Leia mais

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

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

Leia mais

CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DA PARAÍBA CURSO SUPERIOR DE TECNOLOGIA EM REDES DE COMPUTADORES APOSTILA DE

CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DA PARAÍBA CURSO SUPERIOR DE TECNOLOGIA EM REDES DE COMPUTADORES APOSTILA DE CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DA PARAÍBA CURSO SUPERIOR DE TECNOLOGIA EM REDES DE COMPUTADORES APOSTILA DE ESTRUTURA DE DADOS PROF. CÂNDIDO EGYPTO JOÃO PESSOA / PB JULHO / 2004 SUMÁRIO 1 INTRODUÇÃO...3

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

Algoritmos e Estrutura de Dados II

Algoritmos e Estrutura de Dados II Universidade Federal do Vale do São Francisco Algoritmos e Estrutura de Dados II Professor: Marcelo Santos Linder E-mail: marcelo.linder@univasf.edu.br Ementa Árvores B, grafos e tabelas de hash: alocação

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

Sumário. Armazenamento de dados. Tipos de dados dinâmicos. Exemplos. Vectores Vectores dinâmicos Dados dinamicos. Declaração Uso 10-1

Sumário. Armazenamento de dados. Tipos de dados dinâmicos. Exemplos. Vectores Vectores dinâmicos Dados dinamicos. Declaração Uso 10-1 Sumário Armazenamento de dados Vectores Vectores dinâmicos Dados dinamicos Tipos de dados dinâmicos Declaração Uso Exemplos 10-1 Armazenamento de dados Tamanho conhecido antes compilação Vectores BI vect[200]

Leia mais

Estruturas de entrada e saída

Estruturas de entrada e saída capa Estruturas de entrada e saída - A linguagem C utiliza de algumas funções para tratamento de entrada e saída de dados. - A maioria dessas funções estão presentes na biblioteca . - As funções

Leia mais

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

ALGORITMOS E ESTRUTURAS DE DADOS Terceiro Trabalho Prático Recursividade e Pilhas Universidade Federal de Ouro Preto Instituto de Ciências Exatas e Biológicas Departamento de Computação ALGORITMOS E ESTRUTURAS DE DADOS Terceiro Trabalho Prático Recursividade e Pilhas Luiz Henrique Santos

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

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

Linguagem C. Programação Estruturada. Fundamentos da Linguagem. Prof. Luis Nícolas de Amorim Trigo nicolas.trigo@ifsertao-pe.edu.

Linguagem C. Programação Estruturada. Fundamentos da Linguagem. Prof. Luis Nícolas de Amorim Trigo nicolas.trigo@ifsertao-pe.edu. Programação Estruturada Linguagem C Fundamentos da Linguagem Prof. Luis Nícolas de Amorim Trigo nicolas.trigo@ifsertao-pe.edu.br Sumário Estrutura Básica Bibliotecas Básicas Tipos de Dados Básicos Variáveis/Declaração

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

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

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches Juliana de Melo Bezerra CES-11 Algoritmos e Estruturas de Dados Carlos Alberto Alonso Sanches Juliana de Melo Bezerra CES-11 Pilhas Filas Deques Pilhas,,f filas e deques Vimos que as listas lineares admitem inserção e eliminação

Leia mais

Primeiro Curso de Programação em C 3 a Edição

Primeiro Curso de Programação em C 3 a Edição Edson Luiz França Senne Primeiro Curso de Programação em C 3 a Edição Visual Books Sumário Prefácio da Terceira Edição 9 Prefácio da Primeira Edição 11 Aula 1 13 Regras de sintaxe de uma linguagem de programação...

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

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

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

PROGRAMAÇÃO FUNÇÕES NA LINGUAGEM C

PROGRAMAÇÃO FUNÇÕES NA LINGUAGEM C PROGRAMAÇÃO FUNÇÕES NA LINGUAGEM C 1 Enunciado: a)implementar a função maior que devolve o maior de dois números inteiros passados como parâmetro; b)construir um programa em C que determine o maior de

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

PIP/CA - Programa Interdisciplinar de Pós-Graduação em Computação Aplicada da UNISINOS ALGORITMOS & ESTRUTURAS DE DADOS

PIP/CA - Programa Interdisciplinar de Pós-Graduação em Computação Aplicada da UNISINOS ALGORITMOS & ESTRUTURAS DE DADOS PIP/CA - Programa Interdisciplinar de Pós-Graduação em Computação Aplicada da UNISINOS Disciplina de Nivelamento - 2000/1: ALGORITMOS & ESTRUTURAS DE DADOS Professor Responsável: Prof. Fernando Santos

Leia mais

Árvores. Seqüência de arcos, com origem na raiz e final em um determinado nó. Quantos caminhos existem para se atingir um determinado nó?

Árvores. Seqüência de arcos, com origem na raiz e final em um determinado nó. Quantos caminhos existem para se atingir um determinado nó? 39 Árvores Conceitue caminho. Seqüência de arcos, com origem na raiz e final em um determinado nó. Quantos caminhos existem para se atingir um determinado nó? Apenas um. O que determina o tamanho de um

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

10. Listas Encadeadas

10. Listas Encadeadas 10. Listas Encadeadas W. Celes e J. L. Rangel Para representarmos um grupo de dados, já vimos que podemos usar um vetor em C. O vetor é a forma mais primitiva de representar diversos elementos agrupados.

Leia mais

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

INF 1620 P1-10/04/02 Questão 1 Nome: INF 1620 P1-10/04/02 Questão 1 Considere uma disciplina que adota o seguinte critério de aprovação: os alunos fazem duas provas (P1 e P2) iniciais; se a média nessas duas provas for maior ou igual a 5.0,

Leia mais

Funções e protótipos (declaração) de funções

Funções e protótipos (declaração) de funções Funções e protótipos (declaração) de funções Declaração de função tipo_de_retorno nome_da_função (declaração_de_parâmetros); onde o tipo-de-retorno, o nome-da-função e a declaração-de-parâmetros são os

Leia mais

INF 1007 Programação II

INF 1007 Programação II INF 1007 Programação II Aula 08 Busca em Vetor Edirlei Soares de Lima Busca em Vetor Problema: Entrada: vetor v com n elementos; elemento d a procurar; Saída: m se o elemento procurado

Leia mais

-Estrutura linear de acesso seqüencial que ordena seus elementos pela seqüência cronológica de sua entrada;

-Estrutura linear de acesso seqüencial que ordena seus elementos pela seqüência cronológica de sua entrada; FILAS (Queues) -Estrutura linear de acesso seqüencial que ordena seus elementos pela seqüência cronológica de sua entrada; -Estrutura FIFO (First In First Out) a ordem de saída é a mesma ordem de entrada

Leia mais

LINGUAGEM C: DESCOMPLICADA. Prof. André R. Backes

LINGUAGEM C: DESCOMPLICADA. Prof. André R. Backes LINGUAGEM C: DESCOMPLICADA Prof. André R. Backes 1 COMANDOS DE CONTROLE CONDICIONAL Os programas escritos até o momento são programas sequeciais: um comando é executado após o outro, do começo ao fim do

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

Linguagem C: variáveis, operadores, entrada/saída. Prof. Críston Algoritmos e Programação

Linguagem C: variáveis, operadores, entrada/saída. Prof. Críston Algoritmos e Programação Linguagem C: variáveis, operadores, entrada/saída Prof. Críston Algoritmos e Programação Linguagem C Linguagem de uso geral (qualquer tipo de aplicação) Uma das linguagens mais utilizadas Foi utilizada

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

Enunciados de exercícios seleccionados de testes e exames P2 / EDa

Enunciados de exercícios seleccionados de testes e exames P2 / EDa Enunciados de exercícios seleccionados de testes e exames P2 / EDa 1. Qual o resultado apresentado pelo seguinte troço de código. Justifique. double d[] = { 5.4, 3.2, 1.0 ; double *pd = d[1]; ++pd; printf(

Leia mais

compreender a importância de cada estrutura de controle disponível na Linguagem C;

compreender a importância de cada estrutura de controle disponível na Linguagem C; Aula 3 Estruturas de controle Objetivos Esperamos que, ao final desta aula, você seja capaz de: compreender a importância de cada estrutura de controle disponível na Linguagem C; construir programas em

Leia mais

Tabelas (arrays) (vetores, matrizes, etc) Algoritmos de pesquisa Algoritmos de ordenação

Tabelas (arrays) (vetores, matrizes, etc) Algoritmos de pesquisa Algoritmos de ordenação Java Tabelas (arrays) (vetores, matrizes, etc) Algoritmos de pesquisa Algoritmos de ordenação 1 Tabelas para quê? As tabelas são utilizadas quando se pretende armazenar e manipular um grande número de

Leia mais

Apostila 03 Conceito de Filas

Apostila 03 Conceito de Filas Curso: Bacharelado em Ciência da Computação - BCC Disciplina: (1479A) Estruturas de Dados I ED1 Professora: Simone das Graças Domingues Prado e-mail: simonedp@fc.unesp.br home-page: wwwp.fc.unesp.br/~simonedp/ed1bcc.htm

Leia mais

Números positivos ordenados

Números positivos ordenados Sumário Armazenamento de dados Vectores Vectores dinâmicos Listas Tipos de dados dinâmicos Declaração Uso Exemplos Armazenamento de dados Tamanho conhecido antes compilação Vectores BI vect[200] Tamanho

Leia mais

Arquivos. Estruturas de Dados II Vanessa Braganholo

Arquivos. Estruturas de Dados II Vanessa Braganholo Arquivos Estruturas de Dados II Vanessa Braganholo Entidades } Aplicações precisam armazenar dados sobre as mais diversas entidades, que podem ser concretas ou abstratas } Funcionário de uma empresa (concreto)

Leia mais

Tipos de Dados, Tipos Abstratos de Dados Estruturas de Dados

Tipos de Dados, Tipos Abstratos de Dados Estruturas de Dados Tipos de Dados, Tipos Abstratos de Dados Estruturas de Dados Tipo de dados, tipo abstrato de dados, estruturas de dados Termos parecidos, mas com significados diferentes Tipo de dado Em linguagens de programação

Leia mais

Introdução à Programação. Armazenamento de Grande Quantidade de Informação Usando Vetores

Introdução à Programação. Armazenamento de Grande Quantidade de Informação Usando Vetores Introdução à Programação Armazenamento de Grande Quantidade de Informação Usando Vetores Armazenando Grande Quantidade de Informação Como armazenar tanta informação? Vetores! 2 Tópicos da Aula Hoje, aprenderemos

Leia mais

Pilhas. Profa Morganna Diniz

Pilhas. Profa Morganna Diniz Pilhas Profa Morganna Diniz Pilhas Geralmente pilhas são úteis em situações em que dados devem ser recuperados em ordem inversa a do armazenamento É uma estrutura de dados linear que permite acesso por

Leia mais

Resumo da Introdução de Prática de Programação com C. A Linguagem C

Resumo da Introdução de Prática de Programação com C. A Linguagem C Resumo da Introdução de Prática de Programação com C A Linguagem C O C nasceu na década de 70. Seu inventor, Dennis Ritchie, implementou-o pela primeira vez usando um DEC PDP-11 rodando o sistema operacional

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

Tipos de Dados Simples

Tipos de Dados Simples Programação 11543: Engenharia Informática 6638: Tecnologias e Sistemas de Informação Cap. 3 Tipos de Dados Simples Tipos de Dados Simples Objectivos: Hierarquia de tipos de dados Tipos de dados simples

Leia mais

A Pilha. Aula 02. DPEE 1038 Estrutura de Dados para Automação Curso de Engenharia de Controle e Automação Universidade Federal de Santa Maria

A Pilha. Aula 02. DPEE 1038 Estrutura de Dados para Automação Curso de Engenharia de Controle e Automação Universidade Federal de Santa Maria Engenharia de CONTROLE e AUTOMAÇÃO A Pilha Aula 02 DPEE 1038 Estrutura de Dados para Automação Curso de Engenharia de Controle e Automação Universidade Federal de Santa Maria beltrame@mail.ufsm.br 1/5

Leia mais

INTRODUÇÃO AO C++ SISTEMAS DE INFORMAÇÃO DR. EDNALDO B. PIZZOLATO

INTRODUÇÃO AO C++ SISTEMAS DE INFORMAÇÃO DR. EDNALDO B. PIZZOLATO INTRODUÇÃO AO C++ SISTEMAS DE INFORMAÇÃO DR. EDNALDO B. PIZZOLATO Tópicos Estrutura Básica B de Programas C e C++ Tipos de Dados Variáveis Strings Entrada e Saída de Dados no C e C++ INTRODUÇÃO O C++ aceita

Leia mais

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

Árvores binárias de pesquisa com balanceamento. Algoritmos e Estruturas de Dados II Árvores binárias de pesquisa com balanceamento Algoritmos e Estruturas de Dados II Árvores binárias de pesquisa Pior caso para uma busca é O(n) 1 3 Ordem de inserção: 1 3 2 4 5 6 2 4 5 6 2 Árvore completamente

Leia mais

Linguagens de Programação I

Linguagens de Programação I Linguagens de Programação I Tema # 8 Strings e Estruturas Susana M Iglesias 1 STRINGS - INTRODUÇÃO Strings (cadeia de caracteres): é uma serie de caracteres que podem ser tratados como uma unidade simples,

Leia mais

Introdução. A verificação de tipos pode ser estática e dinâmica

Introdução. A verificação de tipos pode ser estática e dinâmica Análise Semântica Introdução Verifica se as construções sintaticamente corretas possuem significado lógico dentro da linguagem Verifica a consistência da declaração e uso dos identificadores Além disso,

Leia mais

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

Estruturas de Dados. Parte dos slides a seguir são adaptações, extensões e traduções para C dos originais: Estruturas de Dados Pilhas Prof. Ricardo J. G. B. Campello Créditos Parte dos slides a seguir são adaptações, extensões e traduções para C dos originais: disponíveis em http://ww3.datastructures.net/ cedidos

Leia mais

Listas Duplamente Encadeadas

Listas Duplamente Encadeadas Listas Duplamente Encadeadas! quando for preciso seguir a seqüência de elementos em ambos os sentidos! cada nó possui dois ponteiros: ant e prox ant prox a b c d Início Fim 1 Listas Duplamente Encadeadas

Leia mais