Uma lista vinculada pode ser usada quando você deseja inserção e exclusão baratas de elementos e quando não importa que os elementos não estejam próximos um do outro na memória.
Isso é muito abstrato e eu gostaria de uma explicação concreta sobre por que uma lista vinculada deve ser usada em vez de uma matriz. Eu não sou muito experiente em programação, então não tenho muita experiência (se houver) no mundo real.
data-structures
linked-list
destro
fonte
fonte
Respostas:
Aqui está algo meio caminho entre um exemplo e uma analogia. Você tem algumas tarefas a fazer, então pega um pedaço de papel e escreve:
Então você se lembra de que também precisa comprar selos. Por causa da geografia da sua cidade, você precisa fazer isso depois do banco. Você pode copiar sua lista inteira em um novo pedaço de papel:
ou você pode rabiscar o que você tinha:
Ao pensar em outras tarefas, você pode escrevê-las no final da lista, mas com setas lembrando a você em que ordem fazê-las. Esta é uma lista vinculada. É mais rápido e fácil do que copiar toda a lista toda vez que você adicionar algo.
Então seu celular toca enquanto você está no banco "ei, eu tenho os selos, não atendo mais". Você apenas cruza STAMPS da lista, não reescreve um novo sem STAMPS.
Agora você pode realmente implementar uma lista de tarefas no código (talvez um aplicativo que coloque suas tarefas em ordem com base na sua região geográfica) e há uma chance razoável de você realmente usar uma lista vinculada para isso no código. Você deseja adicionar e remover muitos itens, o pedido é importante, mas não deseja copiar novamente a lista inteira após cada inserção ou exclusão.
fonte
fonte
A pilha de chamadas em linguagem C é implementada como uma lista vinculada nas APIs binárias x86 (e na maioria das outras).
Ou seja, a chamada de procedimento em linguagem C segue uma disciplina de primeiro a entrar, último a sair. O resultado da execução de chamadas de função (possivelmente recursivas) é chamado de "pilha de chamadas" ou, às vezes, apenas "a pilha".
A
CALL
instrução x86 acaba implementando uma lista vinculada usando a "pilha de chamadas". UmaCALL
instrução envia o conteúdo do registro% EIP, o endereço da instrução após aCALL
memória da pilha. O prólogo de função chamada envia o conteúdo do registro% EBP, o endereço mais baixo das variáveis locais na função de chamada, para a memória da pilha. Em seguida, o prólogo da função chamada define% EBP para a base da pilha da função atual.Isso significa que% EBP é um ponteiro para um local de memória que contém o endereço do valor% EBP da função de chamada. Isso não passa de uma lista vinculada, implementada parcialmente em hardware via
CALL
.Na medida em que isso é bom, é como as CPUs x86 implementam chamadas de função, particularmente chamadas de função em que a função possui sua própria cópia de argumentos e variáveis locais para a função. Toda chamada de função fornece algumas informações na "pilha de chamadas" que permite que a CPU continue de onde parou na função de chamada, sem interferência da função chamada ou da função de chamada.
fonte
Uma lista vinculada pode ser usada para implementar uma fila de mensagens.
Uma fila de mensagens é uma estrutura na qual armazenamos informações sobre eventos para processamento posterior. Por exemplo, quando o usuário pressiona uma tecla ou move o mouse, este é um evento. Um aplicativo pode estar ocupado no momento em que o evento ocorre, portanto, não se pode esperar que o evento seja processado no momento exato em que ocorre. Portanto, o evento é colocado em uma fila de mensagens (informações sobre qual tecla foi pressionada ou onde o mouse foi movido) e quando o aplicativo tem algum tempo de sobra, ele verifica sua fila de mensagens, busca eventos e processa eles. (Isso acontece dentro de um período de milissegundos, por isso não é perceptível.)
No cenário de uso que acabei de descrever, deve ser óbvio que nunca nos importamos em ter acesso aleatório a eventos armazenados na fila de mensagens; só nos preocupamos em poder armazenar mensagens nele e recuperá-las. Portanto, faz sentido usar uma lista vinculada, que fornece o tempo ideal para inserção / remoção.
(Não se esqueça de apontar que uma fila de mensagens é provável, ou mais provável, ou quase tão provável, a ser implementada usando uma lista de matriz circular; isso é um detalhe técnico e tem uma limitação: você só pode armazenar um número limitado de mensagens.)
fonte