Ну я ж сказал, что писано на коленке, не оттещено.
Вот вам отдебаженый вариант:
[syntax="pascal"]program P1;
type
PMyType = ^TMyType;
TMyType = record
Info: Integer;
Prev: PMyType;
Next: PMyType;
end;
var
First: PMyType;
Cursor: PMyType;
LastNegItem: PMyType;
i: Integer;
begin
Randomize;
new(First); // создадим первый элемент списка
First^.Info := Random(1000)-500;
First^.Next := nil;
First^.Prev := nil;
for i := 1 to 19 do // создаем остальные 19

begin
new(Cursor);
Cursor^.Info := Random(1000)-500;
Cursor^.Next := First;
Cursor^.Prev := nil;
First^.Prev := Cursor;
First := Cursor;
end;
WriteLn('Элементы списка: ');
Cursor := First;
repeat
Write(Cursor^.Info, ' ');
Cursor := Cursor^.Next;
until Cursor = nil;
WriteLn('');
// ищем первый последний отрицательный элемент
LastNegItem := nil;
Cursor := First;
while Cursor <> nil do
begin
if Cursor^.Info < 0 then
LastNegItem := Cursor;
Cursor := Cursor.Next;
end;
if LastNegItem <> nil then
begin // элемент существует, можно продолжить
// найдем последний элемент:
Cursor := First;
while Cursor^.Next <> nil do Cursor := Cursor^.Next;
if Cursor = LastNegItem then
begin
WriteLn('за последним отрицательным элементов нет.');
// создадим одно кольцо

Cursor^.Next := First;
First^.Prev := Cursor;
WriteLn('Единственное кольцо: ');
First := LastNegItem^.Next;
repeat
Write(First^.Info, ' ');
First := First^.Next;
until First = LastNegItem^.Next;
WriteLn('');
// очистим память этого кольца
First := LastNegItem;
First.Prev^.Next := nil;
while First <> nil do
begin
Cursor := First^.Next;
Dispose(First);
First := Cursor;
end;
end else begin
// Создадим сначала второе кольцо (из оставшихся элементов)
Cursor^.Next := LastNegItem^.Next;
LastNegItem^.Next^.Prev := Cursor;
Cursor := Cursor^.Next;
// теперь создадим первое кольцо
First^.Prev := LastNegItem;
LastNegItem^.Next := First;
WriteLn('задача выполнена');
WriteLn('Первое кольцо: ');
First := LastNegItem^.Next;
repeat
Write(First^.Info, ' ');
First := First^.Next;
until First = LastNegItem^.Next;
WriteLn('');
WriteLn('Второе кольцо: ');
First := Cursor;
repeat
Write(First^.Info, ' ');
First := First^.Next;
until First = Cursor;
WriteLn('');
// очистим память второго кольца
First := Cursor;
Cursor^.Prev^.Next := nil;
while First <> nil do
begin
Cursor := First^.Next;
Dispose(First);
First := Cursor;
end;
// очистим память первого кольца
First := LastNegItem;
LastNegItem^.Prev^.Next := nil;
while First <> nil do
begin
Cursor := First^.Next;
Dispose(First);
First := Cursor;
end;
end;
end else begin
WriteLn('Отрицательных элементов нет в списке');
// очистим память
while First <> nil do
begin
Cursor := First^.Next;
Dispose(First);
First := Cursor;
end;
end;
end.[/syntax]