Você está na página 1de 5

Universidade Federal de Ouro Preto UFOP Instituto de Cincias Exatas e Biolgicas ICEB Departamento de Computao DECOM Disciplina: BCC202

202 - Estruturas de Dados I Professor: Tlio Toffolo (www.decom.ufop.br/toffolo)

Lista de Exerccios 04
Listas com Arrays e Ponteiros (Lista Encadeada)
1) Considere listas implementadas por arranjos, ento pede-se para implementar funes que: a. Localize/ Pesquise/Encontre (search) elementos b. Dividir uma lista em vrias (k) c. Copiar uma lista d. Ordenar (sort) ima lista por ordem crescente/decrescente 2) Escreva uma funo em C para trocar os elementos m e n de uma lista (m e n podem ser chaves ou mesmo ponteiros para os elementos a escolha sua). 3) Escreva uma funo em C para trocar os elementos de ndice m e n de uma lista. 4) Escreva uma rotina, inssub(l1,i1,l2,i2,len) para inserir os elementos da lista l2, comeando no elemento i2 e continuando por len elementos na lista l1, comeando na posio i1. Nenhum elemento da lista l1 dever ser removido ou substitudo. Se i1 >= length(l1) (onde length(l1) indica o nmero de ns na lista), ou se i2 + len > length(l2), ou se i1 < 0, ou se i2 < 0, ou se i1 +len > maxlength(l1) (onde maxlenght(l1) indica o nmero mximo de ns na lista l1), imprima uma mensagem de erro. A lista l2 deve permanecer inalterada. 5) Voc foi contratado pela Google para refazer o Orkut. A sua primeira tarefa implementar uma estrutura de dados para representar as relaes de amizade dentro do Orkut. Ou seja, para cada pessoa cadastrada voc tem que armazenar a sua lista de amigos. Considere que cada pessoa no Orkut tem um identificador nico que um nmero inteiro. a. Declare os tipos necessrios para a implementao dessa estrutura. b. Escreva um procedimento para cadastrar dois amigos:
void Relaciona(int Amigo1, int Amigo2, TipoOrkut* pOrkut)

Considere que o Amigo1 j est cadastrado no Orkut, enquanto o Amigo2 pode ou no j estar cadastrado. 6) Se voc tem de escolher entre uma representao por lista encadeada ou uma representao usando posies contguas de memria para um vetor, quais informaes so necessrias para voc selecionar uma reprentao apropriada? Como esses fatores influenciam a escolha da representao? 7) Considere listas implementadas por encadeamento simples, ento pede-se para implementar funes que: a. Localize/ Pesquise/Encontre (search) elementos b. Concatenar/intercalar (Merge) duas listas c. Dividir uma lista em vrias (k) d. Copiar uma lista e. Ordenar (sort) ima lista por ordem crescente/decrescente

BCC202 Lista 04

Pgina 1 de 5

