Помощь - Поиск - Пользователи - Календарь
Полная версия: Задачи по спискам и деревьям
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
HEKTO
Товарищи, я понимаю, что с такими глупыми вопросами лезут каждый день и достают, но, пожалуйста, спасите. До утра я должен сделать вот эти 3 задачки:

1. Дан вектор B, который состоит из указателей на целые переменные. Составить подпрограмму для вычисления первого из элементов вектора B, которые указывают на отрицательные числа(NIL если такие отсутствуют).

2. В списке переставляет в обратном порядке все элементы между первым и последним вхождением элемента X, если X входит в список не менее 2 раз.

3. Используя очередь или стек написать процедуру или функцию, которая:
Присваивает параметру Е элемент листа непустого дерева Д, который является самым левым.

ЗЫ Убедительная просьба не отсылать меня в разделы по этим темам, к сожалению я не успею в этом разобраться.
volvo
Цитата(HEKTO @ 23.06.05 23:52)
1. Дан вектор B, который состоит из указателей на целые переменные. Составить подпрограмму для вычисления первого из элементов вектора B, которые указывают на отрицательные числа(NIL если такие отсутствуют).

function first_negative(root: plist): plist;
begin
first_negative := nil;
while root <> nil do begin
if root^.data^ < 0 then begin
first_negative := root; exit
end;
root := root^.next;
end;
end;


P.S. Во второй задаче уточни, какой список - одно или двунаправленный?
HEKTO
Цитата(volvo @ 23.06.05 23:57)
P.S. Во второй задаче уточни, какой список - одно или двунаправленный?

Двунаправленный.
volvo
Тогда вот так примерно (набирал прямо здесь, так что могут быть какие-то неточности, но сама идея - такая):
procedure change_between(root: plist; x: integer);
var
p, _first, _last: plist;
_i, _between, count, T: integer;
begin
p := root;
count := 0; _between := 0; _i := 0;
_first := nil; _last := nil;
while p <> nil do begin
if p^.data^ = x then begin
if _first = nil then _first := p
else begin
_last := p; _between := _i;
end;
inc(count);
end;

if _first <> nil then inc(_i);
p := p^.next;
end;
{ проверяем, есть ли по крайней мере 2 элемента,
и не находятся ли они слишком близко: }
if (count <2) or (_between <= 2) then exit;

{ "переворачиваем" элементы между _first и _last }
for _i := 1 to _between div 2 do begin
{ продвигаемся к следующим элементам для "переворачивания" ... }
_first := _first^.next; _last := _last^.prev;
{ ... и меняем эти очередные элементы местами }
T := _first^.data^; _first^.data^ := _last^.data^; _last^.data^ := T
end;
end;
Guest
Огромнейшее спасибо.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.