Помощь - Поиск - Пользователи - Календарь
Полная версия: Списки
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Caries
Описать процедуру которая формирует список L, включив в него по одному разу элементы которые входят хотя в один из списков L1 и L2
volvo
Сначала идешь сюда: FAQ: Списки
читаешь все внимательно, и пишешь программу. Вот если она у тебя не заработает, то приходи и скажи, где...
volvo
А вообще-то это делается вот так:
Код
uses item, list;

const
 first: array[1 .. 10] of integer =
   (1, 3, 6, 3, 8, 2, 6, 5, 3, 9);
 second: array[1 .. 10] of integer =
   (1, 23, 6, 83, 8, 2, 16, 5, 35, 9);


procedure add_once(var lst_from, lst_to: tlist);
 var p: ptitem;
 begin
   p := lst_from.first;
   while assigned(p) do begin
     if lst_to.find(p^.info) = nil
       then lst_to.append(p^.info);
     p := p^.next
   end
 end;

var
 L, L1, L2: tlist;
 i: integer;

begin
 L1.init; for i := 1 to 10 do
   L1.append(first[i]); L1.print;

 L2.init; for i := 1 to 10 do
   L2.append(second[i]); L2.print;

 L.Init;
 add_once(L1, L);
 add_once(L2, L);
 L.print;

 L.done;
 L2.done;
 L1.done;
end.


Чтобы запустить эту программу - качай файл list.rar из аттача и распаковывай в ту же директорию, где сама программа.
Altair
Цитата
Описать процедуру которая формирует список L, включив в него по одному разу элементы которые входят хотя в один из списков L1 и L2

Тебе дали ссылку, с необходимой информацией.
Если хочешь думать, читай и делай сам. Если нет, получай решение с ООП...
и разбирайся с ООП и ДСД smile.gif :P

ООП в массы!!!
Caries
прогу накидал но она просто пока соединяет 2 списка. Нужно реализовать проверку списков, дабы исключить повторных включений в соединенном списке. Как? sad.gif
Код
program name;
uses crt;
type
tdata=integer;
sllptr=^slltype;
slltype = record
inf:tdata;
next: sllptr;
end;
procedure Unite(var head1,head2:sllptr);
var cur: sllptr;
begin
if head2<>nil then begin
 if head1=nil then head1:=head2
  else
   begin cur:=head1;
   while cur^.next<>nil do cur:=cur^.next;
   cur^.next:=head2;
   end;
   end;
   writeln;writeln;
   cur:=head1;
   while cur <> nil do
   begin
    write(cur^.inf);
    if cur^.next <> nil then write(',');
    cur:=cur^.next
    end;readln;
   end;

var head3,head4,g:sllptr;a:integer; i,n:integer;
begin
clrscr;
writeln('vvedite kol-vo elementov spiska1');
readln(n);
writeln('vvedite element spiska1');
read(a);
new(head3);
head3^.inf:=a;
head3^.next:=nil;
for i:=1 to n - 1 do
begin read(a);
new(g);
g^.inf:= a;
g^.next:=head3;
head3:=g;
end;
writeln('vvedite kol-vo elmenetov spiska2');
read(n);
writeln('vvedite elementi spiska2');
read(a);
new(head4);
head4^.inf:=a;
head4^.next:=nil;
for i:=1 to n-1 do
begin read(a);
new(g);
g^.inf:=a;
g^.next:=head4;
head4:=g;
end;
unite(head3,head4);
readln;
end.
volvo
Цитата(Caries @ 20.04.05 19:07)
Нужно реализовать проверку списков, дабы исключить повторных включений в соединенном списке.  Как? sad.gif

"Еще раз повторю - не пытайтесь объять необъятное" (С) Козьма Прутков.

Не надо все действия производить в основной программе. Действуй по принципу "разделяй и властвуй":
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.
Caries
Извиняюсь. Я не понял какую роль выполняет function present_in_list...
Объясните пожалуйста
volvo
Функция проверки, присутствует ли элемент в списке...
function present_in_list(var l: tlist;
element: tdata): boolean;

Передаем этой функции список, в котором надо проверять (L) и значение (element), и функция вернет True если element уже присутствует в L... Иначе вернется False...
Caries
А если мне надо чтобы входило одновременно в 2 списка?
volvo
То есть? Условие переформулируй полностью. Как оно будет звучать?
Caries
Описать процедуру которая формирует список L, включив в него по одному разу элементы которые входят одновременно в L1 и L2
volvo
Тогда Unite должна будет выглядеть так:
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;


Все просто :yes:
Caries
спасибо!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.