Lista duplamente encadeada desenvolvida na disciplina Estruturas de Dados
A Lista Duplamente Encadeada foi implementada utilizando duas classe: Element e LinkedList, a primeira para servir de preenchimento para a lista e a segunda a lista propriamente dita.
Os métodos da lista podem ser divididos em quatro: Métodos de Apoio, Métodos de Adição, Métodos de Deleção e Métodos do Cursor.
Falando primeiramente dos Métodos de Apoio, o principal deles é o método get_cursor_position(), que serve para conseguir a posição atual do cursor, além da função óbvia que ele executa, este método também é utilizado em casos que é preciso percorrer a lista e recuperar a posição de um determinado elemento, como é o caso de position_of(), ou então, para o cálculo de posição em go_to_position(), forward() e backward(), ambos Métodos de Cursor que iremos tratar mais adiante. Além desse método temos também is_full() e is_empty(), que indicam a lotação da lista e permitem o lançamento de exceções conforme o seu retorno.
Os Métodos de Adição. Todos possuem uma verificação para ver se a lista já está cheia utilizando o método de apoio is_full(), caso a resposta seja verdadeira uma exceção é levantada, além disso, todos adicionam uma unidade ao atributo "counter". Tanto set_last() quanto em set_first() o cursor não é movimentada quando os métodos são chamadas, apenas caso o elemento seja o primeiro adicionado na lista. Em add_next() o cursor se move para o elemento adicionado, a adição funciona apenas apontando o atributo "next" do elemento adicionado para o "next" do cursor, o "next" do cursor para o elemento e o "previous" do elemento para o cursor e logo em seguida, adicionando o elemento como cursor da Lista. A mesma lógica é utilizada por add_in_position(), que utiliza add_next() como base, apenas com o adicional de ir para a posição anterior a que o usuário deseja adicionar o elemento, utilizando o método go_to_position(), um método de cursor.
Os Métodos de Deleção. O primeiro método de deleção é o delete_current() que apenas pega o "next" e o "previous" do cursor, e muda seus atributos, respectivamente, para o "previous" e o "next" do cursor. Os métodos delete_first() e delete_last() funcionam da mesma forma que seus equivalentes na adição. O mesmo vale para delete_in_position() que também utiliza go_to_position() como base. Já no caso de delete_by_value() duas funções são utilizadas de apoio, a primeira position_of() que retorna a posição de um elemento pelo seu valor e passando essa posição como parâmetro de delete_in_position(), conseguimos executar o propósito da nossa função.
Os Métodos de Cursor. Todas as funções de cursor, com exceção de go_to_first() e go_to_last(), utilizam a função get_cursor_position() para executar cálculos de posição em relação ao cursor, em go_to_position() o valor do sinal determina se a função irá utilizar forward() e backward() para o deslocamento.