В списке целых чисел удалить из каждой группы подряд идущих одинаковых элементов все, кроме одного - Turbo Pascal
Формулировка задачи:
Здравствуйте,
Вы не могли бы помочь с задачей контрольной работы?
"Составить программу. В списке целых чисел удалить из каждой группы подряд идущих одинаковых элементов все, кроме одного."
Буду премного благодарен.
------------------------------------------------
С Уважением, superuser!
Решение задачи: «В списке целых чисел удалить из каждой группы подряд идущих одинаковых элементов все, кроме одного»
textual
Листинг программы
const
maxRandom = 2;
lenList = 100;
type
tList = ^rList;
rList = record
N : Integer;
P, X : tList;
end;
function CreateList : tList;
var
L : tList;
i : Byte;
begin
Randomize;
New(L);
L^.N := Random(maxRandom + 1);
L^.X := nil;
for i := 1 to lenList - 1 do
begin
New(L^.P);
L^.P^.X := L;
L := L^.P;
L^.N := Random(maxRandom + 1);
end;
L^.P := nil;
CreateList := L;
end;
procedure OutList(L : tList);
begin
Write('Список:');
while L <> nil do
begin
Write(#32, L^.N);
L := L^.X;
end;
WriteLn;
end;
procedure TransformList(var L : tList);
var
cur, tmp : tList;
begin
cur := L;
while cur <> nil do
begin
if (cur^.X <> nil) and (cur^.N = cur^.X^.N) then
begin
tmp := cur^.X;
cur^.X := tmp^.X;
if tmp^.X <> nil then
cur^.X^.P := cur;
Dispose(tmp);
end
else
cur := cur^.X;
end;
end;
var
L : tList;
begin
L := CreateList;
OutList(L);
TransformList(L);
OutList(L);
end.
Объяснение кода листинга программы
- В функции CreateList создается новый список, в котором каждый элемент является ссылкой на предыдущий элемент списка, за исключением первого элемента, который является самостоятельным элементом. Это достигается путем использования цикла for, который выполняется от 1 до lenList-1, и в каждой итерации создается новый элемент, который ссылается на предыдущий элемент списка.
- В процедуре OutList выводится содержимое списка, начиная с самого первого элемента. Для этого используется цикл while, который выполняется до тех пор, пока L не станет равным nil. На каждой итерации выводится значение N текущего элемента списка, а затем происходит переход к следующему элементу, который хранится в X.
- В процедуре TransformList происходит преобразование списка. Для этого используется цикл while, который выполняется до тех пор, пока текущий элемент списка не станет равным nil. Внутри цикла проверяется условие, что X равен P текущего элемента списка. Если это условие выполняется, то текущий элемент списка копируется в новый элемент, создается новый элемент, который ссылается на предыдущий элемент списка, и затем происходит переход к следующему элементу, который хранится в X. Если условие не выполняется, то текущий элемент списка просто переходит к следующему элементу.