Uma lista ligada estática é uma estrutura de dados que utiliza um array para simular o comportamento de uma lista ligada, onde cada elemento armazena um valor e um índice para o próximo elemento. Isso permite manipulação dinâmica em memória contígua, mas requer iteração para acessar elementso, alterando a ordem de armazenamento original do array.
Definição do Nó
Para representar cada nó da lista, podemos usar uma estrutura (struct) em C# ou uma classe em Java. Esta estrutura contém um campo para o valor armazenado e outro para o índice do próximo nó na lista.
namespace ExemploEstatico
{
public struct No
{
public string Dado;
public int ProximoIndice;
public No(string dado, int proximoIndice)
{
Dado = dado;
ProximoIndice = proximoIndice;
}
}
}
Implementação da Classe da Lista
A classe principal gerecnia a lista ligada estática, inclunido operações como adicionar, inserir, remover e exibir nós. Ela mantém um array de nós e um índice para o primeiro elemento da lista.
namespace ExemploEstatico
{
public class ListaEstaticaLigada
{
private int indiceCabaca;
private int capacidade;
private No[] elementos;
public ListaEstaticaLigada(int capacidade)
{
indiceCabaca = -1;
this.capacidade = capacidade;
elementos = new No[capacidade];
}
public void AdicionarNo(string dado)
{
if (indiceCabaca == -1)
{
indiceCabaca = 0;
elementos[indiceCabaca] = new No(dado, -1);
}
else
{
int atual = indiceCabaca;
while (elementos[atual].ProximoIndice != -1)
{
atual = elementos[atual].ProximoIndice;
}
for (int i = 0; i < capacidade; i++)
{
if (elementos[i].Dado == null)
{
elementos[atual].ProximoIndice = i;
elementos[i] = new No(dado, -1);
break;
}
}
}
}
public void InserirNo(string dado, int posicao)
{
for (int i = 0; i < capacidade; i++)
{
if (elementos[i].Dado == null)
{
elementos[i].Dado = dado;
elementos[i].ProximoIndice = elementos[posicao].ProximoIndice;
elementos[posicao].ProximoIndice = i;
break;
}
}
}
public void RemoverNo(int posicao)
{
if (posicao < 0 || posicao >= capacidade)
{
Console.WriteLine("Índice inválido");
return;
}
if (posicao == indiceCabaca)
{
indiceCabaca = elementos[indiceCabaca].ProximoIndice;
elementos[posicao] = new No(null, -1);
}
else
{
int atual = indiceCabaca;
while (elementos[atual].ProximoIndice != posicao && elementos[atual].ProximoIndice != -1)
{
atual = elementos[atual].ProximoIndice;
}
if (elementos[atual].ProximoIndice == posicao)
{
elementos[atual].ProximoIndice = elementos[posicao].ProximoIndice;
elementos[posicao] = new No(null, -1);
}
else
{
Console.WriteLine("Posição não encontrada");
}
}
}
public void ExibirLista()
{
int atual = indiceCabaca;
while (atual != -1)
{
Console.Write($"{elementos[atual].Dado} (próximo: {elementos[atual].ProximoIndice}) -> ");
atual = elementos[atual].ProximoIndice;
}
Console.WriteLine("fim");
}
}
}
Exemplo de Uso
Um exemplo simples demonstra como utilizar a classe para criar e manipular a lista ligada estática.
using System;
namespace ExemploEstatico
{
class Programa
{
static void Main(string[] argumentos)
{
ListaEstaticaLigada lista = new ListaEstaticaLigada(5);
lista.AdicionarNo("X");
lista.AdicionarNo("Y");
lista.AdicionarNo("Z");
lista.InserirNo("W", 1);
lista.ExibirLista();
}
}
}