Universidade Federal de Uberlândia - Bacharelado em Ciência da Computação Lista de Exercícios de Algoritmos e Estruturas de Dados Listas Dinâmicas Encadeadas - Cíclicas, Duplas e Simples Prof.ª Denise Guliato Monitora: Larissa Alves Pereira 1) Implementar um TAD referente à lista ordenada, usando alocação dinâmica simplesmente encadeada. a) A estrutura de dados é dada a seguir: struct no{ int info; Struct no* prox; }; typedef struct no Lista; b) Operações que o TAD deve contemplar: . Inicializar a lista . Verificar se lista é vazia . Inserir um dado elemento . Remover um dado elemento . Tamanho: retorna o número de elementos da lista . Iguais: recebe duas listas ordenadas e verifica se elas são iguais . Média: retorna a média aritmética simples dos elementos da lista . Busca: verifica se um dado valor é pertencente à lista . Elimina: elimina todas as ocorrências de um dado elemento . Elimina_ : elimina um elemento que está em uma dada posição definida pelo usuário Obs.: É importante verificar se a posição é válida. . Insere na direita: insere um dado valor à direita do -ésimo elemento da lista Obs.: É importante verificar se a posição é válida. . Insere na esquerda: insere um dado valor à esquerda do -ésimo elemento da lista Obs.: É importante verificar se a posição é válida. 2) Dado duas listas dinâmicas simplesmente encadeadas (com a mesma estrutura do item 1) com ordenação,L1 e L2, crie um algoritmo que irá gerar uma terceira lista com as seguintes características: . Inverter: recebe uma lista, L1 ou L2, e retorna uma nova lista L3, formada pelos elementos da lista recebida na ordem inversa. . Retornar ímpares: recebe as listas L1 e L2 e retorna uma nova lista L3, formada apenas com os elementos ímpares das duas listas. . Concatena: recebe as listas L1 e L2 e retorna uma nova lista L3 formada pela concatenação entre a lista L1 e L2. . Conjunto intersecção: gerar uma terceira lista com a intersecção entre os números da primeira e da segunda lista. . Intercalar: a função recebe as duas listas ordenadas e retorna a lista com os elementos das duas listas intercalados conforme a ordem com que elas se dispõe na lista, segundo exemplificado abaixo. . Intercalar ordenadamente: o módulo recebe as duas listas ordenadas e retorna a lista com os elementos das duas listas intercalados, porém obedecendo a ordem crescente dos números. 3) Dada uma lista encadeada que armazena números inteiros, escreva uma função que transforma a lista dada em duas listas encadeadas: a primeira contendo os elementos cujo conteúdo é par e a segunda contendo os elementos com conteúdos impares. Sua função deve manipular somente os apontadores e não o conteúdo das células. Exemplo: 4) Implementar o TAD lista não ordenada usando alocação dinâmica com encadeamento CÍCLICO. A estrutura de dados é dada abaixo: typedef struct data{ char nome[30]; float CRA; int matricula; } DATA; struct no{ DATA info; Struct no* prox; }; typedef struct no Lista; Operações que o TAD deve contemplar: . Inicializar lista . Verificar lista vazia . Inserir novo elemento no final da lista . Remover um dado elemento do início da lista . Inserir em uma dada posição: insira o elemento de entrada em uma posição definida pela na entrada. Obs.: É importante verificar se a posição é valida. . Remove elemento de uma dada posição: remover o elemento que se encontra na posição especificada na entrada. Obs.: Se a posição não existir na lista, retorne mensagem de falha na tela. . Tamanho: retorna o número de elementos da lista . Maior: retorna o valor do maior CRA da lista. . Remover todos os alunos cujo nome começa com a letra A. 5) Implementar o TAD lista ordenada usando alocação dinâmica com encadeamento duplo. Adapte a estrutura do item 4 para este problema. Operações que o TAD deve contemplar: . Inicializar lista; . Verificar lista vazia; . Inserir um novo nodo na lista; . Remover um nodo que contenha um dado nome; . Tamanho: retorna o número de elementos da lista; . Média: retornar a média aritmética simples dos CRAs da lista; . Remover todos: remove todas as ocorrências de um dado valor de CRA em uma lista; . Remover maior: remove da lista o nodo que contem o maior CRA. Obs.: Remover todas as ocorrências deste elemento. 6) Implementar o problema de Josephus utilizando o TAD lista com encadeamento cíclico. Defina a estrutura de dados para resolver esse problema. Problema: um grupo de soldados está cercado pelo inimigo e existe apenas um cavalo para a fuga. Decidiu-se que o soldado que se salvará será definido na sorte, independente da patente. O processo de escolha será por eliminação, sendo que o último soldado a ser selecionado se salvaria. O processo de eliminação consiste em: organizar os soldados em volta da fogueira; escolher um soldado para iniciar a contagem e sortear um único número. Ao final da contagem, o soldado escolhido é eliminado e o processo é reiniciado a partir do próximo soldado, até só restar o soldado ganhador. Entradas: . Nomes dos soldados que estão cercados . Opção de início de contagem: (1) Iniciar contagem a partir do primeiro soldado da lista. (2) Iniciar contagem a partir de um soldado sorteado aleatoriamente da lista. (3) Informar o nome do soldado para iniciar a contagem. Saídas: . . . . No caso da opção de contagem (2), imprimir o nome do soldado sorteado. Imprimir o número sorteado. Imprimir os nomes dos soldados eliminados, na ordem de eliminação. Imprimir o nome do soldado sobrevivente. 7) Implementar um programa para manipulação de polinômios do tipo Para tal, o polinômio deve ser armazenado usando uma lista ordenada, sendo que cada elemento i da lista deve armazenar o n-ésimo termo do polinômio (diferente de 0), e deve conter o valor da potência de (inteiro) e o coeficiente correspondente (inteiro). Por exemplo, o polinômio: deve ser representado pela lista: Fica a critério do aluno a escolha da técnica de implementação, tanto em relação à forma de alocação, quanto à forma de agrupamento. A utilização de nodo descritor, encadeamento cíclico/simples/duplo também fica a critério do aluno. Deve ser criada uma interface que permita ao usuário executar qualquer uma das operações a seguir, a qualquer momento: . Inicializar um polinômio. . Inserir um novo termo no polinômio existente. Se já existe um termo no polinômio, o valor do coeficiente do novo termo deve ser adicionado ao já existente, assim: . Imprimir P(x) Se o polinômio for a sua representação interna será: A seguinte expressão deverá ser visualizada na tela: +7 -3x^2 +2x^5 . Eliminar o termo associado à n-ésima potência. Se o polinômio atual for como no exemplo anterior, e o usuário solicitar a remoção do termo associado à potência 2 de x, o polinômio resultante será P(x) = 2x5+7,e o nó referente à potência de deve ser liberado resultando na estrutura: . Reinicializar um polinômio. Fazer P(x)=0x0 e liberar os nós do P(x) anterior. . Calcular o valor de P(x) para um dado valor de x. Por exemplo, se o polinômio atual for e o usuário solicitar o cálculo de P( x) para x = 2 , o valor de P(2) deve ser calculado: P(2)= 2*26 – 2*24 + 23 + 5*2 + 2 = 180 e o resultado deve ser apresentado na tela. 8) Escreva uma funçao Quebra para o TAD lista duplamente encadeada circular com nó cabeçalho, que recebe um valor X que pertence à lista e devolve uma lista duplamente encadeada circular com os elementos a partir de X, como mostrado na figura abaixo. 9) Escreva um algoritmo que recebe uma lista simplesmente encadeada e inverte essa lista, alterando somente os campos dos ponteiros e sem usar listas auxiliares.