Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
К9-12В. Вопросы и ответы к ГОСам 2013 / Программирование на языке высокого уровня / 01. Понятие логических структур данных. Отображение структуры данных в памяти вектором и списком. Типы списков.docx
Скачиваний:
98
Добавлен:
10.05.2014
Размер:
118.72 Кб
Скачать

Векторы

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

  • базовый адрес,

  • размер вектора (количество элементов),

  • размер одного элемента вектора.

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

Соседние файлы в папке Программирование на языке высокого уровня