Помощь - Поиск - Пользователи - Календарь
Полная версия: простая задача на очереди
Форум «Всё о Паскале» > 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, в программировании списов очень хорошо помогают картинки.
Список (очередь, как хотите называйте) изображаем как последовательность прямоугольников, можно каждый поделить на две части: данные и указатель. Из части "указатель" торчит стрелка, которая указывает на следующий элемент этого списка. Нарисовать такую штуку на бумажке очень полезно для понимания.
Вот, например, я делал такой рисунок в теме Циклический сдвиг . Начальное состояние стрелок рисуешь одним цветом, а конечное - другим. После такого наглядного представления все становится проще. Попробуйте. Если все равно будет неясно - приходите..
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.