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

 

Синтаксис языка С++ допускает определение структуры с элементами, которые являются указателями на тип самой структуры. Это позволяет создавать динамические типы с произвольным числом таких структур, связанных вместе.

Н а п р и м е р : struct type_list {

type data;

type_list * next;} *list_1;

list_1= new type_list;

1 2 3

list_→ datа data data

next next next = 0

 

Здесь list_1 – указатель на начало списка; data – данные типа type; next – адрес следующего элемента типа type_list или 0.

Через указатель на начало списков осуществляется доступ к данным, хранящимся в элементах.

 

 

Задания

Разработайте алгоритм и программу, реализующую структурированный тип данных (СТД), согласно варианту. Определите функции инициализации, присваивания, вывода содержимого и обработки (сортировка, поиск, сравнение, арифметические действия и т.д.).

Варианты СТД:

1. Динамический вектор;

2. Динамическая матрица;

3. Динамический куб;

4. Динамический стек;

5. Динамическая очередь;

6. Линейный связанный список;

7. Динамический массив комплексных чисел;

8. Мультивектор, содержащий три вектора;

9. Персонал;

10. Библиотека.

Проверьте работоспособность СТД на тестовом наборе данных.

Контрольные вопросы

 

1. Что такое структуры и объединения? Сформулируйте правила инициализации.

2. Опишите механизм передачи структур функциям.

3. По какому принципу создаются динамические структуры данных?

4. Объясните, что представляет собой массив структур?

5. В каких случаях возникает необходимость использовать вложенные структуры и объединения?

Р а з д е л IV

РАЗРАБОТКА АБСТРАКТНЫХ ТИПОВ ДАННЫХ

Цель работы: изучить способы определения классов, правила доступа к элементам; приобрести практические навыки работы с объектами класса; изучить принципы и механизмы создания абстрактных типов данных.

Основные теоретические положения

 

Определение классов

Класс – это гетерогенный агрегатный тип, имеющий элементы, данные и элементы функций, обеспечивающий сокрытие данных и наследование.

Структура класса имеет вид:

 

class имя_типа {public: // элементы доступны и наследуются

----- ------ -------

----- ------ -------

protected: //элементы защищены и наследуются

----- ------ -------

----- ------ -------

private: //элементы закрыты, не наследуются

----- ------ -------

----- ------ -------

};

 

Спецификаторы доступа public, protected и private определяют степень открытости элементов, которые следуют за ними.

По умолчанию элементы структуры являются открытыми, элементы класса – закрытыми.

Компонентные функции

 

Функции, объявленные или определенные внутри класса, являются компонентными. Они имеют доступ к закрытым, защищенным и открытым элементам своего класса, могут быть перегруженными.

Компонентные функции вызываются с помощью оператора .или → , а также при объявлении объектов класса (конструкторы), при уничтожении объектов (деструкторы), при перегрузке операторов.

 

 

Дружественные функции

 

Дружественная функция должна быть объявлена внутри объявления класса, по отношению к которому она является дружественной, с использованием спецификатора friend. Такая функция имеет доступ к закрытым элементам класса наряду с компонентными функциями. Дружественными могут быть как внешние, так и компонентные функции, в этом случае для указания имени функции в дружественном классе используется оператор разрешения области видимости ::.

 

Н а п р и м е р :

 

class A {-----

friend int B:: f( ); // f() - компонентная функция класса В, дружественная классу А

};

class C {----

friend class B; // все компонентные функции класса В являются дружественными классу С

};

class D {----

friend D f(D); // f() - внешняя функция, дружественная классу D

};

 

 

Указатель this

 

Ключевое слово this неявно объявляет указатель на себя. Может иметь место только в нестатических компонентных функциях. Заменяет объявление закрытого элемента:

 

class_type * const this.