Вот такая задачка
Дан однонаправленный список Е из элементов целого типа. Если в нем три подряд идущих элемента образуют строго возрастающую последовательность, то исключить средний элемент.
Помогите пожалуйста.
Другие языки программирования и технологии
Подскажите с паскалем. Очень срочно
Пусть задан список:
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 числа }
…
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 числа }
…
Берете по очереди каждые 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;
}
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;
}
Линейно идешь по списку, сохраняя два предыдущих элемента. На каждом шаге проверяешь нужное условие, если выполняется, удаляешь.
Похожие вопросы
- Народ! Помогите решить задачи на языке паскаль. Очень срочно надо! Буду рада решению хотя бы одной из списка=)
- Задача на МАССИВЫ Паскаль ОЧЕНЬ СРОЧНО!!!!
- Помогите пожалуйста, с составлением программы в паскале, очень срочно! Только пожалуйста, вставьте данные, которые ниже
- Нужно написать программы в Паскале! Массивы! Срочно! Помогите!
- Ааааа....помогите с Паскалем (Pascal)!!!!Срочно!!!!
- очень срочно нужна помощь по паскалю сижу на экзамене. дома буду обязательно отблагодарю и скину деньги если что
- очень срочно....маленький вопрос по паскалю
- как в Паскале лучше объявить массив, если количество элементов заранее неизвестно? пожалуйста, очень срочно надо!!
- Задача в паскале. помогите пожалуйста... очень срочно нужно!
- ПОМОГИТЕ ОЧЕНЬ СРОЧНО!! ИНФОРМАТИКА!!!ПАСКАЛЬ