Universidade Estadual de Santa Cruz

Ciência da Computação – Linguagem de Programação 2 – 2011.1
Lista de Exercícios L2 – Listas Encadeadas Exercício 4.1 
Considere uma lista simplesmente encadeada com a seguinte estrutura: struct nodo { int dado; struct nodo* prox; }; Escreva a função RemoveUltimo que  recebe um ponteiro para a lista L,  remove o último nodo de L, e  não retorna nada. A função deve funcionar corretamente em todos os casos, incluindo:     lista vazia, lista com um único nodo, lista com dois nodos, e lista com n nodos.

Exercício 4.2 
Considere uma lista simplesmente encadeada com a mesma estrutura do Exercício 4.1. Escreva a função 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 início de L, e  retorna um booleano indicando se N encontra-se ou não em L; suponha que o tipo Bool já existe e que pode assumir os valores TRUE ou FALSE. Essa função deve manipular apenas ponteiros, ou seja, não deve criar nodos com malloc() nem destruí-los com free(). Além disso, a função deve funcionar corretamente em todos os casos, incluindo:           lista vazia, lista com um único nodo contendo N, lista com um único nodo não 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, vários contendo N, mas não todos, e lista com n nodos, todos contendo N.

Exercício 4.3 
Considere a função int Tamanho (struct nodo* lista) que recebe um ponteiro para uma lista linear (veja figura no Exercício 4.6) e retorna o número de nodos da lista. Uma forma de implementar essa função consiste em percorrer toda a lista contando o número de nodos visitados. Uma implementação alternativa envolve o uso de uma variável global static int tamLista Assim, ao invés de percorrer toda a lista contando o número de nodos, a função Tamanho() apenas retorna o valor armazenado em tamLista.

Paulo Costa  2011

Linguagem de Programação 2 – 2011.1 – Lista de Exercícios L2

1

Além disso. if (inicio == NULL) exit (-1). nodo . }. lista com dois nodos contendo letras iguais.Responda as seguintes perguntas: 1) 2) 3) 4) Por que tamLista deve ser global? Por que não pode ser local a Tamanho()? Por que tamLista é declarada como static? Quais as vantagens dessa implementação alternativa? Quais as desvantagens? Exercício 4. incluindo:       lista vazia. lista com um único nodo. inicio = lista.3). suponha que o tipo Bool já existe e que pode assumir os valores TRUE ou FALSE.  determina se a palavra formada pelas letras em L é um palíndromo (veja a lista L3. lista com três. /* Dada uma lista nao-vazia. quatro e n nodos contendo um não-palíndromo. dadoNoInicio = inicio->dado. não use recursão). tDado dadoNoInicio. dado e prox já estejam definidos.4  Considere uma lista duplamente encadeada com a seguinte estrutura: struct nodo { char letra. Suponha que tDado . Paulo Costa  2011 Linguagem de Programação 2 – 2011. quatro e n nodos contendo um palíndromo.6  Considere a função abaixo. lista com dois nodos contendo letras diferentes. A função deve ser iterativa (ou seja.5  Implemente a versão recursiva da função ehPalindromo do exercício anterior. e  retorna um booleano indicando se trata-se ou não de um palíndromo. Exercício 4. struct nodo* antes.1 – Lista de Exercícios L2 2 . e lista com três. Escreva a função ehPalindromo que  recebe dois ponteiros para a lista L (um para o início e outro para o fim de L). Exercício 4. struct nodo* depois. free (inicio). Exercício 3. } Essa função realiza corretamente a operação esperada (remover o primeiro nodo de uma lista e retornar o valor nele armazenado)? Justifique. lista = inicio->prox. return (dadoNoInicio). remove o nodo inicial */ /* e retorna o dado nele contido */ tDado TiraDoInicio (struct nodo* lista) { struct nodo* inicio. a função deve funcionar corretamente em todos os casos.

1 – Lista de Exercícios L2 3 . lista com dois nodos. Além disso. une C e D em uma única lista circular. recebe dois ponteiro para as listas circulares C e D. a circular.  transforma L em uma lista circular. A lista linear é acessada através de um ponteiro para o primeiro nodo. a função deve funcionar corretamente em todos os casos.  conta o número de nodos em C. 3) Escreva a função TamanhoCircular que  recebe um ponteiro para a lista circular C. 2) Escreva a função TornaLinear que faz o oposto da função anterior. Isso permite um acesso fácil a ambas as extremidades da lista circular.1. 1) Escreva a função TornaCircular que  recebe um ponteiro para a lista linear L. coloca o resultado da união em C. ambas simplesmente encadeadas e com a mesma estrutura do Exercício 4.Exercício 4. 4) Escreva a função UneCirculares que A função acima deve executar em tempo constante. incluindo as seguintes combinações: Nodos em D 0 Nodos em C 0 1 2 1 2 n n Paulo Costa  2011 Linguagem de Programação 2 – 2011. As três funções acima devem funcionar corretamente em todos os casos. e  retorna esse número. e lista com n nodos. através de um ponteiro para o último nodo. e não retorna nada. incluindo:          lista vazia. Considere uma lista linear L e uma lista circular C. deixa D vazia. e  não retorna nada.7  Uma lista circular simplesmente encadeada é uma lista linear onde o último nodo aponta de volta para o primeiro. lista com um único nodo. independente do tamanho de C e D.

