Puntatore di testa, puntatore di coda e tre nodi con puntatori nelle due direzioni
Dichiarazioni
Type tInfo = "qualsiasi"; {le informazioni nel nodo} pNodoDP = ^NodoDP; NodoDP = Record Info: tInfo; Succ, {puntatori nelle due direzioni} Prec: pNodoDP; End; ListaDP = Record Testa, Coda: pNodoDP; End;
Operazioni
Aggiungere un nodo in Testa
Procedure AggInTesta(var L: ListaDP; X: tInfo); Var P: pNodoDP; Begin New(P); P^.Info:=X; P^.Prec:=Nil; P^.Succ:=L.Testa; If(L.Testa <> Nil) Then L.Testa^.Prec:=P Else L.Coda:=P; L.Testa:=P; End;
Aggiungere un nodo in Coda
Procedure AggInCoda(Var L: ListaDP; X: tInfo); Var P: pNodoDP; Begin New(P); P^.Info:=X; P^.Succ:=Nil; P^.Prec:=L.Coda; If(L.Coda <> Nil) Then L.Coda^.Succ:=P Else L.Testa:=P; L.Coda:=P; End;
Aggiungere un nodo in Ordine
Procedure AggInOrdine(Var L: ListaDP; X: tInfo); Var P, Q: pNodoDP; Begin New(P); P^.Info:=X; If(L.Testa = Nil) Or (X <= L.Testa^.Info) Then Begin P^.Prec:=Nil; {...aggiungi primo nodo...} P^.Succ:=L.Testa; If(L.Testa = Nil) Then {...aggiungi in testa...} L.Coda:=P; Else L.Testa^.Prec:=P; L.Testa:=P; End Else if(L.Coda^.Info <= X) Then Begin P^.Prec:=L.Coda; {...aggiungi in coda...} P^.Succ:=Nil; L.Coda^.Succ:=P; L.Coda:=P; End Else Begin Q:=L.Testa^.Succ; {...aggiungi prima di Q...} While(Q^.Info < X) Do Q:=Q^.Succ; P^.Prec:=Q^.Prec; P^.Succ:=Q; Q^.Prec^.Succ:=P; Q^.Prec:=P; End; End;