Помогите описать процедуру, которая подсчитывает количество элементов очереди, у которых равные "соседи". Задание на тему очереди, используя указатели.
Код:
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;
Но как и что понять не получается..
Другие языки программирования и технологии
Помогите описать процедуру, которая подсчитывает количество элементов очереди, у которых равные "соседи".
Стpах стимyлиpyeт, воoбражениe.
будем надеяться, что последний элемент очереди не ссылается в качестве следующего на первый, а то число соседей окажется огорчительно большим.
итак, есть точка входа (т. е., указатель на первый элемент очереди), передаваемая в качестве параметра в процедуру:
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);
итак, есть точка входа (т. е., указатель на первый элемент очереди), передаваемая в качестве параметра в процедуру:
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);
Похожие вопросы
- Напишите программу, которая находит в массиве количество элементов, равных заданному значению X .
- Помогите найти алгоритм подбора множителей к числам заданного массива, сумма произведений которых равна заданному числу
- Ввести 10 элементов в массив с клавиатуры, и определите количество элементов, которые кратный 5.
- С++. Элементы массива задаются с клавиатуры. Подсчитать количество элементов массива, являющихся трехзначным числом.
- помогите написать программку которая определяет среднее арифметическое непарных элементов массива.
- Как объявить массив в с++, если не известно количество элементов?
- С++ Как узнать количество элементов в массиве от 5 до 1?
- Помогите с С++. Надо найти произведение элементов одномерного массива между первым и последним 0.
- При составлении блок схемы, есть ли какие-то ограничения на количество элементов блок схемы?
- как в Паскале лучше объявить массив, если количество элементов заранее неизвестно? пожалуйста, очень срочно надо!!