Contributor: LEE BARKER               

{
 I'm looking for a routine to swap two nodes in a double
 linked list or a complete sort.

There has been a thread on the TP conf area in CIS on quick
sorting a (double) linked list. To swap two nodes, remove one,
then add it in where desired. Quick sample-
}

type
  s5       = string[5];
  ntp      = ^nodetype;
  nodetype = record
               prv,nxt : ntp;
               data    : s5;
             end;
const
  nbr : array[0..9] of string[5] = ('ZERO','ONE','TWO',
        'THREE','FOUR','FIVE','SIX','SEVEN','EIGHT','NINE');
var
  node,root : ntp;
  i : integer;

procedure swap (var n1,n2 : ntp);
  var n : ntp;
  begin
    n := n1;
    n1 := n2;
    n2 := n;
  end;

procedure addnode (var n1,n2 : ntp);
  begin
    swap(n1^.nxt,n2^.prv^.nxt);
    swap(n1^.prv,n2^.prv);
  end;

procedure getnode(i:integer);
  var n : ntp;
  begin
    getmem(n,sizeof(nodetype));
    n^.nxt := n;
    n^.prv := n;
    n^.data := nbr[i];
    if root=nil
    then root := n
    else addnode(n,root);
  end;

begin
  root := nil;
  for i := 0 to 9 do
  begin
    getnode(i);
    node := root;
    writeln;
    writeln('The linked now is-');
    repeat
      writeln(node^.data);
      node := node^.nxt;
    until node = root;
  end;
end.