Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

Удаление элемента из начала списка



 

ПРИМЕЧАНИЕ: перед выполнением операции удаления элемента или списка желательно запрашивать у пользователя подтверждение удаления.


 


 

Procedure Del_beg_list ( Var First : el);

Var

p : el;

answer : string;

Begin

If First <> Nil

then Begin { список не пуст }

writeln ('Вы хотите удалить первый элемент?(д/н) ');

readln ( answer );

if answer = 'д ' { многообразие ответов y, Y, д }

Then begin

p:=First;

If p^.Next = Nil

Then Begin

{в списке один элемент }

Dispose (p);

{уничтожение элемента}

First:=Nil;

{список стал пустым }

End

Else Begin

P := first;

{адрес удаляемого элемента }

First:=first^.Next;

{адрес нового первого элемента}

Dispose (p);

{удаление бывшего первого

элемента }

End;

End

End

Else writeln (' список пуст, удаление первого элемента невозможно');

End;


Удаление элемента из конца списка.

 

{ Нужен запрос и подтверждение удаления }

Кроме того, стоит извещать пользователя о том, что происходит

Procedure Del_end_list( Var First :el);

Begin

If First < > Nil

then Begin {список не пуст}

if fiRst^.next = nil

Then begin

{в списке - единственный элемент }

p := first;

dispose (p);

First := nil;

End

Else begin

{в списке больше одного элемента }

Q := First;

T := First;

{цикл поиска адреса

последнего элемента}

While q^.Next < > Nil do

Begin

T := q;

{запоминание адреса текущего элемента}

q:=q^.Next;

{переход к следующему элементу}

end;

{после окончания цикла

Т - адрес предпоследнего,

а Q - адрес последнего элемента списка}

dispose (q); {удаление последнего элемента}

t^.next := nil;

{предпоследний элемент стал последним}

End

End

else writeln ('список пуст, удаление элемента невозможно ');

end;

Можно перед удалением предъявить пользователю содержание удаляемого элемента и запросить подтверждение удаления («…действительно ли вы хотите удалить…»). Это будет полезно и в процессе работы программы, и особенно при отладке.

 

ПРИМЕЧАНИЕ.Если этого требует алгоритм обработки данных, то после исключения элемента из спискаэтот элемент может не удаляться из памяти, а может быть передан на какую-либо обработку через список параметров.

Удаление элемента из середины списка (в данном случае i-ого элемента).

 

Procedure Del_I_elem ( var first : el; i : integer);

Var

t, q, r : el;

K ,n : integer;

Begin

n := count_el(first); {определение числа элементов списка}

if (i < 1 ) or ( i > n )

Then begin

writeln ('i задано некорректно');

exit;

End

Else begin

{нужно добавить подтверждение удаления }

if i = 1

then begin {удаляется 1 элемент}

t := first;

first:= first^.next;

dispose ( t);

{ имеет ли значение

Порядок выполнения операторов ?

( de jure и de facto) }

End

else if i = n

Then begin

{ см. случай удаления

последнего элемента}

. . .

End

else begin{удаление из «середины» списка}

t := first;

q := nil;

k := 1;

while ( k < i ) do

Begin

{поиск адресов (i-1)-го и

i-го элементов}

k := k + 1;

q := t;

t := t^.next;

end;

r := t^.next;

{ найдены адреса

I-го (T), (i-1)-го (Q) и

(i+1)-го (R) элементов }

q^.next := r;

dispose ( t );

{ удален i-ый элемент }

end;

end;

end;

В данном случае можно рекомендовать применение соответствующих процедур – «удаление из начала списка», «удаление из конца списка», «удаление из середины списка».

Удаление всего списка с освобождением памяти.

 

Procedure Delete_List ( Var First : el);

Var

P, q : el;

Answer : string;

Begin

If First <> Nil

Then Begin { список не пуст }

writeln ( ' Вы хотите удалить весь список ? (Y/N)' );

readln ( answer );

if answer = 'Y'

Then begin

q:=First;

p:=nil;

While ( q <> nil ) do

Begin

p:=q;

q:=q^.Next;

Dispose ( p ) ;

End;

First:=Nil;

{именно этот оператор и

обеспечивает уничтожение списка}

End;

End

Else writeln ('список пуст ');

End;

Можно ли вместо всех указанных действий выполнить только одно – first := nil; ?

 




©2015 studenchik.ru Все права принадлежат авторам размещенных материалов.