Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 18_Организация памяти и структур данных.doc
Скачиваний:
72
Добавлен:
24.08.2019
Размер:
141.82 Кб
Скачать

Структура данных список. Базовые операции над списком

Структуры данных очередь и стек являются частными представлениями более сложной структуры данных списка. Списки бывают различных типов. Рассмотрим линейные однонаправленные списки и кольцевые однонаправленные списки.

Линейный однонаправленный списокэто структура данных, состоящая из последовательности однородных и связанных друг с другом элементов, в которую разрешается добавлять элементы между любыми двумя другими в любом месте списка и удалять любые элементы.

Кольцевой однонаправленный список - это линейный список, который имеет дополнительную связь между последним и первым элементов.

Базовые операции с однонаправленным линейным списком следующие:

  • построить пустой список;

  • добавить элемент в список;

  • отыскать нужный элемент в списке;

  • удалить элемент из списка;

  • вставить элемент в список.

Однонаправленный линейный список может быть представлен в виде двумерного массива. При представлении списка с помощью двумерного массива Sps элементы этого массива Sps[1,j] содержат элементы списка, а элементы массива Sps[2,j] являются указателями и определяют индекс (позицию) каждого последующего элемента в списке. Такой список может быть представлен и в виде одномерного массива, элементами которого являются предопределенные записи из двух полей, смысловое назначение которых аналогично двумерному массиву.

Рассмотрим основные базовые операции по работе с однонаправленным линейным списком, описанные с помощью процедур пользователя, на конкретной задаче.

Задача. Опишите и постройте с помощью двумерного массива Sps линейный однонаправленный список из пяти целых чисел и сделайте этот список пустым. После этого добавьте в список четыре элемента 9,8,7,6, затем найдите указатель на элемент 8 и удалите этот элемент. В конце работы со списком вставьте после элемента со значением 6 элемент со значением 5, предварительно отыскав указатель на элемент со значением 6, а элемент со значением 15 вставьте после элемента со значением 9.

Const maxel=7;

Type Spis=array[1..2,1..maxel] of integer;

Var Assm, Afe : integer; { Assm указывает индекс/адрес первого элемента в списке свободных мест}{ Afe – индекс (адрес) первого элемента в списке. }

El,i,pap,j:integer;

Sps:Spis;

Procedure Nspis(Var Sps:Spis); {процедура оформления пустого списка}

Begin

for i:=1 to maxel-1 do

Sps[2,i]:=i+1;

Sps[2,maxel]:=0;

Assm:=1;

Afe:=0;

end;

Procedure Addsp(Var Sps:Spis); {процедура добавления элемента в список}

Var Asmn:integer;

Begin

Asmn:=Sps[2,Assm];

Sps[1,Assm]:=el;

Sps[2,Assm]:=Afe;

Afe:=Assm;

Assm:=Asmn

end;

Procedure DelSp(Pap,j:integer; Var Sps:Spis); {процедура удаления элемента из списка}

Begin

Sps[2,Pap]:=Sps[2,j];

Sps[2,j]:=Assm;

Assm:=j

end;

Procedure UstSp(j:integer; Var Sps:Spis); {процедура вставки элемента в список}

Var Asmn:integer;

Begin

Asmn:=Sps[2,Assm];

Sps[2,Assm]:=Sps[2,j];

Sps[2,j]:=Assm;

Sps[1,Assm]:=El;

Assm:=Asmn;

end;

Procedure PoshSp(Var Sps:Spis; el:integer; Var Pap,j:integer); {процедура поиска указателя (адреса) на элемент списка}

Begin

j:=Afe;

Pap:=0;

While (Sps[1,j]<>el) and (j<>0) do

Begin

Pap:=j;

j:=Sps[2,j];

end;

if j=0 then Writeln('Элемент не найден')

end;

BEGIN {Основная программа}

Nspis(Sps); {построение пустого списка}

for i:=1 to 4 do

begin

write(‘el[‘,i,’]=’);

readln(el);

Addsp(Sps) {добавление элементов в список по одному}

end;

el:=8; {найденный указатель j, pap – предыдущий указатель}

PoshSp(Sps,el,pap,j); {поиск указателя на элемент со значением 8}

Delsp(pap,j,sps); {удаление элемента с указателем j}

el:=6;

PoshSp(Sps,el,pap,j); {поиск указателя на элемент со значением 6}

el:=5;

Ustsp(j,Sps); {вставка элемента со значением 5 после элемента со значением 6}

el:=9;

PoshSp(Sps,el,pap,j); {поиск указателя на элемент со значением 9}

el:=15;

Ustsp(j,Sps); {вставка элемента со значением 15 после элемента со значением 9}

END.

Распишем детально порядок выполнения основного алгоритма.

Построение пустого списка процедура Nspis: Assm:=1, Afe:=0, массив Sps:

Индекс массива

1

2

3

4

5

6

7

элементы списка

0

0

0

0

0

0

0

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

2

3

4

5

6

7

0

Добавление четырех элементов в список процедура Addsp: Assm:=5, Afe:=4, массив Sps:

Индекс массива

1

2

3

4

5

6

7

элементы списка

9

8

7

6

0

0

0

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

0

1

2

3

6

7

0

В результате построения списка из 4-х элементов строится цепочка 6→7→8→9.

Поиск указателя на элемент со значением 8 с помощью процедуры PoshSp: j:=2, Pap:=3;

Удаление элемента со значением 8 из списка с помощью процедуры Delsp: Assm:=2, Afe:=4, массив Sps:

Индекс массива

1

2

3

4

5

6

7

элементы списка

9

8

7

6

0

0

0

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

0

5

1

3

6

7

0

В результате удаления из списка элемента со значением 8 строится цепочка 6 →7→9.

Поиск указателя на элемент со значением 6 с помощью процедуры PoshSp: j:=4, Pap:=0;

Вставка элемента со значением 5 в список после элемента со значением 6 с помощью процедуры Ustsp: Assm:=5, Afe:=4, массив Sps:

Индекс массива

1

2

3

4

5

6

7

элементы списка

9

5

7

6

0

0

0

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

0

3

1

2

6

7

0

В результате вставки в список элемента со значением 5 после элемента со значением 6 получаем цепочку 6 →5→7→9.

Поиск указателя на элемент со значением 9 с помощью процедуры PoshSp: j:=1, Pap:=3;

Вставка элемента со значением 15 в список после элемента со значением 9 с помощью процедуры Ustsp: Assm:=6, Afe:=4, массив Sps:

Индекс массива

1

2

3

4

5

6

7

элементы списка

9

5

7

6

15

0

0

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

5

3

1

2

6

7

0

В результате вставки в список элемента со значением 15 после элемента со значением 9 получаем цепочку 6 →5→7→9→15.

Строить списки можно не только с использованием массива, но и выделять память для элементов списка динамически, освобождая эту память при удалении элементов, если это необходимо.