Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование4172 / Лекции / Лекция 15. Создание списков.doc
Скачиваний:
49
Добавлен:
12.03.2015
Размер:
124.42 Кб
Скачать

Использование ссылочных данных

Для примера предположим, что значением элемента списка является идентификатор длиной до 8 символов (рис. 15.2).

Организацию таких списков обеспечивают, например, описания на языке C из примера 15.1.

Пример 15.1. Описание данных для списков с использованием ссылочных данных.

struct el_sp /* Тип элемента списка */

{ char id[8]; /* Значение элемента (идентификатор) */

struct el_sp *uk; /* Указатель следующего элемента */

};

struct el_sp *p; /* Указатель списка */

struct el_sp *i, *j; /* Указатели элементов списка */

char nov_id; /* Новый идентификатор */

Вместо el_sp, id, uk, p и т. д. можно использовать и другие имена.

Эти описания позволяют использовать в программе обозначения, показанные в таблице 15.1.

Таблица 15.1.

Пример обозначений для списков

Обозначения

Обозначаемые величины

Ссылочные

данные

Параллельные

массивы

NULL

NOL

Пустой указатель

i, j, p

i, j, p

Указатели элементов (ссылки на элементы)

*i

-

Элемент, на который указывает i

(*i).id

i->id

id[i]

Значение (поле id) элемента *i

(*i).uk

i->uk

uk[i]

Ссылка на преемник элемента *i

(адрес элемента, следующего в списке за *i)

i->uk->id

id[uk[i]]

Значение преемника элемента *i

i->uk->uk

uk[uk[i]]

Ссылка на преемник преемника элемента *i

Использование параллельных массивов

Значения всех элементов списка можно хранить в одном массиве, а ссылки на следующий элемент - в другом массиве. Массивов нужно по количеству полей, если элемент списка состоит из нескольких полей. Разные поля каждого элемента располагаются в разных массивах с одним и тем же индексом. Количество элементов в этих массивах одинаково. Такие массивы на рисунках удобно изображать рядом ("параллельно") и их называют параллельными.

В качестве ссылок используются индексы. Роль пустой ссылки может играть любое значение, не являющееся индексом: 0, -1. Параллельные массивы образуют область для хранения нескольких списков с одинаковым строением элементов - кучу.

На рис. 15.9 приведен пример списка идентификаторов (рис. 15.2) в виде параллельных массивов id и uk.

Индексы

Значения

Массив id

Ссылки

Массив uk

0

Не используются

1

TEXT

0

2

4

p

3

3

A1

6

Указатель списка

4

8

5

SL

1

6

SIMV

5

isv

7

7

2

Указатель списка

8

9

свободной памяти

. . .

N

0

Рис. 15.9. Пример размещения списка идентификаторов в параллельных массивах (со списком свободной памяти)

Для таких списков можно, по аналогии с обозначениями для ссылочных переменных (пример 15.1), поместить в программу описания из примера 15.2.

Пример 15.2. Описание данных для списков с использованием параллельных массивов.

#define N 1000 /* Максимальное кол-во элементов списков */

#define NOL 0 /* Пустой указатель */

typedef int ukaz; /* Тип указателя */

char id [N+1] [8]; /* Значения элементов (идентификаторы) */

ukaz uk [N+1]; /* Указатели следующего элемента */

ukaz p; /* Указатель списка */

ukaz i, j; /* Указатели элементов списка */

char nov_id[8]; /* Новый идентификатор */

Эти описания позволяют использовать обозначения из таблицы 15.1. Элемент списка, на который указывает i, в комментариях будем обозначать *i, как при использовании ссылочных переменных, хотя по правилам языка C здесь это обозначение бессмысленно и в операторах его применять нельзя.