Помогите пожалуйста переписать программу с Паскаля в Си.
Вот задание: добавить элемент в двусвязный список (в начало, середину и конец) и упорядочить в порядке возрастания.
Код программы в Паскале:

Код

program dvipLIST;
uses crt;
type sar=^el;
el=record
    data:integer;
    next:sar;
    back:sar;
        end;

    procedure makeNew (var first:sar);
    var x:integer;
g,temp:sar;
    begin
        writeln('Insert integer numbner. To finish press 0');
        readln(x);
        while x<>0 do
        begin
            if first=nil then
                begin
                    new(g);
                    g^.data:=x;
                    g^.next:=nil;
                    g^.back:=nil;
                    first:=g;
    end
            else begin
            new(temp);
            g^.next:=temp;
            temp^.back:=g;
            g:=temp;
            g^.data:=x;
            end;
            readln(x);
        end;
            writeln('LIST is done');
    end;


    procedure addbefore(var first:sar; x:integer);
    var elem:sar;
    begin
        new(elem);
        elem^.data:=x;
        elem^.next:=first;
        first^.back:=elem;
        elem^.back:=nil;
  first:=elem;
    end;

    procedure addlast(first:sar; data1:integer);
    var elem:sar;
    begin
       elem:=first;
    while(elem^.next<>nil)do
    elem:=elem^.next;
    new(elem^.next);
       elem^.next^.back:=elem;
       elem:=elem^.next;
    elem^.data:=data1;
       elem^.next:=nil;
    end;

      procedure addtocenter(first:sar; data1:integer);
        var el,elk:sar;
        begin
        el:=first;
  elk:=el^.next;
  new(el^.next);
  el^.next^.back:=el;
        elk^.back:=el^.next;
        el:=el^.next;
  el^.next:=elk;
  el^.data:=data1;
  end;

    procedure delete(var first:sar);
    var s:sar;
    begin
     while(first<>nil)do
  begin
  s:=first;
  first:=first^.next;
  dispose(s);
  end;
    end;

    procedure print(first:sar);
    begin
    writeln('Spausdiname: ');
        while first<>nil do
        begin
            write(first^.data,' ');
            first:=first^.next;
        end;
        writeln();
    end;

procedure sort (var first:sar);
var s1,s2:sar;
    nonsort:boolean;
  begin
  nonsort:=true;
     while((nonsort)and(first<>nil))do
    begin
    s1:=first;
       s2:=s1^.next;
     nonsort:=false;
  while(s2<>nil)do
      begin

        if(s1^.data>s2^.data)
     then
             begin
               s1^.next:=s1^.next^.next;
         if(s1^.next<>nil)then
      s1^.next^.back:=s1;
         s2^.next:=s1;
         s2^.back:=s1^.back;
         if(s2^.back<>nil)then
      s2^.back^.next:=s2;
         s1^.back:=s2;
    nonsort:=true;
       s2:=s1^.next;
    end
    else
    begin
    s1:=s1^.next;
    s2:=s2^.next;
    end;

  end;
   while(s1^.back<>nil)do
      begin
      s1:=s1^.back;
      first:=s1;
         end;
  end;
  end;





var LIST:sar;
selection:integer;
data:integer;
    begin
        makeNew(LIST);
        writeln('1)Insert element to the beginning');
        writeln('2)Insert to center ');
        writeln('3))Insert to the end.');
        writeln;
        write('Where to insert? - ');
        readln(selection);
        writeln;
        case selection of
        1: begin
  writeln('insert the value');
  readln(data);
  addbefore(LIST,data);
        end;
  2:begin
  writeln('insert the value');
  readln(data);
  addtocenter(LIST,data);
        end;
        3:begin
  writeln('insert the value');
  readln(data);
  addlast(LIST,data);
        end;
        end;
        sort(LIST);
  print(LIST);
        delete(LIST);
    end.