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

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

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

 
 Ответить  Открыть новую тему 
> Списки в Turbo Pascal
сообщение
Сообщение #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 -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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, и добавлять только в этом случае...

Добавь теги, программа совершенно нечитаема без них...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






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

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

 





- Текстовая версия 19.04.2024 13:54
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name