Лекция: Методические указания к лабораторной работе № 7

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

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

Из определения следует, что каждый элемент списка содержит поле данных (оно может иметь сложную структуру) и поле ссылки на следующий элемент. После ссылки последнего элемента должно содержать пустой указатель (nil).

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

1) получить память для него;

2) поместить туда информацию;

3) добавить элемент в конец списка (или начало).

Элемент списка состоит из разнотипных частей (хранимая информация и указатель), и его естественно представить записью. Перед описанием самой записи описывают указатель на нее:

Примеры: Создание списка

Задача. Сформировать список, содержащий целые числа 3, 5, 1, 9.

Определим запись типа TList с полями, содержащими характеристики данных – значения очередного элемента и адреса следующего за ним элемента

Создадим первый элемент:

New(Head); { выделяем место в памяти для переменной Head}

Head^.Next := nil; { указатель на след. элемент пуст (такого элемента нет)}

Head^.Data := 3; { заполняем информационное поле первого элемента}

 

Рисунок 3 – Указатель на следующий элемент

 

Продолжим формирование списка, для этого нужно добавить элемент в конец списка.

Введем вспомогательную переменную указательного типа, которая будет хранить адрес последнего элемента списка:

x := Head; {последний элемент списка совпадает с его началом}

 

 

 


Рисунок 4 – Последний элемент списка совпадает с его началом

 

New(x^.Next); { выделим области памяти для следующего (2-го) элемента и поместим его адрес в адресную часть предыдущего (1-го) элемента}

 

 


Рисунок 5 – Выделение области памяти для следующего (2-го) элемента

 

x := x^.Next; { переменная x принимает значение адреса выделенной области. Таким образом осуществляется переход к следующему (2-ому) элементу списка}

 

Рисунок 6 – Переменная x принимает значение адреса выделенной области

 

Таким образом, осуществляется переход к следующему (2-ому) элементу списка

x^.Data := 5;{ значение этого элемента} x^.Next := nil; {следующего значения нет}

 

Рисунок 7 – Значение этого элемента

 

Остальные числа заносятся аналогично:

New(x^.Next); { выделим области памяти для следующего элемента }

x := x^.Next; { переход к следующему (3-му) элементу списка }

x^.Data := 1; { значение этого элемента }

x^.Next := nil; { следующего значения нет }

New(x^.Next); { выделим области памяти для следующего элемента }

x := x^.Next; { переход к следующему (4-му) элементу списка }

x^.Data := 9; { значение этого элемента }

x^.Next := nil; {следующего значения нет }

Замечание. Как видно из примера, отличным является только создание первого (Head) элемента – головы списка. Все остальные действия полностью аналогичны и их естественно выполнять в цикле.

 

Присоединение нового элемента к голове списка производится аналогично:

New(x); { ввод значения элемента x^.Data := … }

x^.Next := Head;

Head := x;

В этом случае последний введенный элемент окажется в списке первым, а первый – последним.

еще рефераты
Еще работы по информатике