Дописать в начало списка элементы, которые входят в L1, но не входят в L2 - PascalABC.NET
Формулировка задачи:
Дано задание:
"Cформировать список L из элементов, которые входят одновременно в списки L1 и L2. Дописать в начало элементы, которые входят в L1, но не входят в L2, а в конец - элементы, которые входят в L2, но не входят в L1".
Процедуру создания/заполнения списка и вывода написал, но не могу разобраться, как создать список L из элементов, которые входят одновременно в списки L1 и L2 и дальше(
Помогите пожалуйста!
Решение задачи: «Дописать в начало списка элементы, которые входят в L1, но не входят в L2»
textual
Листинг программы
type
PLink = ^TElement;
TElement = Record
data: integer;
next: PLink;
End;
procedure Input(var u: PLink);
var
ElNew, ElPred: PLink;
Value: integer;
i, n: integer;
begin
readln(n);
u := nil;
Writeln('Введите элементы списка: ');
for i := 1 to n do
begin
Read(Value);
New(ElNew);
ElNew^.Data := Value;
ElNew^.next := nil;
if u = nil then
u := ElNew
Else
ElPred^.next := ElNew;
ElPred := ElNew;
end;
end;
procedure Vivod(u: PLink; ch: string);
begin
if u = nil then
begin
writeln('Список пуст!Для продолжения нажмите Enter');
readln;
Exit;
end;
writeln('Список ', ch);
while u <> nil do
begin
write(u^.data, ' ');
u := u^.next;
end;
writeln;
end;
procedure Delete(var u: PLink);
var
x: PLink;
begin
while u <> nil do
begin
x := u;
u := u^.next;
Dispose(x);
end;
end;
/// Функция inList возвращает True если данный элемент входит в список
function inList(data : integer; L : PLink) : Boolean;
begin
Result := True;
while L <> nil do
if L^.data = data then
Exit
else
L := L^.next;
Result := False;
end;
/// Процедура добавляет УНИКАЛЬНЫЙ элемент к списку
procedure Add(data : integer; var L : PLink);
begin
if L = nil then
begin
New(L); L^.data := data; L^.next := nil;
end
else
begin
var Cur := L;
var Last : PLink;
repeat
if Cur^.data = data then Exit;
Last := Cur; Cur := Cur^.next;
until Cur = nil;
New(Last^.next); Last := Last^.next; Last^.data := data; Last^.next := nil;
end;
end;
procedure Soed(L1: PLink; L2: PLink; var L: Plink);
begin
L := nil;
while L1 <> nil do
begin
if inList(L1^.data, L2) then
Add(L1^.data, L);
L1 := L1^.next;
end;
end;
var
L1, L2, L: PLink;
begin
write('Введите кол-во элеметов списка "L1": '); Input(L1); Vivod(L1, 'L1');
write('Введите кол-во элеметов списка "L2": '); Input(L2); Vivod(L2, 'L2');
Soed(L1, L2, L); Vivod(L, 'L');
Delete(L1);
Delete(L2);
Delete(L);
end.
Объяснение кода листинга программы
- Ввод данных о количестве элементов списков L1 и L2
- Ввод элементов списка L1
- Вывод списка L1
- Ввод элементов списка L2
- Вывод списка L2
- Начало процедуры Soed. На этом этапе список L инициализируется как пустой.
- Проверка каждого элемента списка L1. Если элемент присутствует в списке L2, он добавляется в список L.
- Цикл продолжается до тех пор, пока все элементы списка L1 не будут проверены.
- Вывод списка L.
- Удаление списка L1.
- Удаление списка L2.
- Удаление списка L.