Criação de Lista Ligada Estática usando Struct e Arrays em C# e Java

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();
        }
    }
}

Tags: C# java Lista Ligada Estática struct Arrays

Publicado em 7-6 03:27