Помощь - Поиск - Пользователи - Календарь
Полная версия: Односвязные Списки
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Аристократ
Здравствуйте, программисты. У меня задание.
Произвести слияние двух заданных упорядоченных по возрастанию списков в один неубывающий список.
Посмотрите, пожалуйста на мой программный код. Правильно ли я понимаю путь реализации соединения двух списков. Что-то я запутался. И еще как правильно вывести результирующую очередь???
Вот код.


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
В поиске был? Скорее всего - нет, потому что:
Объединение 2 упорядоченных списков

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

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

Ну, а по поводу
Цитата
совпадающие элементы включать единожды
- проще будет вкюлчать, сколько есть, а потом проходить по результирующему списку и все дубликаты убирать...
Аристократ
Спасибо Volvo, я разобрался с ней.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.