Implemente as funções de inserção no início, inserção no final, remoção do primeiro elemento, e remoção do último elemento em uma lista circular estática.
Passo 1
Beleza, vamos lá! A gente recebeu um exercício que pede para implementar funções que manipulam uma lista circular estática. Isso faz parte da matéria de Estruturas de Dados, onde aprendemos sobre diferentes formas de organizar e gerenciar dados na programação. Para resolver isso, vamos precisar entender como funciona uma lista circular estática e como inserir ou remover elementos dela, seja no início ou no final.
Passo 2
Primeiro, vamos entender o que é uma lista circular estática. Imagine uma lista onde o último elemento aponta de volta para o primeiro, formando um círculo. “Estática” significa que o tamanho da lista é fixo, ou seja, a gente define o tamanho máximo dela no começo e ele não muda.
Aqui está uma definição básica em C para uma lista circular estática:
#define MAX 5
typedef struct {
int itens[MAX];
int inicio;
int fim;
int tamanho;
} ListaCircular;
Nesse código,
itens
é o array que armazena os elementos, inicio
e fim
indicam as posições do primeiro e último elementos, e tamanho
controla quantos elementos estão na lista atualmente.Passo 3
Vamos começar implementando a função de inserção no início. O objetivo é adicionar um novo elemento antes do elemento que está atualmente no início da lista.
Primeiro, precisamos verificar se a lista está cheia. Se estiver, não dá para inserir mais elementos. Se não estiver, vamos atualizar o índice de início para a posição anterior e inserir o novo elemento lá.
Aqui está como a gente pode fazer isso:
void inserirInicio(ListaCircular *lista, int valor) {
if (lista->tamanho == MAX) {
printf("Lista cheia! Não é possível inserir.\n");
return;
}
lista->inicio = (lista->inicio - 1 + MAX) % MAX;
lista->itens[lista->inicio] = valor;
lista->tamanho++;
}
Explicação:
(lista->inicio - 1 + MAX) % MAX
garante que, seinicio
for 0, ele volta para o último índice (MAX - 1
).- Inserimos o
valor
na nova posição deinicio
e incrementamos otamanho
.
Passo 4
Agora, vamos para a inserção no final. Aqui, adicionamos um novo elemento depois do último elemento da lista.
Mais uma vez, verificamos se a lista está cheia. Se não estiver, calculamos a nova posição do
fim
e inserimos o elemento lá.Veja o código:
void inserirFim(ListaCircular *lista, int valor) {
if (lista->tamanho == MAX) {
printf("Lista cheia! Não é possível inserir.\n");
return;
}
lista->fim = (lista->fim + 1) % MAX;
lista->itens[lista->fim] = valor;
lista->tamanho++;
}
Explicação:
(lista->fim + 1) % MAX
move o índicefim
para a próxima posição circularmente.- Colocamos o
valor
na nova posição defim
e aumentamos otamanho
.
Passo 5
Vamos partir para a remoção do primeiro elemento. Precisamos retirar o elemento que está na posição de
inicio
e ajustar o índice.Primeiro, verificamos se a lista está vazia. Se não estiver, removemos o elemento atual de
inicio
, movemos o índice para a próxima posição e decrementamos o tamanho
.Confira o código:
int removerInicio(ListaCircular *lista) {
if (lista->tamanho == 0) {
printf("Lista vazia! Não tem o que remover.\n");
return -1; // Indicador de erro
}
int valor = lista->itens[lista->inicio];
lista->inicio = (lista->inicio + 1) % MAX;
lista->tamanho--;
return valor;
}
Explicação:
- Armazenamos o valor a ser removido.
- Atualizamos
inicio
para a próxima posição. - Decrementamos
tamanho
e retornamos o valor removido.
Passo 6
Por último, vamos implementar a remoção do último elemento. Aqui, precisamos retirar o elemento que está na posição de
fim
e ajustar o índice.Novamente, verificamos se a lista está vazia. Se não estiver, removemos o elemento de
fim
, movemos o índice para a posição anterior e decrementamos o tamanho
.Veja como fica:
int removerFim(ListaCircular *lista) {
if (lista->tamanho == 0) {
printf("Lista vazia! Não tem o que remover.\n");
return -1; // Indicador de erro
}
int valor = lista->itens[lista->fim];
lista->fim = (lista->fim - 1 + MAX) % MAX;
lista->tamanho--;
return valor;
}
Explicação:
- Capturamos o valor a ser removido.
- Atualizamos
fim
para a posição anterior, garantindo a circularidade com% MAX
. - Decrementamos
tamanho
e retornamos o valor removido.
Resposta
Pronto! Agora você tem as funções básicas para inserir e remover elementos no início e no final de uma lista circular estática. Lembre-se de sempre verificar se a lista está cheia antes de inserir e vazia antes de remover para evitar erros. Boa programação!