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

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

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

 
 Ответить  Открыть новую тему 
> Односвязные Списки
Аристократ
сообщение 11.06.2007 12:16
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


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


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.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 11.06.2007 12:41
Сообщение #2


Гость






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

Цитата
И еще как правильно вывести результирующую очередь?
Очередь <> Список
 К началу страницы 
+ Ответить 
Аристократ
сообщение 11.06.2007 15:38
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


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

Пополнить упорядоченный по возрастанию список 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.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 11.06.2007 18:20
Сообщение #4


Гость






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

Ну, а по поводу
Цитата
совпадающие элементы включать единожды
- проще будет вкюлчать, сколько есть, а потом проходить по результирующему списку и все дубликаты убирать...
 К началу страницы 
+ Ответить 
Аристократ
сообщение 13.06.2007 7:31
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской
Реальное имя: Сергей

Репутация: -  0  +


Спасибо Volvo, я разобрался с ней.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 

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