Удаление одинаковых элементов списка - Turbo Pascal
Формулировка задачи:
Как подправить процедуру delete чтобы она удаляла элементы из первого списка, которые входят из второй.
Сейчас удаляет только одинаковые элементы первого списка.
Решение задачи: «Удаление одинаковых элементов списка»
textual
Листинг программы
type
TData=Integer;
PNode=^TNode;
TNode=record
next: PNode; data: TData;
end;
function Find(p: PNode; e: TData): PNode;
begin
while (p<>nil) and (p^.data<>e) do p:=p^.next;
Find:=p;
end;
procedure Delete(var p: PNode; q: PNode);
var t: ^PNode; d: PNode;
begin
t:=@p;
while t^<>nil do begin
if Find(q,t^^.data)=nil then t:=@t^^.next
else begin
d:=t^; t^:=t^^.next; Dispose(d);
end;
end;
end;
function NewNode(AData: TData; ANext: PNode): PNode;
var p: PNode;
begin
New(p); NewNode:=p; p^.data:=AData; p^.next:=ANext;
end;
procedure Add(var p: PNode; const s: String);
var
t: TData;
n: Integer;
begin
WriteLn(s);
Write('Количество элементов: '); ReadLn(n);
Write('Элементы: ');
for n:=1 to n do begin
Read(t); p:=NewNode(t,p);
end; ReadLn;
end;
procedure Show(p: PNode);
begin
while p<>nil do with p^ do begin
Write(' ',data); p:=next;
end; WriteLn;
end;
var
f, s: PNode;
i: Integer;
begin
Add(f,'Список 1');
Add(s,'Список 2');
Delete(f,s);
WriteLn('Список 1 без элементов из 2: '); Show(f);
end.
Объяснение кода листинга программы
- В функции
Findпроисходит поиск элемента в списке. Функция возвращает указатель на найденный элемент илиnil, если элемент не найден. - В процедуре
Deleteпроисходит удаление элемента из списка. Если указанный элемент уже был удален, то его память освобождается. - В функции
NewNodeсоздается новый узел списка с заданными данными и указателем на следующий узел. - В процедуре
Addдобавляются элементы в список. Данные элементов считываются с консоли, создаются новые узлы и добавляются в список. - В процедуре
Showпроисходит вывод списка на экран. Каждый элемент выводится пробелом. - В основной программе создаются два списка, добавляются элементы в них, затем удаляются. Выводится список без элементов из другого списка.