Exercício 4. p->antes = NULL. p = *fim->depois. 2) Escreva a função IntParaLista que faz o oposto da função acima. lista com dois nodos. 1) Escreva a função ListaParaInt que  recebe um ponteiro para a lista L.  coloca cada um dos dígitos decimais de N em uma lista L. void funcao (struct nodo **fim) { struct nodo *p.  interpreta os números em L como dígitos de um long unsigned int. onde os todos os inteiros estão entre 0 e 9 inclusive. incluindo:     lista vazia (nesse caso a função deve retornar 0). *fim->depois = NULL. Suponha que o dígito mais significativo esteja no início da lista. Considere também a função abaixo. e  retorna o número resultante. }. struct nodo* depois. o que ela faz? Paulo Costa  2011 Linguagem de Programação 2 – 2011. if (*fim == NULL) return. e que o número final pode ser armazenado em um long unsigned int sem causar overflow. A função deve funcionar corretamente em todos os casos.Exercício 4. int dado. e  retorna um ponteiro para o início de L.8  Considere uma lista simplesmente encadeada com a mesma estrutura do Exercício 4. e lista com n nodos. } Qual o objetivo dessa função? Ou seja. *fim = p. Os nodos da lista possuem a seguinte estrutura: struct nodo { struct nodo* antes.9  Considere uma lista circular L duplamente encadeada. como na figura abaixo. onde *fim aponta para o último nodo de L. ou seja:  recebe um inteiro N do tipo unsigned long int.1. lista com um único nodo.1 – Lista de Exercícios L2 4 .

struct nodo* prox. resultado = atual. } Qual o objetivo dessa função? Ou seja. void funcaoRecursiva (struct nodo** lista) { struct nodo* primeiro.11  Considere a função abaixo.9. funcaoRecursiva (&resto). resto = primeiro->prox. while (atual != NULL) { prox = atual->prox. if (*lista == NULL) return. Suponha que nodo e prox já estejam definidos como no exercício 4. if (resto == NULL) return.1 – Lista de Exercícios L2 5 . *lista = resto. } Qual o objetivo dessa função? Ou seja. o que ela faz? Exercício 4. primeiro->prox = NULL.Exercício 4. Suponha que nodo e prox já estejam definidos como no exercício 4. atual->prox = resultado. atual = prox. void funcao (struct nodo** lista) { struct nodo* resultado = NULL. o que ela faz? Paulo Costa  2011 Linguagem de Programação 2 – 2011. primeiro = *lista. } *lista = resultado. struct nodo* atual = *lista. primeiro->prox->prox = primeiro. struct nodo* resto.10  Considere a função abaixo.9.