program name;
uses crt;
type
tdata = integer;
sllptr = ^slltype;
slltype = record
inf: tdata;
next: sllptr;
end;
tlist = record
first, last: sllptr;
end;
procedure init_list(var l: tlist);
begin
l.first := nil; l.last := nil;
end;
procedure add_to_list(var l: tlist;
element: tdata);
var p: sllptr;
begin
new(p);
p^.inf := element;
p^.next := nil;
if l.first = nil then l.first := p
else l.last^.next := p;
l.last := p
end;
function present_in_list(var l: tlist;
element: tdata): boolean;
var
p: sllptr;
ok: boolean;
begin
p := l.first; ok := true;
while (p <> nil) and ok do
if p^.inf = element
then ok := false
else p := p^.next;
present_in_list := (p <> nil)
end;
procedure unite(var l_res, one, two: tlist);
var
p: sllptr;
x: tdata;
begin
p := one.first;
while p <> nil do begin
add_to_list(l_res, p^.inf);
p := p^.next;
end;
p := two.first;
while p <> nil do begin
{ вот то, что нужно: элемент добавляется к списку-результату
только если не присутствует уже в нем }
if not present_in_list(l_res, p^.inf)
then add_to_list(l_res, p^.inf);
p := p^.next;
end;
end;
var ls, ls_1, ls_2: tlist;
a: tdata; i, n: integer;
p: sllptr;
begin
clrscr;
init_list(ls_1);
writeln('vvedite kol-vo elementov spiska1');
readln(n);
for i := 1 to n do begin
write('vvedite element spiska1: '); readln(a);
add_to_list(ls_1, a)
end;
init_list(ls_2);
writeln('vvedite kol-vo elementov spiska2');
readln(n);
for i := 1 to n do begin
write('vvedite element spiska2: '); readln(a);
add_to_list(ls_2, a)
end;
init_list(ls);
unite(ls, ls_1, ls_2);
p := ls.first;
while p <> nil do begin
write(p^.inf, ' ');
p := p^.next;
end;
readln;
end.
function present_in_list(var l: tlist;
element: tdata): boolean;
procedure unite(var l_res, one, two: tlist);
var
p: sllptr;
x: tdata;
begin
p := one.first;
while p <> nil do begin
{ если этот элемент присутствует во втором списке }
if present_in_list(two, p^.inf) and
{ и еще не присутствует в результате }
(not present_in_list(l_res, p^.inf)) then
{ то добавить его к результату }
add_to_list(l_res, p^.inf);
p := p^.next;
end;
end;