Вы находитесь на странице: 1из 5

Universidade Estadual de Santa Cruz

Cincia da Computao Linguagem de Programao 2 2011.1


Lista de Exerccios L2 Listas Encadeadas Exerccio 4.1
Considere uma lista simplesmente encadeada com a seguinte estrutura: struct nodo { int dado; struct nodo* prox; }; Escreva a funo RemoveUltimo que recebe um ponteiro para a lista L, remove o ltimo nodo de L, e no retorna nada. A funo deve funcionar corretamente em todos os casos, incluindo: lista vazia, lista com um nico nodo, lista com dois nodos, e lista com n nodos.

Exerccio 4.2
Considere uma lista simplesmente encadeada com a mesma estrutura do Exerccio 4.1. Escreva a funo MoveParaInicio que recebe um ponteiro para a lista L e o inteiro N, caso N se encontre em um ou mais nodos de L, move os nodos contendo N para o incio de L, e retorna um booleano indicando se N encontra-se ou no em L; suponha que o tipo Bool j existe e que pode assumir os valores TRUE ou FALSE. Essa funo deve manipular apenas ponteiros, ou seja, no deve criar nodos com malloc() nem destru-los com free(). Alm disso, a funo deve funcionar corretamente em todos os casos, incluindo: lista vazia, lista com um nico nodo contendo N, lista com um nico nodo no contendo N, lista com dois nodos, nenhum deles contendo N, lista com dois nodos, apenas um contendo N, lista com dois nodos, ambos contendo N, lista com n nodos, nenhum deles contendo N, lista com n nodos, apenas um contendo N, e lista com n nodos, vrios contendo N, mas no todos, e lista com n nodos, todos contendo N.

Exerccio 4.3
Considere a funo int Tamanho (struct nodo* lista) que recebe um ponteiro para uma lista linear (veja figura no Exerccio 4.6) e retorna o nmero de nodos da lista. Uma forma de implementar essa funo consiste em percorrer toda a lista contando o nmero de nodos visitados. Uma implementao alternativa envolve o uso de uma varivel global static int tamLista Assim, ao invs de percorrer toda a lista contando o nmero de nodos, a funo Tamanho() apenas retorna o valor armazenado em tamLista.

Paulo Costa 2011

Linguagem de Programao 2 2011.1 Lista de Exerccios L2

Responda as seguintes perguntas: 1) 2) 3) 4) Por que tamLista deve ser global? Por que no pode ser local a Tamanho()? Por que tamLista declarada como static? Quais as vantagens dessa implementao alternativa? Quais as desvantagens?

Exerccio 4.4
Considere uma lista duplamente encadeada com a seguinte estrutura: struct nodo { char letra; struct nodo* antes; struct nodo* depois; }; Escreva a funo ehPalindromo que recebe dois ponteiros para a lista L (um para o incio e outro para o fim de L), determina se a palavra formada pelas letras em L um palndromo (veja a lista L3, Exerccio 3.3), e retorna um booleano indicando se trata-se ou no de um palndromo; suponha que o tipo Bool j existe e que pode assumir os valores TRUE ou FALSE. A funo deve ser iterativa (ou seja, no use recurso). Alm disso, a funo deve funcionar corretamente em todos os casos, incluindo: lista vazia, lista com um nico nodo, lista com dois nodos contendo letras iguais, lista com dois nodos contendo letras diferentes, lista com trs, quatro e n nodos contendo um palndromo, e lista com trs, quatro e n nodos contendo um no-palndromo.

Exerccio 4.5
Implemente a verso recursiva da funo ehPalindromo do exerccio anterior.

Exerccio 4.6
Considere a funo abaixo. Suponha que tDado , nodo , dado e prox j estejam definidos. /* Dada uma lista nao-vazia, remove o nodo inicial */ /* e retorna o dado nele contido */ tDado TiraDoInicio (struct nodo* lista) { struct nodo* inicio; tDado dadoNoInicio; inicio = lista; if (inicio == NULL) exit (-1); dadoNoInicio = inicio->dado; lista = inicio->prox; free (inicio); return (dadoNoInicio); } Essa funo realiza corretamente a operao esperada (remover o primeiro nodo de uma lista e retornar o valor nele armazenado)? Justifique.

Paulo Costa 2011

