Другие языки программирования и технологии

Помогите описать процедуру, которая подсчитывает количество элементов очереди, у которых равные "соседи".

Помогите описать процедуру, которая подсчитывает количество элементов очереди, у которых равные "соседи". Задание на тему очереди, используя указатели.
Код:
procedure neighborhood(queue : tqueue; var count : Integer);
var cur : tqueue;
begin
count := 0;
cur := queue;
while cur <> nil do
begin
if (cur^.pred = nil) and (cur^.next = nil) then
{а соседей то и нету! }
else if (cur^.pred = nil) and (cur^.next <> nil) and (cur^.data = cur^.next^.data) then
{сосед только справа}
inc(count)
else if (cur^.pred <> nil) and (cur^.next = nil) and (cur^.pred^.data = cur^.data) then
{сосед только слева}
inc(count)
else if (cur^.pred^.data = cur^.data) and (cur^.data = cur^.next^.data) then
{соседи с обеих сторон}
inc(count);
cur := cur^.next;
end;
end;
Но как и что понять не получается..
A_____________ D
A_____________ D
988
Стpах стимyлиpyeт, воoбражениe.
AK
Alexander Kopp
2 483
Лучший ответ
будем надеяться, что последний элемент очереди не ссылается в качестве следующего на первый, а то число соседей окажется огорчительно большим.

итак, есть точка входа (т. е., указатель на первый элемент очереди), передаваемая в качестве параметра в процедуру:
queue : TQueue

устанавливаем курсор на эту точку входа:
cur := queue

чтобы скакнуть на следующий элемент в этом двусвязном списке, используется конструкция:
cur := cur^.next

но сначала надо поработать с текущим указателем - понять, чтотам за байда с его соседями.

если предшественника нет,
cur^.pred = nil
и следующего нет
cur^.next = nil
то и черт с ним

если же предшественник есть
cur^.pred <> nil
то можно проверить, как там с равенством:
cur^.pred^.data = cur^.data
и если ок, то увеличить счетчик

если есть следующий элемент
cur^.next <> nil
то можно проверить, как там с равенством:
cur^.next^.data = cur^.data
и если ок, то увеличить счетчик

осталось побороть мерзкий случай, когда счетчик увеличивается и из-за соседа справа, и из-за соседа слева, то есть на 2, а не на 1
тут выручит конструкция с вложенными "если":
если сосед слева пуст, то
проверяем соседа справа
иначе
если сосед справа пуст, то
проверяем соседа слева
иначе
проверяем обоих соседей

конструкция сложноватая для усвоения, поэтому, имхо, было бы лучше завести вспомогательную переменную для инкрементирования (increment : integer), и присваивать значение сначала ей:
increment := 0;
if (cur^.next <> nil) and (cur^.data = cur^.next^.data) then increment := 1;
if (cur^.pred <> nil) and (cur^.data = cur^.pred^.data) then increment := 1;
inc(count, increment);

Похожие вопросы