Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Списки в Turbo Pascal

Автор: HAMELION 23.06.2007 3:27

Помогите плиз найти ошибку в программе: Условие=> Написать программу которая формирует список L, включив в него по одному разу элементы, которые входят в один из списков L1 или L2, но не входят во второй.
Проблема в том что программа сравнивает только последние элементы списков L1 и L2
Вот листинг=>

Код
Program SPISKI;
USES CRT;
Type spisok=^zveno;
     zveno = record
        Elem:integer;
        Next:spisok;
     end;
var  L,P:spisok;
     L1,L2:spisok;
     x,z: integer;
     n,s: integer;
       i: integer;
Procedure AddSpisok(var Top:Spisok; k:integer);{процедура добавления элемента в список}
var NewTop:Spisok;
begin
   New(NewTop);
   NewTop^.Elem:=k;
   NewTop^.Next:=Top;
   Top:=NewTop;
end;
Procedure Print(Top:spisok);{печать списка}
begin
    while Top<>nil do
    begin
    writeln(Top^.Elem);
    Top:=Top^.Next; end;
    writeln; end;
Function Otsev (TOP:spisok; j:integer ):boolean;
var P:spisok;
begin
   Otsev:=False;
   P:=TOP;
   while P<>nil  do
   if P^.Elem=j then Otsev:=True;
end;
begin
   clrscr;
   L1:=Nil;
   write('BBEDITE KOLICHESTBO ELEMENTOV SPISKA L1: '); readln(n);
   for i:=1 to n do begin read(x);
   AddSpisok(L1,x); end;
   L2:=Nil;
   write('BBEDITE KOLICHESTBO ELEMENTOV SPISKA L2: '); readln(s);
   for i:=1 to s do begin read(z);
   AddSpisok(L2,z); end;
   Begin
   P:=L1;  
   while P<>nil  do
   if P^.Elem<>L2^.Elem then AddSpisok(L,P^.elem); end;
   Begin
   P:=L2;  
   while P<>nil  do
   if P^.Elem<>L1^.Elem then AddSpisok(L,P^.elem); end;
   writeln('SPISOK L => ');
   Print(L);
   writeln('PRESS ANY KEY');
   READKEY;
   end.

Автор: volvo 23.06.2007 3:41

P:=L1;
while P<>nil do begin
p2 := L2; found := false;
while p2 <> nil do begin
if P^.Elem = p2^.Elem then found := true; // AddSpisok(L,P^.elem);
p2 := p2^.next;
end;
if not found then AddSpisok(L,P^.elem);
p := p^.next;
end;


Вот так должна выглядеть проверка тех элементов, которые присутствуют в L1, на их же присутствие в L2... То же самое (по аналогии) надо будет сделать для проверки элементов L2 на их присутствие в L1... Ну, и не помешает добавить проверку (перед добавлением через AddSpisok), что элемент, на который указывает P^, еще не присутствует в L, и добавлять только в этом случае...

Добавь теги, программа совершенно нечитаема без них...

Автор: volvo 23.06.2007 5:54

Можно, кстати, пойти другим путем:

function check_list(X: integer; p: spisok): boolean;
var b: boolean;
begin
b := false;
while (not b) and (p <> nil) do begin
if X = p^.elem then b := true;
p := p^.next;
end;
check_list := b;
end;

...
P:=L1;
while P <> nil do begin
if not check_list(p^.elem, L2) then AddSpisok(L,P^.elem);
p := p^.next;
end;
P:=L2;
while P <> nil do begin
if not check_list(p^.elem, L1) then AddSpisok(L,P^.elem);
p := p^.next;
end;
...


(что не избавляет от необходимости проверять L на наличие в нем уже элемента со значением P^.elem)

Автор: HAMELION 23.06.2007 14:44

Все исправил, работает, большое спасибо за помощь good.gif smile.gif