Добавление нового элемента в список — КиберПедия 

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...

Добавление нового элемента в список

2017-09-27 265
Добавление нового элемента в список 0.00 из 5.00 0 оценок
Заказать работу

Пусть имеется связный список из трех чисел : 5, -3, -12.

Добавим в описание переменных переменную ссылочного типа r:

Var head, q, r: TPoint;

Список сформирован, и значениями переменных head и q является ссылка на первый элемент списка:

 

 

Необходимо после элемента - 3вставить элемент с информационной частью, равной 17.

Для включения нового элемента в готовый список выполняются следующие действия:

 

1. создается новый элемент и заполняется его информационное поле:

New(r);

r^.Inf:= 17;

2. в списке находится элемент, после которого должен стоять новый, в данном случае элемент -3; для этого используем переменную q:

While (q <> Nil) Do пока не дошли до конца списка

If (q^.Inf = -3) если нашли нужный элемент,

Then Break то выходим из цикла поиска,

Else q:= q^.Next; иначе делаем шаг по списку

сейчас ссылка q указывает на элемент -3, то есть q^.Inf = -3, а поле q^.Next содержит адрес элемента -12:

 

3. в ссылочное поле нового элемента r^.Next помещается адрес, стоящий в ссылочном поле найденного элемента (адрес следующего за ним элемента, в данном случае элемента -12, этот адрес хранится в q^.Next):

r^.Next:= q^.Next;

 

сейчас оба элемента (17 и -3) будут соединены с элементом -12,

4. в ссылочное поле найденного элемента -3 q^.Next помещается адрес нового элемента 17, который хранится на ссылке r:

q^.Next:= r;

 

 

Пример: сформировать список из элементов 5, -3, 17, -12 и вывести его на экран. Добавлять с клавиатуры новые элементы после заданных (конец ввода – число 0), каждый раз выводя новый список на экран.

Интерфейс:

Создание списка

Первое число: -12

Следующее число: 17

Следующее число: -3

Следующее число: 5

Следующее число: 0

Введено чисел: 4

Введенные числа:

5 -3 17 -12

Вставка элементов в список

Новый элемент: -2

После какого: -3

Новый список:

5 -3 -2 17 -12

Новый элемент: 15

После какого: -12

Новый список:

5 -3 -2 17 -12 15

Новый элемент: 9

После какого: 5

Новый список:

5 9 -3 -2 17 -12 15

Новый элемент: 20

После какого: 10

Такого элемента в списке нет

Список:

5 9 -3 -2 17 -12 15

Новый элемент: 0

Список:

5 9 -3 -2 17 -12 15

Программа:

Program Spisok;

Uses CRT;

Type TPoint = ^TElement;

TElement = Record

Inf: Integer;

Next: TPoint;

End;

Var head, q, r: TPoint;

posle: Integer;

flag: 0..1; флаг поиска (0 – элемент не найден)

Procedure Formir_spisok;

Begin

New(head); head - указатель на голову списка

head^.Inf:= 0; количество элементов в списке

head^.Next:= Nil; списка еще нет

New(q); формируем первый элемент

Write(‘Первое число: ’);

ReadLn(q^.Inf); вводим его информационную часть

If (q^.Inf=0) если ввели 0,

Then Exit; то выходим из процедуры

head^.Inf:= 1; в списке один элемент

q^.Next:= head^.Next; помещаем его в голову списка

head^.Next:= q; в head^.Next адрес головы списка

Repeat

New(q); формируем очередной элемент

Write(‘Очередное число: ’);

ReadLn(q^.Inf); вводим его информационную часть

If (q^.Inf=0) если ввели 0,

Then Break; то выходим из цикла ввода

head^.Inf:= head^.Inf + 1; увеличиваем счетчик элементов на 1

q^.Next:= head^.Next; вставляем элемент в голову списка

head^.Next:= q; в head^.Next адрес головы списка

Until (q^.Inf = 0);

End;

Procedure Vyvod_spisok; процедура вывода списка

Begin

q:= head^.Next; текущую ссылку – на первый элемент