8) Considere listas implementadas por encadeamento duplo, entao pede-se para implementar funes que: a. Localize/ Pesquise/Encontre (search) elementos b. Concatenar/intercalar (Merge) duas listas c. Dividir uma lista em vrias (k) d. Copiar uma lista e. Ordenar (sort) ima lista por ordem crescente/decrescente 9) Escreva uma funo em C para trocar os elementos m e n de uma lista simplesmente encadeada (m e n podem ser chaves ou mesmo ponteiros para os elementos a escolha sua). 10) Agora escreva uma funo em C para trocar os elementos m e n de uma lista duplamente encadeada (m e n podem ser chaves ou mesmo ponteiros para os elementos a escolha sua). 11) Escreva uma rotina, inssub(l1,i1,l2,i2,len) para inserir os elementos da lista l2, comeando no elemento i2 e continuando por len elementos na lista l1, comeando na posio i1. Nenhum elemento da lista l1 dever ser removido ou substitudo. Se i1 > length(l1) + 1 (onde length(l1) indica o nmero de ns na lista), ou se i2 + len 1 > length(l2), ou se i1 < 1, ou se i2 < 1, imprima uma mensagem de erro. A lista l2 deve permanecer inalterada. 12) Escreva uma funo em C, search(l,x), que receba um ponteiro l para uma lista de inteiros e um inteiro x, e retorne um ponteiro para um n contendo x, se existir, e o ponteiro nulo, caso contrrio. Escreva outra funo, searchinsert(l,x), que inclua x em l se ele no for encontrado, e retorne sempre um ponteiro para um n contendo x. 13) Suponha que uma string de caracteres seja representada por uma lista de caracteres individuais. Escreva um conjunto de funes para manipular estas listas como segue (l1, l2 e list so ponteiros para um n de cabealho de uma lista representando uma string de caracteres, str um vetor de caracteres e i1 e i2 so inteiros): a. strcnvcl(str) para converter a string de caracteres, str, numa lista. Essa funo retorna um ponteiro para um n de cabealho. b. strcnvlc(list,str) para converter uma lista em uma string de caracteres. c. Strcmpl(l1,l2) para comparar duas strings de caracteres, representadas or listas. Essa funo retorna -1 se a string de caracteres representada por l1 menor que a string representada por l2; 0 se so iguais, e 1 se a string representada por l1 maior. 14) Considere a implementao de listas encadeadas utilizando apontadores vista em sala. Escreva um procedimento Troca(TipoLista* pLista, TipoCelula* p) que, dado um apontador para uma clula qualquer (p), troca de posio essa clula com a sua clula seguinte da lista, como mostrado na figura abaixo. (Obs. No vale trocar apenas o campo item! Voc dever fazer a manipulao dos apontadores para trocar as duas clulas de posio). No esquea de tratar os casos especiais.

BCC202 Lista 04

Pgina 2 de 5

Antes:

!
Ultimo

Primeiro

Depois:

!
Ultimo

Primeiro

15) Considere a implementao de listas encadeadas utilizando apontadores vista em sala e responda as seguintes perguntas: a. Escreva uma funo void Inverte(TipoLista *Lista) que, dada uma lista com um nmero qualquer de elementos, inverte a ordem dos elementos da lista, como exemplificado na figura abaixo. (Obs. No vale trocar apenas os campos item ou usar uma lista / fila / pilha auxiliar! Voc dever fazer a manipulao dos apontadores para trocar as clulas de posio). b. Qual a ordem de complexidade da sua funo. Explique.
Antes: 1 2 3 4

Primeiro

Ultimo

Depois:

Primeiro

Ultimo

16) Escreva uma funo void MoveMenor(TipoLista Lista) que, dada uma lista com um nmero qualquer de elementos, acha o menor elemento da lista e o move para o comeo da lista, como exemplificado na figura abaixo. (Obs. No vale trocar apenas os campos item ou usar uma lista / fila / pilha auxiliar! Voc dever fazer a manipulao dos apontadores para trocar as clulas de posio). Qual a ordem de complexidade da sua funo. Explique.
Antes: 10 21 04 13

Primeiro

Ultimo

Depois:

04

10

21

13

Primeiro

Ultimo

BCC202 Lista 04

Pgina 3 de 5

17) (Extrado e modificado de [3] apud [2]) Implemente o tipo abstrato de dados Area, cuja finalidade gerenciar uma rea interna de memria de forma que o maior e o menor elemento possam ser removidos dessa rea a um custo O(1). A estrutura de dados que deve ser utilizada uma lista linear duplamente encadeada implementada por cursores. Os cursores so nmeros inteiros que representam posies em um arranjo e so utilizados para simular os apontadores da implementao tradicional das listas lineares duplamente encadeadas. A utilizao de cursores evita a alocao e a liberao dinmica de itens de memria, sendo mais eficiente em aplicaes muito dinmicas em que o nmero mximo de itens conhecido. O tipo abstrato de dados Area possui as seguintes operaes: a. Criar uma rea de memria interna vazia. b. Obter o nmero de clulas ocupadas na rea de memria c. Inserir um item de dado na rea interna de memria, mantendo os itens ordenados. d. Retirar o primeiro item da rea de memria. e. Retirar o ltimo item da rea de memria f. Imprimir o contedo da rea de memria. A retirada de um item de uma lista duplamente encadeada pode ser realizada a um custo constante, desde que se conhea previamente o endereo do item na lista. Ao manter a lista ordenada, os elementos de menor e de maior chave esto na primeira e na ltima posio respectivamente. A figura abaixo ilustra uma lista com capacidade mxima de sete itens.

