Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2008, 23:23   #11
Никита35
Пользователь
 
Регистрация: 24.04.2008
Сообщений: 24
По умолчанию

Спасибо огромное!!!
Можете хотя бы на словах пояснить,как слить списки(конкретнее,нужно из второго списка вставить элементы в первый)
Никита35 вне форума Ответить с цитированием
Старый 09.05.2008, 08:16   #12
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Вот два списка и два временных указателя, которые указывают на первые элементы списков p1, p2. Для слияния делаем новую голову head. Берем минимальный из элементов p1, p2.

head1->n1->n2->n3....
_______p1

head
__q

_______p2
head2->n1->n2->n3....

Например, p1 - минимальный. Запоминаем его в p

p := p1;
указатель сразу смещаем - p1 := p1.next
а p добавляем в head.
q.next = p;
q = q.next.

n2->n3....
p1

head->n1
______q

_______p2
head2->n1->n2->n3....

как только один из списков кончился. Просто присоедием остаток второго к q.

Это без учетов ссылок назад. Их можно будет или делать сразу или пройти по списку еще раз и восстановить. После слияния возвращаем head - указатель на общий список.

Последний раз редактировалось alexBlack; 09.05.2008 в 08:18.
alexBlack вне форума Ответить с цитированием
Старый 09.05.2008, 08:36   #13
Никита35
Пользователь
 
Регистрация: 24.04.2008
Сообщений: 24
По умолчанию

(((НЕ ПОНЯТНО...
Никита35 вне форума Ответить с цитированием
Старый 09.05.2008, 10:04   #14
Никита35
Пользователь
 
Регистрация: 24.04.2008
Сообщений: 24
По умолчанию

Здравствуйте! Вот, что у меня получилось после попыток слияния:
{Процедура слияния списков}

procedure Sliyan(head1:Plist);
var
q,p,head2:Plist;
begin
q:=head1;
p:=head2;
while q<>nil do
q:=q^.next;
while p<>nil do
begin
q^.next:=p;
p:=p^.next;
end;
end;
тут я пытался второй список включить в первый...но программа эту процедуру как будто игнорирует...
Никита35 вне форума Ответить с цитированием
Старый 09.05.2008, 13:03   #15
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Ну, хоть попытки были и то радует.

Код:
// Оба списка помещаются в head1
procedure Sliyan(head1, head2:Plist);
var q,p,p1,p2:Plist;
begin
   q := head1;
   p1 := head1^.next;
   p2 := head2^.next;
   while (p1 <> nil) and (p2 <> nil) do begin
      // Берем минимальный из элементов p1, p2
      if p1^.a <= p2^.a then begin
         p := p1;
         p1 := p1^.next;
      end else begin
         p := p2;
         p2 := p2^.next;
      end;
      // Минимальный элемент присоединяем к голове
      q^.next := p;
      p^.pred := q;
      p^.next := nil;
      q := p;
   end;
   // Если остались еще элементы, добавляем и их
   if p1 <> nil then begin
      q^.next := p1;
      p1^.pred := q;
   end else
   if p2 <> nil then begin
      q^.next := p2;
      p2^.pred := q;
   end
end;

{Начало программы}
begin
   randomize;
   MakeList(head1);
   MakeList(head2);
   writeln('------------------');
   PrintList(head1);
   PrintList(head2);
   writeln('------------------');
   Sort(head1);
   Sort(head2);
   writeln('------------------');
   PrintList(head1);
   PrintList(head2);
   writeln('------------------');
   Sliyan(head1,head2);
   PrintList(head1);
   writeln('------------------');
   readln;
alexBlack вне форума Ответить с цитированием
Старый 09.05.2008, 15:11   #16
Никита35
Пользователь
 
Регистрация: 24.04.2008
Сообщений: 24
По умолчанию

Спасибо огромное за помощь!
Вопрос:если я пошлю вам задачу на паскале,вы сможете её переделать на С++? А то я его не изучал,а писать нужно...
Никита35 вне форума Ответить с цитированием
Старый 09.05.2008, 16:41   #17
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Никита35 Посмотреть сообщение
Спасибо огромное за помощь!
Вопрос:если я пошлю вам задачу на паскале,вы сможете её переделать на С++? А то я его не изучал,а писать нужно...
Сможете или нет это не тот вопрос. Думаю, ответ Вы знаете.

А вот ВАМ НУЖНО изучать C++. А если у Вас нет желания, на форуме есть соответствующий раздел - за разумную цену - что угодно.
alexBlack вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Срочно,пожалуйста...паскаль динамич. списки Никита35 Помощь студентам 2 07.05.2008 22:48
Списки. Паскаль Demyrg Помощь студентам 2 10.04.2008 08:20
Паскаль. Динамич массивы ProPaL Помощь студентам 6 25.03.2008 09:43
Помогите, кто чем может. (Паскаль) KORT Помощь студентам 8 03.11.2007 13:26
Паскаль. Списки Freem Паскаль, Turbo Pascal, PascalABC.NET 2 11.05.2007 14:22