Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Дин_память_Списки_полн_Весна_2010.doc
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
432.64 Кб
Скачать

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

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

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

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;

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