UFJF - DCC - Estrutura de Dados e Laborat´orio de Programa¸c˜ao II
Listas Cont´ıguas
1. Considerando o TAD ListaCont que representa uma lista cont´ıgua, fa¸ca uma fun¸c˜ao para trocar de posi¸c˜ao dois elementos na lista. A fun¸c˜ao deve retornar se a opera¸c˜ao foi poss´ıvel ou n˜ao.
b o o l L i s t a C o n t :: t r o c a ( int p o s i c a o 1 , int p o s i c a o 2 ) ;
2. Considerando o TAD ListaCont que representa uma lista cont´ıgua, fa¸ca uma fun¸c˜ao para aumentar a capacidade m´axima (definida por max) do vetor que representa a lista sem que nenhum dado atualmente representado na lista seja perdido. Se a nova capacidade definida pelo parˆametro novoMax for menor que a capacidade atual, a opera¸c˜ao n˜ao deve fazer nada. Ao final retornar se a opera¸c˜ao foi ou n˜ao realizada.
b o o l L i s t a C o n t :: a u m e n t a C a p a c i d a d e ( int n o v o M a x ) ;
Listas Encadeadas
3. Considerando o TAD ListaEncad (lista simplesmente encadeada), implementar uma opera¸c˜ao do TAD que tenha como valor de retorno o comprimento da lista, isto ´e, que calcule o n´umero de n´os de uma lista.
int L i s t a E n c a d :: g e t C o m p r i m e n t o () ;
4. Considerando o TAD ListaEncad que representa uma lista simplesmente encadeada de valores inteiros, implementar uma fun¸c˜ao para retornar o n´umeros de n´os da lista que possuem o campo info maior que o valor inteiro val.
int L i s t a E n c a d :: c o n t a M a i o r e s ( int val ) ;
5. Criar um TAD ListaEncad como sendo uma lista simplesmente encadeada de n´umeros inteiros de forma que todos os n´os da lista estejam em ordem crescente pelo valor do n´o. Basta aproveitar o TAD para lista encadeada estudado em aula e alterar a fun¸c˜ao de inser¸c˜ao de forma que esta sempre percorra os elementos da lista a fim de encontrar a posi¸c˜ao correta do novo n´o.
v o i d L i s t a E n c a d :: i n s e r e O r d e n a d o ( int val ) ;
6. Uma lista circular ´e uma lista cujo ´ultimo elemento tem o primeiro elemento da lista como pr´oximo, formando assim um ciclo. N˜ao existe conceitualmente o primeiro e o ´ultimo n´o. Para percorrer todos os elementos da lista circular, come¸camos de um n´o e visitamos todos os elementos at´e alcan¸car novamente o primeiro elemento. A Figura 1 ilustra uma lista circular. Desenvolver todo o TAD ListaCirc com suas opera¸c˜oes usuais.
7. O TAD para lista simplesmente encadeada possui algumas limita¸c˜oes, como por exemplo, a impossibilidade de percorrer eficientemente os n´os do ´ultimo para o primeiro, assim como a dificuldade de remover um n´o, dado um ponteiro para este, j´a que para isso ´e necess´ario percorrer a lista at´e encontrar o n´o desejado para descobrir o seu anterior a fim de acertar
Figura 1: Exemplo de lista circular.
o encadeamento na remo¸c˜ao. Outra implementa¸c˜ao de lista ´e aquela na qual o n´o guarda a informa¸c˜ao, um ponteiro para o pr´oximo e um ponteiro para o anterior. Um exemplo pode ser visto na Figura 2. A seguir apresentamos a estrutura que deve ser utilizada e os prot´otipos das
Figura 2: Exemplo de lista duplamente encadeada. opera¸c˜oes a serem implementadas.
c l a s s N o D u p l o { p u b l i c : N o D u p l o () ; ~ N o D u p l o () ; v o i d s e t A n t ( N o D u p l o * p ) ; v o i d s e t P r o x ( N o D u p l o * p ) ; v o i d s e t I n f o ( int val ) ; N o D u p l o * g e t A n t () ; N o D u p l o * g e t P r o x () ; int g e t I n f o () ; p r i v a t e : int i n f o ; // i n f o r m a c a o N o D u p l o * ant ; // p o n t e i r o p a r a a n t e r i o r N o D u p l o * p r o x ; // p o n t e i r o p a r a p r o x i m o }; c l a s s L i s t a D u p l a { p u b l i c : L i s t a D u p l a () ; ~ L i s t a D u p l a () ; b o o l b u s c a ( int val ) ; v o i d i n s e r e I n i c i o ( int val ) ; v o i d r e m o v e I n i c i o () ; v o i d i n s e r e F i n a l ( int val ) ; v o i d r e m o v e F i n a l () ;
p r i v a t e : int n ;
N o D u p l o * p r i m e i r o ; N o D u p l o * u l t i m o ; };
8. Implemente uma opera¸c˜ao do TAD ListaEncad que verifica se duas listas encadeadas s˜ao iguais e que retorna true, caso sejam, e false, caso contr´ario. Duas listas s˜ao consideradas iguais se tˆem a mesma sequˆencia de elementos.
b o o l L i s t a E n c a d :: i g u a l ( L i s t a E n c a d * l2 ) ;
9. Um pol´ıgono geom´etrico pode ser considerado como uma lista de v´ertices. Para desenhar tal pol´ıgono, basta tra¸car uma reta ligando v´ertices adjacentes. Projete um TAD para armazenar esse pol´ıgono (defina as opera¸c˜oes necess´arias). Considere a necessidade de desenhar o pol´ıgono, eliminar v´ertices e incluir novos v´ertices.
Figura 3: Exemplo de pol´ıgono.
10. Considere o TAD ListaEncad que representa uma lista simplesmente encadeada com elementos repetidos. Implemente uma opera¸c˜ao para eliminar todas as ocorrˆencias do valor val da lista.
v o i d L i s t a E n c a d :: r e m o v e V a l o r ( int val ) ;
11. Implementar uma lista encadeada para manipula¸c˜ao de polinˆomios do tipo: anxn+ an−1xn−1+
... + a1x1 + a0, onde cada elemento i da lista deve armazenar o i-´esimo termo do polinˆomio
(diferente de 0). Cada item da lista deve conter o valor da potˆencia (inteiro) e o coeficiente correspondente (real). c l a s s P o l i n o m i o { p u b l i c : P o l i n o m i o ( int tam ) ; ~ P o l i n o m i o () ; v o i d i n s e r e T e r m o ( f l o a t c , int p ) ; v o i d i m p r i m e () ; v o i d r e m o v e T e r m o ( int i ) ; p r i v a t e : No * p r i m e i r o ; }
Pilhas e Filas
12. Pilha com Vetor (cont´ıgua). Implementar um TAD Pilha utilizando a representa¸c˜ao vetorial, criando as opera¸c˜oes especificadas nos prot´otipos a seguir:
c l a s s P i l h a C o n t {
p r i v a t e :
int max ; // c a p a c i d a d e m a x i m a .
int t o p o ; // p o s i c a o do t o p o da p i l h a .
int * vet ; // v e t o r que a r m a z e n a os d a d o s da p i l h a .
p u b l i c : P i l h a C o n t ( int tam ) ; ~ P i l h a C o n t () ; v o i d e m p i l h a ( int val ) ; // i n s e r e No no t o p o . int d e s e m p i l h a () ; // r e m o v e No do t o p o . int g e t T o p o () ; // c o n s u l t a o t o p o . b o o l v a z i a () ; };
13. Fila com Vetor (cont´ıgua). Implementar um TAD Fila utilizando a representa¸c˜ao vetorial, criando as opera¸c˜oes especificadas nos prot´otipos a seguir:
c l a s s F i l a C o n t { p r i v a t e : int max ; // q u a n t i d a d e m a x i m a de e l e m e n t o do v e t o r int i n i c i o ; // i n d i c e do No que e s t a no i n c i o int f i n a l ; // i n d i c e do No que e s t a no f i n a l int * vet ; // v e t o r que a r m a z e n a a f i l a
p u b l i c :
F i l a C o n t ( int tam ) ; ~ F i l a C o n t () ;
int g e t I n i c i o () ; // c o n s u l t a No do i n i c i o v o i d e n f i l e i r a ( int val ) ; // i n s e r e No no fim v o i d d e s e n f i l e i r a () ; // r e m o v e No do i n i c i o b o o l v a z i a () ; // v e r i f i c a se e s t a v a z i a };
14. Na representa¸c˜ao de Fila e Pilha cont´ıgua (com vetor) pode acontecer da pilha ou da fila estar cheia no momento de inserir novos valores (n´os). Fazer um procedimento, no bloco private, para realocar o vetor que suporta a pilha ou a fila com o dobro da capacidade que havia anteriormente. Refazer as opera¸c˜oes para levar em conta essa nova capacidade de realocamento. Aten¸c˜ao: ser´a preciso alocar o novo vetor e em seguida copiar todos os dados do antigo vetor para o novo e, somente, ap´os essa c´opia desalocar o antigo.
15. Desenvolva uma fun¸c˜ao para comparar se uma Fila f1 tem mais elementos do que uma fila f2. Deve retornar -1 se f1 < f2, 0 se f1 = f2 e 1 se f1 > f2. Considere que a FilaEncad possui um descritor com a informa¸c˜ao de quantos n´os a fila possui e uma fun¸c˜ao de acesso a esse descritor. Caso n˜ao esteja dispon´ıvel, implemente o descritor e a fun¸c˜ao de acesso.
c l a s s F i l a E n c a d { p u b l i c : // ... int g e t N u m N o s () ; p r i v a t e : // ... int n u m N o s ; };
Em seguida implemente a fun¸c˜ao:
int c o m p a r a ( F i l a E n c a d * f1 , F i l a E n c a d * f2 ) ;
16. Considere a existˆencia de um TAD PilhaEncad de n´umeros inteiros, cujas opera¸c˜oes s˜ao:
c l a s s P i l h a E n c a d { P i l h a E n c a d () ; ~ P i l h a E n c a d () ; int g e t T o p o () ; v o i d e m p i l h a ( int val ) ; int d e s e m p i l h a () ; b o o l v a z i a () ; }
Sem conhecer a representa¸c˜ao interna desse tipo abstrato:
a) Implemente uma fun¸c˜ao que receba uma pilha como parˆametro e retorne o valor armaze-nado em seu topo, restaurando o conte´udo da pilha.
b) Implemente uma fun¸c˜ao que receba duas pilhas, p1 e p2, e passe todos os elementos da pilha p2 para o topo da pilha p1. A figura abaixo ilustra essa concatena¸c˜ao de pilha.
Figura 4: Concatena¸c˜ao de pilhas.
c) Implemente uma fun¸c˜ao que receba uma pilha p como parˆametro e retorne como resultado uma c´opia dessa pilha. Ao final, a pilha p recebida como parˆametro deve ter seu conte´udo original inalterado.
17. Escreva opera¸c˜oes do TAD ListaEncad para (i) copiar um vetor com n itens para uma lista encadeada e para (ii) copia a lista encadeada para um vetor.
L i s t a E n c a d * L i s t a E n c a d :: v e t o r 2 L i s t a ( int n , int * vet ) ; int * L i s t a E n c a d :: l i s t a 2 V e t o r ( L i s t a E n c a d * l ) ;
A fun¸c˜ao que cria uma lista a partir de um vetor deve alocar dinamicamente uma lista, preenchˆ e-la com os dados do vetor e retornar o ponteiro para a lista crida. Por outro e-lado, a fun¸c˜ao que cria um vetor a partir de uma lista deve alocar dinamicamente um vetor (com capacidade igual ao n´umero de n´os da lista), copiar a lista para o vetor e retornar o endere¸co deste.
18. Desenvolver uma fun¸c˜ao para ler 300 valores inteiros e montar uma pilha representada por encadeamento, atendendo `as seguintes caracter´ısticas:
• O primeiro valor lido ser´a inclu´ıdo como n´o da pilha;
• A partir do segundo valor lido, ele s´o ser´a inclu´ıdo se for maior do que o n´o que est´a no topo da pilha;
Dica: use o TAD PilhaEncad usado em sala de aula e que est´a dispon´ıvel na p´agina do curso. 19. Dada uma fila cujos valores de seus n´os s˜ao inteiros quaisquer, desenvolver uma fun¸c˜ao para
esvaziar esta fila, gerando uma nova fila que contenha somente os n´os positivos da anterior. 20. Usando obrigatoriamente o TAD PilhaCont, implementar uma fun¸c˜ao para verificar se a pilha
de inteiros passada como parˆametro ´e pal´ındromo, ou seja, ´e a mesma quando lida da esquerda para a direita ou da direita para a esquerda. Caso isso aconte¸ca, retornar true e, caso contr´ario, retornar false. Exemplo: 1,2,3,4,5,4,3,2,1 ´e pal´ındromo, e 1,2,3,6,7,8 n˜ao ´e pal´ındromo.
b o o l e h P a l i n d r o m o ( int n , P i l h a C o n t * p ) ;
21. Escreva um algoritmo, usando uma pilha, que inverte as letras de cada palavra de um texto terminado por “.”, preservando a ordem das palavras. Por exemplo, dado o texto:
ESTE EXERC´ICIO ´E MUITO F´ACIL. A sa´ıda deve ser:
ETSE OIC´ICREXE ´E OTIUM LIC´AF
22. A convers˜ao de n´umeros inteiros, na base 10, para outras bases num´ericas se d´a atrav´es de sucessivas divis˜oes de um n´umero n pelo valor da base para a qual se queira converter. Fa¸ca um programa para obter a convers˜ao num´erica, de acordo com a op¸c˜ao do usu´ario. Utilize uma estrutura de dados do tipo pilha.
(a) Decimal para Bin´ario (base 2); (b) Decimal para Octal (base 8);