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

Подскажите с паскалем. Очень срочно

Вот такая задачка
Дан однонаправленный список Е из элементов целого типа. Если в нем три подряд идущих элемента образуют строго возрастающую последовательность, то исключить средний элемент.
Помогите пожалуйста.
KO
Keep Out
155
Пусть задан список:

type
  tSpis = ^rSpis;
  rSpis = record
    N : Integer;
    Next : tSpis;
  end;

var
  First : tSpis; { ссылка на первый элемент списка }

Пусть данный список уже заполнен.
Тогда так:


var
  Cur, Tmp : tSpis;

Cur := First;
if Cur <> nil then { В списке есть хотя бы одно число }
  if Cur^.Next <> nil then { В списке есть хотя бы 2 числа }
    if Cur^.Next^.Next <> nil then { В списке как минимум 3 числа }
      repeat
        if (Cur^.N < Cur^.Next^.N) and (Cur^.Next^.N < Cur^.Next^.Next^.N) then { Текущее число < следующего < следующего за следующим }
          begin
            Tmp := Cur^.Next;
            Cur^.Next := Tmp^.Next;
            Dispose(Tmp);
          end
        else
          Cur := Cur^.Next;
      until Cur^.Next^.Next = nil; { От текущего элемента до конца списка только 2 числа }
Павел Баумер
Павел Баумер
74 235
Лучший ответ
Берете по очереди каждые 3 элемента, проверяете и если они удовлетворяют условию, то удаляете.

for( n = first; n != null; n = n->next )
{
n2 = n;
f = true;
for( i = 0; i < 2; i++ )
if (n2 == NULL) | (n2->next) { f = false; break; }
else if (n2->v > n2->next->v) { f = false; break; }
else n2 = n2->next;
if (f) delete_node( n, n->next ); // delete_node( prev, node );
n = n->next;
}
Линейно идешь по списку, сохраняя два предыдущих элемента. На каждом шаге проверяешь нужное условие, если выполняется, удаляешь.
Андрей Кричко
Андрей Кричко
1 062