lista com alocaçao dinamica simpelmetne encadeada duplamente

Propaganda
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.
Download