While (q <> Nil) Do пока не конец списка

Begin

Write(q^.Inf:5); выводим очередной элемент

q:= q^.Next; ссылку – на следующий элемент

End;

WriteLn;

End;

Begin головная программа

ClrScr;

WriteLn(‘Создание списка’);

WriteLn;

Formir_spisok; обращение к процедуре создания списка

WriteLn(‘Введено чисел: ’, head^.Inf);

WriteLn(‘Введенные числа:’);

Vyvod_spisok; обращение к процедуре вывода списка

WriteLn;

WriteLn(‘Вставка элементов в список’);

WriteLn;

Repeat

New(r);

WriteLn;

Write(‘Новый элемент: ’);

ReadLn(r^.Inf); информационная часть нового элемента

If (r^.Inf = 0) если она равна нулю,

Then Break; то выходим из цикла ввода

Write(‘После какого: ’);

ReadLn(posle);

flag:= 0; флаг поиска равен нулю – элемент пока не найден

q:= head^.Next; поисковый указатель q – в голову списка

While (q <> Nil) Do пока не конец списка

If (q^.Inf = posle) ищем нужный элемент

Then

Begin

flag:= 1; если элемент найден:

Break; выходим из цикла поиска

End

Else q:= q^.Next; иначе делаем шаг по списку

If (flag = 0) Then если элемент не найден:

Begin

WriteLn(‘Такого элемента в списке нет’);

WriteLn(‘Список:’);

Vyvod_spisok; выводим список

Continue; и продолжаем цикл ввода

End;

r^.Next:= q^.Next; если элемент найден,

q^.Next:= r; то вставляем его в список

head^.Inf:= head^.Inf + 1; увеличиваем счетчик элементов на единицу

WriteLn;

WriteLn(‘Новый список:’);

Vyvod_spisok; выводим новый список

Until (r^.Inf = 0); окончание цикла ввода

WriteLn(‘Список:’);

Vyvod_spisok; выводим окончательный список

ReadLn;

End.

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

Пусть имеется связный список из трех чисел : 5, -3, -12.

Список сформирован, и значениями переменных head и q является ссылка на первый элемент списка:

 

Необходимо удалить из списка элемент - 3.

Для удаления (исключения) существующего элемента из списка выполняются следующие действия:

1. указатели q (поисковый) и r (отстает от поискового на шаг) ставим в голову списка:

q:= head^.Next; на первый элемент списка

r:= head; на указатель на голову списка

2. в списке отыскивается удаляемый элемент, для этого используем поисковый указатель q:

While (q <> Nil) Do пока не дошли до конца списка

If (q^.Inf = -3) если нашли нужный элемент,

Then Break то выходим из цикла поиска,

Else

Begin

r:= q; иначеподтягиваем r к q

q:= q^.Next; и делаем шаг по списку указателем q

End;

сейчас ссылка q указывает на элемент -3, то есть q^.Inf = -3, а поле q^.Next содержит адрес элемента -12. Ссылка r указывает на предыдущий элемент списка, то есть на 5, а в r^.Next содержится адрес удаляемого элемента - r^.Next = q:

3. в ссылочное поле r^.Next помещается адрес, хранящийся в q^.Next, то есть адрес элемента -12:

r^.Next:= q^.Next;

Сейчас оба элемента (5 и -3) будут соединены с элементом -12,

 

а связь между элементами 5 и -3 разрывается.

4. освобождаем память от удаленного элемента -3 и возвращаем указатели q и r в голову списка:

Dispose(q); удаляем из памяти элемент -3

q:= head^.Next; на первый элемент списка

r:= head; на указатель на голову списка

 

Пример: сформировать список из элементов 5, -3, 17, -12 и вывести его на экран. Удалить из списка несколько элементов (конец удаления – число 0), каждый раз выводя новый список на экран.

Интерфейс:

Создание списка

Первое число: -12

Следующее число: 17

Следующее число: -3

Следующее число: 5

Следующее число: 0

Введено чисел: 4

Введенные числа:

5 -3 17 -12


Поделиться с друзьями:

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.056 с.