UNIVERSIDADE DO ALGARVE
Faculdade de Ciências e Tecnologia
Departamento de Engenharia Electrónica e Informática
Estruturas de dados (2004/2005)
Licenciaturas em Engenharia de Sistemas e Informática, Ensino de Informática e Informática
Exame época recurso
21 de Julho 2005
Duração: 2h00m
Ao longo do enunciado considere o array de inteiros: int ai[ ] = { 4, 6, 2, 5, 1, 3, 7 };
1.
a) (0.5v) Explique o que é impresso pelo seguinte segmento de código:
int i;
for (i=0; i<7; i+=2) printf ("%d ", *(ai+i));
b) (0.5v) Quais as alterações e efectuar ao código acima para que sejam impressos os
elementos de índice impar do array ai, isto é: 6 5 3
2.
a) (1.25v) Implemente uma função que reserve memória dinamicamente para um array de n
inteiros, e retorne um ponteiro para esse array ou NULL em caso de insuficiência de
memória. Indique pré-condições e excepções se necessário.
b) (1v) Escreva um segmento de código que reserve memória dinamicamente para um array
de 7 inteiros e copie para esse array os elementos do array ai pela mesma ordem.
3. Neste exercício considere que lista refere-se a uma lista simplesmente ligada de inteiros.
a) (0.75v) Declare um ponteiro e uma estrutura que permitam referenciar um nó da lista.
b) (1.5v) Escreva um segmento de código que crie uma nova lista, copiando os elementos do
array ai para essa lista pela mesma ordem.
c) (1v) Escreva um segmento de código que remova da lista criada na alínea anterior (e da
memória) o 2º nó, isto é o nó cujo elemento é o número 6.
d) Supondo que se pretende implementar um stack baseado numa lista:
i. (1v) Em que ponto da lista se devem fazer as operações de inserção e remoção de
elementos de modo que o tempo de execução destas seja constante e o menor possível?
Justifique.
ii. (1v) Implemente a função int STACKtop (link s), que retorna (mas não elimina) o
elemento no topo do stack s.
e) (1v) Supondo que existe um ponteiro para o ultimo nó da lista, identificado por plast,
escreva uma função que adicione em tempo constante, um nó já existente ao fim da lista.
4. Pretende-se implementar o ADT com suporte para múltiplas instâncias Date, para manipulação de
datas de acordo com o calendário Gregoriano. Cada instância guarda uma data em 3 inteiros: o dia,
o mês e o ano. Considerando que no ficheiro date.h será declarado o interface do ADT e o ficheiro
date.c terá a implementação, escreva todo o código necessário (incluindo protótipos de funções),
nos ficheiros correctos, de acordo com:
Exame época recurso ED 2004 / 2005 - 1/2
a) (0.75v) Estrutura do ADT e ponteiro para esta (identificado por Date). A estrutura contém
3 inteiros para guardar o dia, mês e ano.
b) (1.25v) Supondo que está disponível a função void sysdate (int *day, int *month, int
*year) que retorna nos seus argumentos a data actual do sistema, declare e defina a função
Date DATEnow (void) que cria uma nova instancia deste ADT e que retorna um ponteiro
para esta ou NULL no caso de insuficiência de memória.
c) (1v) Declare e defina a função void DATEprint (Date d) que escreve na consola a
instância d no formato: dia / mes / ano. Indique pré e pós condições se necessário.
d) (0,75v) Escreva um segmento de código que usando este ADT mostre no monitor a data
actual do sistema
e) (0.75v) Proponha uma estrutura alternativa para o ADT que permita poupar memória no
armazenamento do dia, mês e ano.
5. Seja a definição de um nó numa árvore binária:
typedef struct node *link;
struct node { int item; link left, right; };
a) (1.5v) Supondo que está disponível a função:
/* Descrição: se root == NULL é criado o nó raiz da árvore com o item t,
senão um novo nó com o item t é adicionado à árvore binária de pesquisa
com raiz root, onde o item do filho esquerdo é menor que o item do pai
e o item do filho direito é maior ou igual que o item do pai.
POS: Adiciona novo nó à árvore de pesquisa e retorna a raiz da árvore */
link btree (link root, int t);
escreva um segmento de código que percorra o array ai desde o índice 0 para o final, e
adicione cada elemento do array a uma árvore binária de pesquisa (inicialmente vazia).
b) (0.75v) Represente esquematicamente a árvore binária de pesquisa criada na alínea anterior.
c) (1v) Implemente uma função que retorne a altura de uma árvore binária. Considere que uma
árvore com apenas um nó, a raiz, tem altura 0.
6. Considere o código do algoritmo de ordenação Quicksort para inteiros:
void qs(int* a, int n){
int i;
int partition (int *a, int n) {
/* ... */
if (n<2) return;
i=partition(a, n);
qs(a, i);
qs(a+i+1, n-i-1);
}
}
a) (0.75v) Modifique o algoritmo de modo que se os elementos numa partição forem menores
que 10 sejam ordenados pela função: void selection (int *a, int n).
b) (1.25v) Seja a função void swap (int *a, int *b) que troca o valor dos seus dois
argumentos, defina a função: void selection (int *a, int n), que implementa o algoritmo de
ordenação por selecção.
c) (0.75) O algoritmo de ordenação por selecção é adequado para ordenar colecções guardadas
em ficheiros (por exemplo no disco rígido). Porquê?
Exame época recurso ED 2004 / 2005 - 2/2
Download

Exame recurso - Universidade do Algarve