Упорядочить односвязный список. delphi/pascal
Необходимо упорядочить список: в начало положительные, затем 0, в конец отрицательные. Сам код:
type
TInfo = integer;
PElem = ^TElem;
TElem = record
info: TInfo;
next: PElem;
end;
procedure AddR(var ListN, ListK: PElem; r: integer); // адреса начала и конца списка и R
var ListC: PElem; // текущий элемент списка
begin
if ListN = nil then CreateList(ListN , ListK, r) // если список пуст
else
if r > 0 then AddFirst(ListN, ListK, r) // добавить в начало
else
if r < 0 then AddLast(ListN, ListK, r) // добавить в конец
else
begin // найти после какого
ListC:=ListN; // с начала списка
while (ListC^.next <> nil) and (ListC^.next^.info > 0) do
ListC := ListC^.next;
AddMedium(ListN, ListC, ListK, r); // добавить после текущего
end;
Процедуры добавления в начало/конец/середину списка:
procedure AddFirst(var ListN: PElem; ListK: PElem; r: TInfo);
var Elem: PElem;
begin
new(Elem);
Elem^.info:=r;
Elem^.next:=ListN;
ListN:=Elem; // теперь он 1-ый
end;
// добавить новый элемент в конец
procedure AddLast(ListN: PElem; var ListK: PElem; r: TInfo);
begin
new(ListK^.next);
ListK^.next^.info:=r;
ListK^.next^.next:=nil;
ListK:= ListK^.next;
end;
// добавить новый элемент в середину после ListC (не в конец)
procedure AddMedium(ListN,ListC,ListK: PElem; r: TInfo);
var Elem: PElem;
begin
new(Elem);
Elem^.info:=r;
Elem^.next:=ListC^.next; // после него то, что было после ListC
ListC^.next:=Elem; // а он сам после ListC
end;
procedure CreateList(var ListN, ListK: PElem; r: TInfo);
begin
New(ListN);
ListK:=ListN; // конец и начало совпадают
ListN^.info:=r;
ListN^.next:=nil;
end;
Нужно упорядочить список по правилу: в начале положительные, затем 0, в конец отрицательные, при этом их порядок их следования не должен меняться, т.е. дан список 5, 0, 3, -9, 0, -8, 7 после его упорядочивания должно получиться так 5, 3, 7, 0, 0, -9, -8.
Проблема в том, что нули и отрицательные числа упорядочиваются в требуемом порядке, а положительные - в порядке, обратном требуемому. Например, при записи в список последовательности 1, 3, -4, 0, -5, 7 в списке будет последовательность 7, 3, 1, 0, -4, -5. В чём ошибка?
Ответы (1 шт):
Чтобы сохранить исходный порядок для положительных чисел, вам нужно положительные числа вставлять не в начало списка, а после последнего положительного числа
procedure AddR(var ListN, ListK: PElem; r: integer); // адреса начала и конца списка и R
var ListC: PElem; // текущий элемент списка
begin
if ListN = nil then
CreateList(ListN, ListK, r) // если список пуст
else if r < 0 then AddLast(ListN, ListK, r) // добавить в конец
else begin // добавить после последнего положительного
if ListN^.info <= 0 then // Если первый элемент не положительный
AddFirst(ListN, ListK, r) // добавить в начало
else begin
ListC := ListN; // с начала списка
while (ListC^.next <> nil) and (ListC^.next^.info > 0) do
ListC := ListC^.next;
AddMedium(ListN, ListC, ListK, r); // добавить после текущего
if ListC = ListK then // Если добавляли в конец списка
ListK := ListC^.next; // то сместить конец списка
end;
end;
end;