![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 26.05.2013
Сообщений: 13
|
![]()
Даны указатели 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; |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
![]()
Начнем с того, что Ваша программа работает неправильно.
Вы не перемещаете элемент из одного стека в другой, а копируете его. В результате цепочка элементов первого стека остается в памяти - Вы ее не уничтожаете. Программа продолжает занимать память первого стека, хотя он ей уже не доступен. Элемент стека содержит два поля: информационное и служебное. В информационном содержится полезная информация, а в служебном - адреса других элементов стека, чтобы объединить их в цепочку (линейный список). Чтобы решить задачу Вам нужно в процессе перемещения не создавать новый элемент стека, а у существующего элемента переопределять служебное поле так, чтобы этот элемент был включен в новый список. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Динамические структуры данных. 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 |