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

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

Форум «Всё о Паскале» _ Задачи _ Односвязные Списки

Автор: Аристократ 11.06.2007 16:16

Здравствуйте, программисты. У меня задание.
Произвести слияние двух заданных упорядоченных по возрастанию списков в один неубывающий список.
Посмотрите, пожалуйста на мой программный код. Правильно ли я понимаю путь реализации соединения двух списков. Что-то я запутался. И еще как правильно вывести результирующую очередь???
Вот код.


type TypeOfElem = Integer;
Sllptr=^Zveno;
Zveno= record
Elem: TypeOfElem;
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; head2:=nil;
end; end;
Var k,i :integer;
aElem: SllPtr; aElem1: SllPtr;
Begin
write('vvedite chislo elementov spiska 1 ');
readln(k);
for i:=1 to k do
begin
write('vvedite spisok 1 ');
new(aElem);
readln(aElem^.elem);
aElem^.Next:=nil;
end;

write('vvedite chislo elementov spiska 2 ');
readln(k);
for i:=1 to k do
begin
write('vvedite spisok 2 ');
new(aElem1);
readln(aElem1^.elem);
aElem1^.Next:=nil;
end;
Unite (aelem,aelem1);
readln;
end.


Автор: volvo 11.06.2007 16:41

В поиске был? Скорее всего - нет, потому что:
http://forum.pascal.net.ru/index.php?s=&showtopic=16831&view=findpost&p=98554

Цитата
И еще как правильно вывести результирующую очередь?
Очередь <> Список

Автор: Аристократ 11.06.2007 19:38

А можно как-то исправить предыдущую задачу для решения этой?.

Пополнить упорядоченный по возрастанию список A элементами неупорядоченного списка B, сохранив упорядоченность (совпадающие элементы включать единожды).


program stack;
const n=4;
type spisok=^tpr;
tpr=record
inf:integer;
link:spisok;
end;
{----------Dopolnitelnie peremennie--------}
var BEGQA,BEGQB,ENDQA,ENDQB,p,p1,p2,T :spisok; first: boolean; i,k,max:byte;
begin
{-----------C03DAHUE CnUCK0B---------}
begqa:=nil; begqb:=nil;
new(p);
writeln ('vvod 1 elementa spiska a'); readln(p^.inf); p^.link:=nil;
Begqa:=p; endqa:=p;
for i:=1 to n do
begin
new(p); writeln('vvedite element spiska a'); readln(p^.inf); p^.link:=nil;
endqa^.link:=p; endqa:=p;
end;
new(p);
writeln ('vvod 1 elementa spiska b'); readln(p^.inf); p^.link:=nil;
Begqb:=p; endqb:=p;
for i:=1 to n do
begin
new(p); writeln('vvedite element spiska b'); readln(p^.inf); p^.link:=nil;
endqb^.link:=p; endqb:=p
end;
{Proverjaju v kakom spiske startovij element bolshij. Etot spisok PERVIJ}
if begqa^.inf > begqb^.inf then begin
p1 := begqa; p2 := begqb; max:=begqa^.inf;
first := true;
end
else begin
p1 := begqb; p2 := begqa; max:=begqb^.inf;
first := false;
end;

{-------- Dalshe - sam algoritm -------- }
while (p1 <> nil) and (p2 <> nil) do begin

while (p1^.link <> nil) and (p1^.link^.inf > p2^.inf) do p1 := p1^.link;
if p1^.link <> nil then begin

T := p2^.link;

p2^.link := p1^.link;
p1^.link := p2;

p2 := T;
end;
T := p1;
p1 := p1^.link;

end;

{ Ne zabivaem prilepit k koncu 1 spiska ostatok 2, esli on est' }
T^.link := p2;

{ nu, i raspe4ataem sootvetstvenno tot spisok, kotorij 1 (sm. vishe) }
if first then p := begqa
else p := begqb;
while p<>nil do begin
write(' ',p^.inf); p:=p^.link;
end;
writeln;
readln;
end.


Автор: volvo 11.06.2007 22:20

Аристократ, во-первых, у тебя в задании списки отсортированы по возрастанию, а там куда ведет моя ссылка - по убыванию... Как следствие, твоя программа, приведенная постом выше, вообще не будет работать, пока ты не поменяешь 2 знака ">" на "<" ...

Ну, а по поводу

Цитата
совпадающие элементы включать единожды
- проще будет вкюлчать, сколько есть, а потом проходить по результирующему списку и все дубликаты убирать...

Автор: Аристократ 13.06.2007 11:31

Спасибо Volvo, я разобрался с ней.