IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Списки в Turbo Pascal
HAMELION
сообщение 22.06.2007 23:27
Сообщение #1


Гость






Помогите плиз найти ошибку в программе: Условие=> Написать программу которая формирует список 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.


Сообщение отредактировано: HAMELION - 23.06.2007 0:09
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 3)
volvo
сообщение 22.06.2007 23:41
Сообщение #2


Гость






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 1:54
Сообщение #3


Гость






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

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)

Сообщение отредактировано: volvo - 23.06.2007 1:55
 К началу страницы 
+ Ответить 
HAMELION
сообщение 23.06.2007 10:44
Сообщение #4


Гость






Все исправил, работает, большое спасибо за помощь good.gif smile.gif
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 12.08.2025 10:38
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"