Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование.doc
Скачиваний:
10
Добавлен:
22.09.2019
Размер:
812.03 Кб
Скачать

10Динамические структуры данных

3.1 Односвязные списки

Наиболее распространенными динамическими структурами являются односвязные списки.

Элемент списка в общем случае представляет собой структуру, состоящую как минимум из двух полей: одно поле типа указатель, а второе – поле данных. Поле-указатель предназначено для связи со следующим элементом списка. Доступ к элементу списка осуществляется только от его начала. Если поле-указатель является пустым указателем (NULL) – это означает конец списка.

Data

Data

Data

. . .

Data

NULL

Рисунок 3.1 – Пример представления списка

Пример объявления списка:

struct TNode;

typedef TNode* PNode;

struct TNode

{

int Data;

PNode Next;

};

PNode First = NULL;

Поле Data целого типа служит для размещения данных в элементе списка. Другое поле Next представляет собой типизированный указатель, служащий для организации списковой структуры.

Далее описан указатель First – указатель на первый узел списка (и тем самым на весь список). Последний элемент списка имеет "пустой" указатель (NULL). Первоначально, когда список пуст, указатель First устанавливается в NULL.

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

Для доступа к полям структуры через указатель на эту структуру используется специальная операция: «->», например:

First->Data = 3;

First->Next = NULL;

В языке С++ проводится принцип, согласно которому, идентификатор, перед его использованием, должен быть описан. Поэтому в вышеуказанном примере имеется так называемое предварительное описание структуры TNode, необходимое просто для «введения» в программу этого идентификатора.

Однако описание указателя еще не означает создание элемента списка.

Рассмотрим основные операции работы с элементами списками:

  1. Д обавление в начало списка.

Новый элемент имеет указатель p. Операцией new под него выделяется память. А для того, чтобы добавить его в начало списка, необходимо присвоить его информационному полю Data некоторое значение и "перекинуть" указатели, соответственно рисунку 3.2:

p->Data = Data;

p->Next = First;

First = p;

2 ) Добавление в середину списка.

Для добавления в середину списка нового элемента p необходимо иметь рабочий указатель Рred на элемент, после которого необходимо вставить p.

PNode p = new TNode; {выделение памяти под новый}

p->Data = Data; {инф.полю:=некоторое значение}

Указатели "перекидываются" соответственно рисунку 3.3:

p->Next = Pred->Next;

Pred->Next = p;