
Использование ссылочных данных
Для примера предположим, что значением элемента списка является идентификатор длиной до 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 здесь это обозначение бессмысленно и в операторах его применять нельзя.