Aps a realizao de vrias inseres e remoes, os itens contidos na lista apresentada na figura acima possuem as chaves 1, 3, 5 e 7. Os itens de dados da lista linear duplamente encadeada so armazenados em um vetor do tipo Celula. Cada entrada do vetor contm uma estrutura que armazena um item de dado, um cursor que aponta para a clula que sucede aquela entrada (prox) e um cursor que aponta para a clula que antecede aquela entrada (ant). Alm disso, so representados dois cursores, primeiro e ultimo, que apontam para a primeira e para a ltima clula da lista, respectivamente. Para facilitar o controle de quando a lista se encontra cheia ou vazia, utilize os campo numCelOcupadas, que indica quantas clulas da lista esto ocupadas. O cdigo abaixo mostra a declarao do tipo abstrato de dados Area. As clulas armazenados na estrutura Area precisam ser mantidas ordenadas. Observe que voc dever implementar uma funo que permita comparar dois itens, visto que os itens so inseridos e mantidos ordenados.
#define TAMCELS 7 typedef struct { int chave; /* outros campos */ } Item; typedef struct { Item item; int prox, ant; } Celula; typedef struct { Celula itens[TAMCELS] ; int celulas Disp, primeiro, ultimo; int numCelOcupadas; };

BCC202 Lista 04

Pgina 4 de 5

Somente o que foi apresentado at agora no suficiente para implementar o tipo abstrato de dados Area. Isso porque, para incluir um novo item de dado na lista, necessrio haver clulas disponveis a fim de que a insero seja realizada. Assim, para gerenciar a lista de clulas disponveis em determinado instante, basta incluir um cursor na representao da estrutura de dados Area, o qual ir apontar para a primeira clula disponvel. Tal cursor foi denominado celulasDisp. Como a lista ilustrada pela figura acima possui capacidade para sete itens/clulas e numCelOcupadas = 4, ento existem trs clulas disponveis. A primeira delas apontada por celulasDisp, ou seja, o ndice zero do vetor de itens, a segunda indicada pelo cursor prox da clula apontada por celulasDisp, ou seja, o ndice trs do vetor de itens/clulas. A terceira e ltima clula disponvel apontada pelo cursor prox da segunda e se encontra no ndice cinco do vetor de itens/clulas. Ela a ltima, pois o seu cursor prox possui o valor -1, o que indica a falta de um sucessor para ela. Dessa forma, antes de incluir um novo item de dado em Area, remove-se a primeira clula da lista de disponveis (apontada por celulasDisp) e a insere ordenamente na lista linear duplamente encadeada que armazena os itens de dados de Area (o custo desta insero no O(1), pode ser O(n) no pior caso). J ao remover um item de dados de Area, a clula que continha tal item deve ser inserida na lista de disponveis. Para que a insero e a remoo da lista de disponveis seja realizada a um custo constante, elas devem ser realizadas na posio apontada por celulasDisp.

Exerccios extrados de (Referncias)


[1] Aaron M. Tenenbaum, Yedidyah Langsam, Moshe J. Augenstein, Estruturas de Dados Usando C, Makron Books/Pearson Education, 1995. [2] N. Ziviani, F.C. Botelho, Projeto de Algoritmos com implementaes em Java e C++, Editora Thomson, 2006. [3] F.C. Botelho, Comunicao Pessoal, Belo Horizonte, MG, Brazil, 2003.

BCC202 Lista 04

Pgina 5 de 5