Форум «Всё о Паскале» _ Задачи _ Списки в 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)