Linguagem de Programao 2 2011.1 Lista de Exerccios L2

Exerccio 4.7
Uma lista circular simplesmente encadeada uma lista linear onde o ltimo nodo aponta de volta para o primeiro. A lista linear acessada atravs de um ponteiro para o primeiro nodo; a circular, atravs de um ponteiro para o ltimo nodo. Isso permite um acesso fcil a ambas as extremidades da lista circular.

Considere uma lista linear L e uma lista circular C, ambas simplesmente encadeadas e com a mesma estrutura do Exerccio 4.1. 1) Escreva a funo TornaCircular que recebe um ponteiro para a lista linear L, transforma L em uma lista circular, e no retorna nada. 2) Escreva a funo TornaLinear que faz o oposto da funo anterior. 3) Escreva a funo TamanhoCircular que recebe um ponteiro para a lista circular C, conta o nmero de nodos em C, e retorna esse nmero. As trs funes acima devem funcionar corretamente em todos os casos, incluindo: lista vazia, lista com um nico nodo, lista com dois nodos, e lista com n nodos. recebe dois ponteiro para as listas circulares C e D, une C e D em uma nica lista circular, coloca o resultado da unio em C, deixa D vazia, e no retorna nada.

4) Escreva a funo UneCirculares que

A funo acima deve executar em tempo constante, independente do tamanho de C e D. Alm disso, a funo deve funcionar corretamente em todos os casos, incluindo as seguintes combinaes: Nodos em D 0 Nodos em C 0 1 2 1 2

Paulo Costa 2011

Linguagem de Programao 2 2011.1 Lista de Exerccios L2

Exerccio 4.8
Considere uma lista simplesmente encadeada com a mesma estrutura do Exerccio 4.1, onde os todos os inteiros esto entre 0 e 9 inclusive. 1) Escreva a funo ListaParaInt que recebe um ponteiro para a lista L, interpreta os nmeros em L como dgitos de um long unsigned int, e retorna o nmero resultante. Suponha que o dgito mais significativo esteja no incio da lista, e que o nmero final pode ser armazenado em um long unsigned int sem causar overflow. A funo deve funcionar corretamente em todos os casos, incluindo: lista vazia (nesse caso a funo deve retornar 0), lista com um nico nodo, lista com dois nodos, e lista com n nodos.

2) Escreva a funo IntParaLista que faz o oposto da funo acima, ou seja: recebe um inteiro N do tipo unsigned long int, coloca cada um dos dgitos decimais de N em uma lista L, e retorna um ponteiro para o incio de L.

Exerccio 4.9
Considere uma lista circular L duplamente encadeada, como na figura abaixo.

Os nodos da lista possuem a seguinte estrutura: struct nodo { struct nodo* antes; int dado; struct nodo* depois; }; Considere tambm a funo abaixo, onde *fim aponta para o ltimo nodo de L. void funcao (struct nodo **fim) { struct nodo *p; if (*fim == NULL) return; p = *fim->depois; p->antes = NULL; *fim->depois = NULL; *fim = p; } Qual o objetivo dessa funo? Ou seja, o que ela faz?

Paulo Costa 2011

Linguagem de Programao 2 2011.1 Lista de Exerccios L2

Exerccio 4.10
Considere a funo abaixo. Suponha que nodo e prox j estejam definidos como no exerccio 4.9. void funcao (struct nodo** lista) { struct nodo* resultado = NULL; struct nodo* atual = *lista; struct nodo* prox; while (atual != NULL) { prox = atual->prox; atual->prox = resultado; resultado = atual; atual = prox; } *lista = resultado; } Qual o objetivo dessa funo? Ou seja, o que ela faz?

Exerccio 4.11
Considere a funo abaixo. Suponha que nodo e prox j estejam definidos como no exerccio 4.9. void funcaoRecursiva (struct nodo** lista) { struct nodo* primeiro; struct nodo* resto; if (*lista == NULL) return; primeiro = *lista; resto = primeiro->prox; if (resto == NULL) return; funcaoRecursiva (&resto); primeiro->prox->prox = primeiro; primeiro->prox = NULL; *lista = resto; } Qual o objetivo dessa funo? Ou seja, o que ela faz?

Paulo Costa 2011

Linguagem de Programao 2 2011.1 Lista de Exerccios L2

Вам также может понравиться