
Векторы
Векторпредставляет собой множество элементов, которые физически расположены последовательно друг за другом. Для определения вектора необходимо определить:
базовый адрес,
размер вектора (количество элементов),
размер одного элемента вектора.
При этом предполагается, что все элементы вектора должны иметь одинаковый размер (Error: Reference source not found).
Вектор соответствует линейной структуре памяти машины и представляет собой имя, данное базовой структуре памяти машины. К отдельным элементам вектора можно непосредственно обратиться, используя базовый адрес вектора и порядковый номер элемента в векторе. На уровне базовой структуры памяти машины для организации доступа к i-му элементу вектора его адрес вычисляется следующим образом:
Адресi=базовый_адрес+i*размер_элемента
Представление вектора в языке С/С++
Вектор практически соответствует одномерному массиву, что не вызывает проблем его использования в программах. В языке С/С++ вектор определяется как массив элементов определенного типа, при этом язык не накладывает ограничения на тип элемента массива:
тип_элементаимя_массива [количество_элементов ];
Тогда имя_массиваопределяет базовый адрес вектора,количество_элементов– размер вектора итип_элемента– размер элемента вектора.
Примеры:
int a[12], b[3];
char s[80];
structSx[100];
В первых двух примерах использован стандартный (предопределенный языком) тип элементов массивов – intиchar. В последнем примере тип элемента массива определяется программистом (в соответствии с тем, как он определит структуруS).
Доступ к элементу массива можно осуществить двумя способами:
с помощью индекса array[16]=3,
с помощью указателя *(array+16).
И в том, и в другом случае при осуществлении доступа к некоторому элементу массива (вектора) адрес элемента вычисляется без участия программиста.
Поскольку имя массива является указателем допустимо:
int array[25];
int *ptr;
ptr=array;
Списки
Списокпредставляет собой множество элементов, каждый из которых состоит из двух полей. Первое поле содержит указатель на информацию, определяемую этим элементом, второе – указатель на следующий элемент списка (рис.II-8). Список, составленный из таких элементов, представляет собойлинейный список.
Информацией, определяемой таким элементом списка, может быть другой список или некоторая внешняя по отношению к рассматриваемой структура данных. Она может размещаться вне элемента списка или внутри него, в зависимости от характеристик элементов отображаемой абстрактной структуры данных. В то же время информация, определяемая элементом списка, является неделимой с точки зрения выполнения операций с данным списком.
Доступ к списку как к единому целому обеспечивается определением начала списка (первого элемента списка). Обычно список определяется специальным указателемна начало списка. Последний элемент списка в поле указателя на следующий элемент может иметь специальную запись – так называемый "пустой" указатель (NULLили0). Список, определенный таким образом, получил названиелинейного односвязного списка(рис.II-9).
Можно определить список, задав вместо указателя специальный – головной элемент, в котором поле указателя на информацию не используется, а поле указателя на следующий элемент определяет начало списка. Такой список получил название списка с головным элементом(рис.II-10).
Последний элемент списка вместо пустого указателя может содержать указатель на первый элемент списка; в этом случае говорят о циклическомсписке, который также может быть просто списком или списком с головным элементом (рис.II-11).
Наконец, каждый элемент списка может содержать, помимо указателя на информацию, еще два указателя – на следующий и предыдущий элементы списка. Такой список называется двусвязными определяется своими началом (первым элементом) и концом (последним элементом списка).
Двусвязный список, как и односвязный, может быть линейным и циклическим; начало и конец списка могут быть заданы с помощью указателей или с помощью головных элементов (рис. II-12).
Таким образом, элементы списка могут располагаться в памяти машины в произвольном порядке, поскольку каждый элемент списка сам определяет следующий за ним элемент; это позволяет отображать на линейную память машины нелинейные структуры данных.
Представление списка в языке С++
Для задания списка в программе следует определить структуру элемента списка и задать начало списка (и его конец, если используется двусвязный список). Элемент односвязного списка определяется с помощью структуры следующим образом:
struct Item{
тип info;
Item *next;
};
В этом определении слово типопределяет тип информационной части элемента списка; это может быть, как уже говорилось, указатель на информацию или сама информация; информация может быть представлена базовыми типами языка или типами, определенными программистом (то есть, другими структурами). Конкретный способ задания информационного поля в элементе списка определяется конкретным приложением.
Сети
Сетьпредставляет собой множество элементов (называемыхузлами), каждый из которых состоит из нескольких полей. Одно поле содержит указатель на информацию, определяемую этим элементом, а все остальные – указатели на другие узлы сети (рис.II-13).
В общем случае в сети могут быть использованы узлы разных типов, поэтому с каждым типом узла связывают формат, определяющий назначение конкретных полей. Формат предполагается внешним по отношению к множеству узлов, составляющих сеть.
Сети используются для отображения сложных абстрактных структур. Хотя рассмотренные выше списки и пригодны для отображения таких структур, они нередко могут оказаться неэффективными и недостаточно наглядными. Более эффективными и наглядными внутренними структурами могут быть сети. Например, приведенное ранее арифметическое выражение (a+b)*(c-d)может быть задано в форме сети так, как это показано на рис.II-14.