21 Liste – Inserimento

Dopo aver creato la nostra lista nel precedente articolo adesso vediamo come inserire degli elementi.
Ipotiziamo sempre di avere una lista di numeri per semplicità. Potremmo effettuare tre diversi tipi di inserimenti, vediamoli in ordine:

Inserimento in TESTA
L’elemento verrà sempre inserito in testa. Ovviamente quindi la testa della nostra lista cambierà ad ogni inserimento.
Vediamolo solo nel caso di semplicemente e doppiamente concatenata.

public void inserimento_in_Testa(int dato)
{
    if(n==null)
    {
        n=new Nodo();
        n.numero=dato;
        n.successivo=null;
        n.precedente=null;//solo se la lista è doppiamente concatenata
    }
    else
    {//lista contenente almeno un elemento
        Nodo tmp=new Nodo();//variabile di supporto
        tmp.numero=dato;
        tmp.successivo=n;      
        n.precedente=tmp;//solo se la lista è doppiamente concatenata
        tmp.precedente=null;//solo se la lista è doppiamente concatenata
        n=tmp;
    }
}

Inserimento in CODA
L’elemento nuovo verrà inserito sempre in fondo alla lista.
Nell’inserimento in coda notiamo una cosa importante, la variabile n deve sempre puntare alla testa della lista, per questo usiamo la variabile tmp2 per scorrere la lista.

public void inserimento_in_Coda(int dato)
{
    if(n==null)
    {//lista vuota
        n=new Nodo();
        n.numero=dato;
        n.successivo=null;
        n.precedente=null;//solo se la lista è doppiamente concatenata
    }
    else
    {//lista contenente almeno un elemento
        Nodo tmp=new Nodo();//variabile di supporto
        Nodo tmp2=n;//variabile di sopporto 2
        tmp.numero=dato;
        tmp.successivo=null;   
        while(tmp2.successivo!=null)//raggiungo l'ultimo nodo
            tmp2=tmp2.successivo;
        //adesso attacco il nuovo nodo all'ultimo
        tmp2.successivo=tmp;
        tmp.precedente=tmp2;//solo se la lista è doppiamente concatenata
    }

Inserimento ORDINATO
Inseriamo questa volta un dato in una certa posizione data.

public void inserimento_Ordinato(int dato,int posizione)
{
    if(posizione==1 || n==null)
        inserimento_in_Testa(dato);
    if(posizione>1 && n!=null)
    {
        Nodo tmp=new Nodo();
        tmp.numero=dato;
        Nodo tmp2=n;
        /*raggiungiamo adesso il nodo precedente alla posizione
        in cui vogliamo inserire il nuovo nodo. Ad esempio se vogliamo 
        inserirlo come secondo tmp2 sarà uguale al nodo di testa.
        Se posizione > della lunghezza della lista lo mettiamo in coda
        */
        for(int i=2;i<posizione && tmp2!=null;i++)
            tmp2=tmp2.successivo;
        if(tmp2!=null)
        {
            tmp.successivo=tmp2.successivo;
            tmp2.successivo=tmp;
            tmp.precedente=tmp2;//solo se la lista è doppiamente concatenata
            tmp.successivo.precedente=tmp;//solo se la lista è doppiamente concatenata
        }
        else
            inserimento_in_Coda(dato);
    }
}

Voglio fare un’osservazione solo sull’istruzione tmp.successivo.precedente. Con questa istruzione modifichiamo il campo “precedente” del nodo successivo a tmp.

Credo che il codice mostrato sia abbastanza semplice. Per usare la lista basterà istanziare una variabile di tipo Lista nel main e tramite questa variabile invocare i metodi.

Chiudo qua l’articolo e, come vi dico sempre, ma non mi stanco di ripetere, se avete dubbi chiedete qui sotto nei commenti o scrivendoci sulla nostra pagina facebook!
Alla prossima!

Please follow and like us: