Помощь - Поиск - Пользователи - Календарь
Полная версия: простая задача на очереди
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
AlexSt
Даны две непустые очереди; адреса начала и конца первой равны Р1 и Р2, а второй Р3 и Р4. Очереди содержат одинаковое количество элементов. Объединить очереди в одну, в которой элементы исходных очередей чередуются(начиная с первого элемента первой очереди). Вывести указатели Р5 и Р6 на начало и конец полученной очереди. Операции выделения и освобождения памяти не использовать.
Lapp
Покажи, что у тебя получилось. Поправим.
-Alex-
А! вот так:
program ochered_n15;
type    och=^elem;
        elem=record
        data:char;
        next:och
        end;
var p1,p2,p3,p4,p5,p6:och;
    im,i1,i2:char;
    j,k:integer;
procedure v(b,e:och;i:char);
      var x:och;
      begin x^.data:=i;
            x^.next:=nil;
            if b=nil then b:=x
                     else e^.next:=x;
            e:=x
      end;
procedure iz(b,e:och;i:char);
      var x:och;
      begin if b<>nil then
            begin i:=b^.data;
                  x:=b;
                  b:=b^.next;
                  dispose(x)
            end;
      end;
begin j:=-1; k:=0;
      repeat readln(i1);
             v(p1,p2,i1);
             j:=j+1;
      until i1='?';
      iz(p1,p2,i1);
      repeat readln(i2);
             v(p3,p4,i2);
             k:=k+1;
      until j=k;
      repeat

             iz(p1,p2,im);
             v(p5,p6,im);
              writeln(im);
             iz(p3,p4,im);
             v(p5,p6,im);
              writeln(im);
             k:=k+1;
      until p1=nil;
end.


М
При публикации программного текста, пожалуйста, используй теги: выделить текст блоком и выбрать нужный тип кода в меню CODE над окном ввода.
Лопарь

Lapp
Ну что ж, давай разбираться..
Что должна делать процедура V? Вставлять новый элемент в очередь?
Я попробую показать, что она делает
procedure v(b,e:och;i:char);
var
  x:och;
begin
  x^.data:=i;
  x^.next:=nil;
  if b=nil then b:=x else e^.next:=x;
  e:=x
end;

Ты заводишь локальную переменную х - ссылку, и начинаешь работать с ней, даже не взяв под нее память. Это делать недопустимо - это раз. Два - то, что сама переменная х тебе не нужна. Если тебе передается в процедуру конец списка (списки ты называешь очередями), то с ним и работай.
Еще одна ошибка: для того, чтоб вывести параметры из процедуры, их надо описывать как var...
С процедурой Iz я вообще ничего не понял.
Короче, вот рабочий код - попробуй в нем разобраться. Я пытался писать как можно ближе к твоей программе. Если что неясно - спрашивай..
program ochered_n15;
type
  och=^elem;
  elem=record
    data:char;
    next:och
  end;
var
  p1,p2,p3,p4,p5,p6,q1,q2,t1,t2:och;
  im,i:char;
  j,k:integer;

procedure v(var p:och; i:char);
begin
  New(p);
  p^.data:=i;
  p^.next:=nil;
end;

procedure Show(p:och);
begin
  while p<>nil do begin
    Write(p^.data,' ');
    p:=p^.next
  end;
  WriteLn
end;

begin
  j:=1;
  WriteLn('Введите первый список, "?" в конце:');
  ReadLn(i);
  V(p1,i);
  p2:=p1;
  repeat
    readln(i);
    v(p2^.next,i);
    p2:=p2^.next;
    j:=j+1;
  until i='?';
  k:=1;
  WriteLn('Введите второй список, ',j,' элементов:');
  ReadLn(i);
  V(p3,i);
  p4:=p3;
  for k:=2 to j do begin
    readln(i);
    v(p4^.next,i);
    p4:=p4^.next;
  end;
  WriteLn('Первый список:');
  Show(p1);
  WriteLn('Второй список:');
  Show(p3);
  p5:=p1;
  p6:=p4;
  q1:=p1;
  q2:=p3;
  while q1<>nil do begin
    t1:=q1^.next;
    t2:=q2^.next;
    q1^.next:=q2;
    q2^.next:=t1;
    q1:=t1;
    q2:=t2
  end;
  WriteLn('Результирующий список:');
  Show(p5);
  WriteLn('Начало: ',Seg(p5),':',Ofs(p5));
  WriteLn('Конец:  ',Seg(p6),':',Ofs(p6));
  ReadLn;
end.

Ilius
Смотрите у меня почти такая же задача только элементы каждой из очередей упорядочены по возрастанию (в направлении от начала очереди к концу), Объеденить очереди в одну с сохранением упорядочености элементов а в остальном такое же. Как мне зделать эту упорядоченность?
Lapp
Цитата(Ilius @ 17.05.2007 23:33) *

Смотрите у меня почти такая же задача только элементы каждой из очередей упорядочены по возрастанию (в направлении от начала очереди к концу), Объеденить очереди в одну с сохранением упорядочености элементов а в остальном такое же. Как мне зделать эту упорядоченность?

Идешь по первому списку, сравнивая его элементы с первым элементом второго. Как только получил инверсию - переключаешь указатели (хвост первого делаешь вторым, а второй ставишь на место хвоста первого).
AlexSt
ОГРОМНОЕ спасибо! только я не понял что выполняют пеерменные q1, q2, t1 & t2. Ещё нужно избавиться от '?' в конце первой очереди(соответственно элементов во второй на 1 меньше)
Ilius
Что то я не понимаю что и куда мне надо вставить чтобы элементы каждой из очередей были упорядочены по возрастанию и объеденить очереди в одну с сохранением упорядочености. blink.gif
Lapp
AlexSt, а также Ilius, в программировании списов очень хорошо помогают картинки.
Список (очередь, как хотите называйте) изображаем как последовательность прямоугольников, можно каждый поделить на две части: данные и указатель. Из части "указатель" торчит стрелка, которая указывает на следующий элемент этого списка. Нарисовать такую штуку на бумажке очень полезно для понимания.
Вот, например, я делал такой рисунок в теме Циклический сдвиг . Начальное состояние стрелок рисуешь одним цветом, а конечное - другим. После такого наглядного представления все становится проще. Попробуйте. Если все равно будет неясно - приходите..
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.