How to create a Chained and Double Chained List?

Asked

Viewed 1,232 times

0

Can be in languages: C, Java, Javascript and Python.

I’m trying to create a Chained List and a Double Chained Movie theme.

I searched on the internet about the topics and arrived at this code:

<html>
<head>
<title>List</title>

<script language="javascript" type="text/javascript" src="List.js"> 
</script>
<script language="javascript" type="text/javascript">
  function onLoad() {
  var oList = new List();
  var oList2 = new List();

    oList.Add('Filmes');

    oList2.Add('Pulf Fiction');
    oList2.Add('Closer');

  var itemSub2 = 'Quentin Tarantino';

    oList2.Insert(1, itemSub2);

    oList.AddRange(oList2);

  for (var i = 0; i < oList.Count(); i++) {
    document.writeln(oList.GetItem(i) + "<br>");
  }

  document.writeln('oList2 - Exists<br>');

if (oList2.Exists(itemSub2)) {
    document.writeln('Yes<br>');
}
else {
    document.writeln('No<br>');
}

document.writeln('oList - Exists<br>');

var item2 = 'Mike Nichols';

if (oList.Exists(item2)) {
    document.writeln('Yes<br>');
}
else {
    document.writeln('No<br>');
}

oList.Add(item2);

document.writeln('oList Index = ' + oList.Find(item2) + "<br>");

    var copyList = oList;

    document.writeln('Equal = ' + oList.Equal(oList, copyList) + "<br>");

    copyList.ForEach(function (obj) {
        document.writeln(obj + "<br>");
    }

        document.writeln("<br>GetRange()<br>");

        var rangeList = copyList.GetRange(2, 2);

            rangeList.ForEach(function (obj) {
        document.writeln(obj + "<br>");
            }
        );
  }
</script>
</head>
<body onload="onLoad();">

</body>
</html>

I would like to know whether this code is valid or "acceptable" as a chained and doubly chained list and, if not, what is needed to make it in the lists cited. And I have doubts if one of the languages cited, there is an "easier" to create the lists in relation to the theme.

I tried to see the result screen of this code on Hellowebfree for Mac but I did not get the screen and so I’m appealing here.

  • 3

    The code shown is Javascript, so I recommend leaving only the Javascript label and maybe the html tag as well. If the object is something that is not language dependent then remove all tags and Javascript code and put pseudocode indicating tag independente-de-linguagem. In addition, if you are trying to create a root list because reason makes use of new List() ? And why aren’t you creating the nodes by hand using a Node class for example?

1 answer

1

Here is a very quiet example of implementing a double-chained java list: Class No:

package teste;

public class No {
    private No ant, prox;
    private Filme filme;

    public No(No ant, No prox, Filme filme) {
        this.ant = ant;
        this.prox = prox;
        this.filme = filme;
    }

    public No getAnt() {
        return ant;
    }

    public void setAnt(No ant) {
        this.ant = ant;
    }

    public No getProx() {
        return prox;
    }

    public void setProx(No prox) {
        this.prox = prox;
    }

    public Filme getFilme() {
        return filme;
    }

    public void setFilme(Filme filme) {
        this.filme = filme;
    }
}

Film class

package teste;

import java.util.Date;

public class Filme {
    private String nomeFilme;
    private Date dataLancamento;

    public String getNomeFilme() {
        return nomeFilme;
    }
    public void setNomeFilme(String nomeFilme) {
        this.nomeFilme = nomeFilme;
    }
    public Date getDataLancamento() {
        return dataLancamento;
    }
    public void setDataLancamento(Date dataLancamento) {
        this.dataLancamento = dataLancamento;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((dataLancamento == null) ? 0 : dataLancamento.hashCode());
        result = prime * result + ((nomeFilme == null) ? 0 : nomeFilme.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Filme other = (Filme) obj;
        if (dataLancamento == null) {
            if (other.dataLancamento != null)
                return false;
        } else if (!dataLancamento.equals(other.dataLancamento))
            return false;
        if (nomeFilme == null) {
            if (other.nomeFilme != null)
                return false;
        } else if (!nomeFilme.equals(other.nomeFilme))
            return false;
        return true;
    }
    @Override
    public String toString() {
        return "Filme [nomeFilme=" + nomeFilme + ", dataLancamento=" + dataLancamento + "]";
    }

}   

List Class

package teste;

public class Lista {
    /*
     * Aqui criamos 2 variaveis do tipo No para não perdermos a nossa lista
     * imagine a lista como um varal… e os nós como roupas… o ant e prox do nó
     * será nossos pregadores e os bambus que seguram o varal são as variaveis
     * inicio e fim… se essas variaveis perderem seu valor é como se soltasse o
     * fio do varal… continuaremos a ter 2 bambus mas não teremos mais o varal…
     */
    private No inicio;
    private No fim;

    // construtor
    public Lista() {
        inicializa();
        // chama inicializa para economizar codigo
    }

    public void inicializa() {
        inicio = null;
        fim = null;
        // inicializa faz a lista ficar vazia
    }

    /*
     * ai vem a famoza pergunta…se eu tenho uma lista cheia e pego meu inicio e
     * fim e seto eles para que a lista esteja vazia.. e meus nós que ja
     * instanciei??? Bom quando um objeto no java (no caso o nó) perde sua
     * referencia (no caso o inicio e fim) o próprio java retira da memória o
     * que está sobrando quem faz isso é o Garbage Collector… ou como preferir…
     * coletor de lixo
     */

    // aqui fazemos uma lista para inserir somente no final
    public void insereNoFim(Filme filme) {
        // declaramos e instanciamos a variavel caixa
        // do tipo nó. seu anterior vai ser o fim
        // pois estamos inserindo depois do fim
        No caixa = new No(inicio, null, filme);
        if (inicio == null)// se lista estiver vazia
            inicio = fim = caixa;
        else {
            // seta prox do No do fim para receber caixa
            fim.setProx(caixa);
            fim = caixa;
        }
    }

    // aqui fazemos uma lista para inserir somente no comeco
    public void insereNoComeco(Filme filme) {
        // declaramos e instanciamos a variavel caixa
        // do tipo nó. seu proximo vai ser o incio
        // pois estamos inserindo antes do inicio
        No caixa = new No(null, inicio, filme);
        if (inicio == null)// se lista estiver vazia
            inicio = fim = caixa;
        else {
            // seta ant do No do inicio para receber caixa
            inicio.setAnt(caixa);
            inicio = caixa;
        }
    }

    public void exibeLista() {
        No aux;
        aux = inicio;
        while (aux != null) {
            System.out.println(aux.getFilme());
            aux = aux.getProx();
        }
    }

    public No Busca_Exaustiva(Filme elemento) {
        No p = inicio;
        while ((p != null) && (p.getFilme() != elemento)) {
            p = p.getProx();
        }
        if ((p != null) && (p.getFilme() == elemento))
            return p;
        else
            return null;
    }

    // no remove temos 5 casos a considerar
    public void removeLista(Filme elemento) {
        No pos;
        pos = Busca_Exaustiva(elemento);
        if (pos != null)// 1- se existe o No a ser deletado
        {
            if (inicio != fim)// 2- se só existe um Nó na lista
            {
                if (pos == inicio)// 3- se o Nó esta no começo
                {
                    inicio = pos.getProx();
                    pos.getProx().setAnt(null);
                } else if (pos == fim)// 4- se o Nó esta no fim
                {
                    fim = pos.getAnt();
                    pos.getAnt().setProx(null);
                } else// 5- se o no esta no meio
                {
                    pos.getAnt().setProx(pos.getProx());
                    pos.getProx().setAnt(pos.getAnt());
                }
                pos.setAnt(null);
                pos.setProx(null);
            } else {
                inicio = null;
                fim = null;
            }
        } else
            System.out.println("Elemento nao encontrado");
    }
}

Application class

package teste;

import java.util.Date;

public class Aplicacao {
    Lista lista;

    public Aplicacao() {
        lista = new Lista();
    }

    public void executa() {
        for (int i = 1; i <= 5; i++) {
            Filme filme = new Filme();
            filme.setDataLancamento(new Date());
            filme.setNomeFilme("Matrix " + i);

            lista.insereNoFim(filme);
            System.out.println("Lista inserindo no final");
            lista.exibeLista();
            System.out.println("\n\n");
        }

        Filme filme = new Filme();
        filme.setDataLancamento(new Date());
        filme.setNomeFilme("Guerra Civil ");

        System.out.println("Lista inserindo no inicio ");
        lista.insereNoComeco(filme);
        lista.exibeLista();

        // Removendo alguns elementos
        lista.removeLista(filme);
        // Lista após remover alguns dos elementos (30,1,5)
        System.out.println("\n\nDepois de Remover os elementos");
        lista.exibeLista();
    }

    public static void main(String args[]) {
        Aplicacao a = new Aplicacao();
        a.executa();
    }
}
  • This created list is worth as Chained and Double Chained List or only the second option?

  • worth as double chained, to make simply chained just remove the next node.

  • It’s java. The question tag is [tag:javascript].

  • Now that I saw that the question was initially published with tag [tag:java]. The answer is valid.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.