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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2013, 22:54   #1
Alex Joy
Пользователь
 
Регистрация: 26.05.2013
Сообщений: 13
По умолчанию Динамические структуры данных. Pascal

Даны указатели P1 и P2 на вершины двух непустых стеков. Перемещать элементы из первого стека во второй, пока значение вершины
первого стека не станет четным (перемещенные элементы первого стека
Динамические структуры данных 113 будут располагаться во втором стеке в порядке, обратном исходному). Если в первом стеке нет элементов с четными значениями, то переместить
из первого стека во второй все элементы. Вывести адреса новых вершин
первого и второго стека (если первый стек окажется пустым, то вывести
для него константу NIL). ОПЕРАЦИИ ВЫДЕЛЕНИЯ И ОСВОБОЖДЕНИЯ ПАМЯТИ НЕ ИСПОЛЬЗОВАТЬ.

Помогите пожалуйста. Потому именно эту операцию использую, а по-другому не знаю как.


program L19;

{$APPTYPE CONSOLE}

uses
SysUtils,
windows;

type TPStack=^TStack;
TStack=record
data:integer;
next:TPStack;
end;
var p1,p2:TPStack;
el:integer;
ch:char;

function StackIsEmpty(var s:TPStack):boolean;
begin
StackIsEmpty:=(s=nil);
end;

procedure Push(var s:TPStack; var elem:integer);
var tmp:TPStack;
begin
New(tmp);
tmp^.data:=elem;
tmp^.next:=s;
s:=tmp;
end;


begin
SetconsoleCP(1251);
SetconsoleoutputCP(1251);
writeln('Perviy stek pustoy = ',StackIsEmpty(p1));
writeln('Vtoroy stek pustoy = ',StackIsEmpty(p2));
repeat
write('Vvedi element steka = ');
readln(el);
Push(p1,el);
write('Prodolzhit vvod?(y/n) ');
readln(ch);
until ch='n';
while p1^.data mod 2<>0 do begin
Push(p2,p1^.data);
p1:=p1^.next;
end;
while p2<>nil do begin
write(p2^.data,' ');
p2:=p2^.next;
end;
writeln;
writeln('Vershina pervogo steka = ',integer(addr(p1)));
writeln('Vershina vtorogo steka = ',integer(addr(p2)));
if p1=nil then writeln('Perviy stek pustoy = nil');
writeln('Vtoroy stek pustoy = ',StackIsEmpty(p2));
readln;
end.


Именно здесь нужна процедура moove. Как быть?

procedure Push(var s:TPStack; var elem:integer);
var tmp:TPStack;
begin
New(tmp);
tmp^.data:=elem;
tmp^.next:=s;
s:=tmp;
end;
Alex Joy вне форума Ответить с цитированием
Старый 29.05.2013, 07:59   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Начнем с того, что Ваша программа работает неправильно.
Вы не перемещаете элемент из одного стека в другой, а копируете его. В результате цепочка элементов первого стека остается в памяти - Вы ее не уничтожаете. Программа продолжает занимать память первого стека, хотя он ей уже не доступен.

Элемент стека содержит два поля: информационное и служебное. В информационном содержится полезная информация, а в служебном - адреса других элементов стека, чтобы объединить их в цепочку (линейный список).

Чтобы решить задачу Вам нужно в процессе перемещения не создавать новый элемент стека, а у существующего элемента переопределять служебное поле так, чтобы этот элемент был включен в новый список.
s-andriano вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамические структуры данных. Pascal Alex Joy Помощь студентам 1 27.05.2013 08:30
Динамические структуры данных. Pascal Alex Joy Помощь студентам 0 26.05.2013 20:57
Динамические структуры данных в Pascal m3tamf Помощь студентам 1 26.11.2012 15:05
динамические структуры данных pascal [VENOM] Помощь студентам 0 25.05.2011 20:31