Объектно-ориентированные связанные списки. — КиберПедия 

Папиллярные узоры пальцев рук - маркер спортивных способностей: дерматоглифические признаки формируются на 3-5 месяце беременности, не изменяются в течение жизни...

Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...

Объектно-ориентированные связанные списки.

2019-12-26 140
Объектно-ориентированные связанные списки. 0.00 из 5.00 0 оценок
Заказать работу

Связным списком называется связный набор элементов со связями, устанавливающими порядок следования объектов в списке. Первый элемент списка называют головой списка, последний — хвостом. Наиболее часто рассматривают односвязный список, в котором устанавливаются связи типа "Следующий", и двусвязный список со связями типа "Предыдущий‑Следующий". Доступ к элементам списка осуществляется посредством операций определения предыдущего и последующего элемента по уже известному (например, по голове или хвосту).

Для реализации концепции связанного списка необходимы все характеристики ООП.

Рассмотрим пример, создающий информационный список сотрудников.

Родительский класс nnr содержит сведения, общие для всех порождаемых классов-потомков (фамилия и имя сотрудника, должность, номер социальной страховки и стаж работы), они содержатся в разделе protected. Класс использует дружественный класс payroll_list:

class nnr

{

friend class payroll_list;

protected:

char lstname[20];

char fstname[15];

char job_title[30];

char sosial_sec[12];

int year_hired;

nnr *pointer;

nnr *next_link;

public:

nnr(…){…next_link=0;}

void send_info();

};

На основе класс nnr строятся классы-потомки, один из них salesperson:

class salesperson:publuc nnr

{

friend class payroll_list;

private:

float sales;

int comm_rate;

public:

salesperson(…):nnr(…){sales=…;}

void fill_sales(float d_sales)

{sales=d_sales;}

void fill_comm_rate(int d_rate)

{comm_rate=d_rate;}

void add_info(){pointer=this;}

void send_info()

{

       nnr::send_info();

       cout<<”sales ”<<sales<<endl;

       cout<<”Commision ”<<comm_rate;

}

};

 

 

В этом классе добавляется два частных элемента (общая продажа и процент комиссионных). Для выделения памяти для каждого дополнительного элемента связного списка в функции addinfo используется не операция динамического выделения памяти, а указатель на объект this.

Выходная информация о конкретном сотруднике является уникальной. Функция send_info выводит сначала общую информацию вызовом функции базового класса, а затем частную информацию.

В дружественном классе payroll_list содержатся средства для печати связанного списка, добавления и удаления записей в списке:

class payroll_list

{

private:

nnr *location;

public:

payroll_list(){location=0;}

void print_payroll_list();

void insert_employee(nnr *node);

void remove_employee(char *social_sec);

};

Рассмотрим функцию print_payroll_list(). Сначала в ней значение указателя на список присваиваивается переменной present. если указатель не нулевой, то в списке есть еще записи, которые передаются функции send_info(). Далее указатель смещается, и процесс повторяется:

void payroll_list::print _payroll_list()

{

nnr *present=location;

while(present!=0)

{

       present_>send_info();

       present=present_>next_link;

}

}

Переменная pointer содержит адрес памяти, где находится данный представитель класса. Это значение используется в функции insert_employee() для реализации связи между записями связного списка. При добавлении записи располагаются в алфавитном порядке по фамилиям сотрудников. Когда находится уже имеющаяся в списке фамилия (node_>lstname), большая, чем current_node_>lstname, то первый цикл заканчивается. Это стандартная процедура вставки в связанный список: указатель previous_node ссылается на запись, после которой вставляется новая запись, а current_node указывает на запись, которая будет следовать за вновь добавленной записью.

Когда точка вставки определена, программа создает новую связь или узел путем вызова функции node_>add_info(). Указатель current_node связывается с указателем next_link этого нового узла. Кроме того, проводится проверка на начало списка:

void payroll_list::insert_employee(nnr* node)

{

nnr *current_node=location;

nnr *previoise_node=0;

while(current_node!=0 &&

       strcmp(current_node->lstrname,node->lstrname)<0)

{

       previous_node=current_node;

       current_node=current_node->next_link;

}

node->add_info();

node->pointer->next_link=current_node;

if(previouse_node==0)

location=node->pointer;

else

previouse_node->next_link=node->pointer;

}

При удалении из связного списка используется номер социальной страховки для исключения возможности ошибочного удаления. Алгоритм удаления аналогичен предыдущему:

void payroll_list::remove_employee(char* social_sec)

{

nnr *current_node=location;

nnr *previoise_node=0;

while(current_node!=0 &&

       strcmp(current_node->social_sec,social_sec)!=0)

{

       previous_node=current_node;

       current_node=current_node->next_link;

}

if(current_node!=0 && previouse_node==0)

{

location=current_node->nex_link;

delete current_node;

}else

if(current_node!=0 && previouse_node!=0)

{

previouse_node->next_link=current_node->next_link;

delete current_node;

}

}

 

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

Практическое задание.

 

Это задание посвящено изучению свойств структур данных переменного размера и потоков данных в языке C++. При выполнении практических задач студенты знакомятся с основными динамическими структурами данных: списками, динамическими и ассоциативными массивами, деревьями. Реализуя динамические структуры данных в своих программах, студенты должны предусмотреть возможность сохранения объектов на диске и восстановления их из файла. Эти функции должны быть реализованы на основе потоков языка C++.

Необходимым условием при реализации функций сохранения и восстановления данных является их совместимость по форматам данных (т.е. чтобы объект, спасенный одной программой мог быть прочитан и восстановлен другой без коррекции файла данных).

Вариант A.

Очередью называется связный список объектов с доступом в двух точках — голове и хвосте очереди. Объект добавляется в хвост очереди, а извлекается из ее головы. Таким образом первый элемент, помещенный в очередь, будет извлечен первым.

Разработайте класс "Динамически изменяемая очередь" и напишите программу, рисующую червяка, случайным образом ползающего по экрану. Каждая точка тела червяка повторяет траекторию головы. Предусмотрите возможности сохранения очереди на диске и восстановления его из файла.

Вариант B.

Деревом называется структура данных, основанная на порядке типа "Отец‑Сыновья". Дерево состоит из узлов. Каждый узел (кроме одного) имеет единственного родителя и одного или нескольких сыновей. Родители и сыновья, в свою очередь, также являются узлами и т.д. Дерево имеет также единственный узел, не имеющий родителя, но имеющий сыновей. Таким образом, все остальные узлы дерева являются прямыми или косвенными сыновьями этого узла. Такой узел называется корнем дерева. Узлы, имеющие и родителей и сыновей, часто называют ветвями дерева, а узлы, имеющие только родителей, но не имеющие сыновей называют листьями. По максимальному количеству сыновей у одного узла различают бинарные — 2 сына, тринарные — 3 сына, тетрарные — 4 сына и т.д. деревья.

Разработайте класс "Тринарное дерево" и напишите на его основе программу, строящую плоский фрактал по следующему рекуррентному алгоритму:

                    

           

Предусмотрите операции спасения дерева на диск и восстановления его с диска. Глубину прорисовки фрактала определите в программе исходя из количества свободной памяти в системе.

Вариант C.

Ассоциативным массивом (или картой) называется массив объектов с индексированием по набору заранее неизвестных и необязательно последовательных величин — ассоциаций (например строк, соответствующих названиям объектов).

Разработайте класс "Ассоциативный массив" и напишите программу рисующую на экране случайные фигуры с цветом, который пользователь задает по имени. Исходное состояние ассоциативного массива прочитайте из файла. Предусмотрите также процедуру сохранения ассоциативного массива на диске.

 

Вариант D.

Упорядоченным списком называется список объектов, в котором порядок следования элементов определяется из соотношений "больше‑меньше" некоторого заданного параметра (ключевой параметр). В этом случае первому элементу списка будет соответствовать элемент с наименьшим значением ключевого параметра, второй — с ключом большим, чем у первого, третий — с большим, чем у второго и т.д.

Разработайте класс "Упорядоченный список" и напишите программу, строящую упорядоченную круговую диаграмму по заданному набору величин. Предусмотрите возможности сохранения упорядоченного списка на диске и восстановления его из файла.

 

Вариант E.

Разработайте класс "Двусвязный список" и напишите программу создающую список из последовательных квадратов и пробегающую по этому списку от головы к хвосту и обратно. Текущий элемент списка выделяйте цветом. Предусмотрите возможности сохранения списка на диске и восстановления его из файла.

 

Вариант F.

Разработайте класс "Динамически изменяемый стек" и напишите программу, создающую набор произвольных объектов (например, букв на экране) и уничтожающую их в обратном порядке. Предусмотрите возможности сохранения стека на диске и восстановления его из файла.

 

Вариант G.

Разработайте класс "Динамически изменяемая очередь" и напишите программу, создающую набор произвольных объектов (например, окружностей на экране) и уничтожающую их в том же порядке, в котором объекты создавались. Предусмотрите возможности сохранения очереди на диске и восстановления его из файла.

 

Тема 10. Полнофункциональный ввод-вывод в С++.

Особенности ввода-вывод в языке С++.

В языке С++ ввод/вывод описывается как набор классов, описанный в заголовочном файле iostream.h. Аналогами потоков stdin, stdout, stderr являются классы cin, cout и cerr. Эти три потока открываются автоматически. Поток cin связан с клавиатурой, а cout, cerr - с дисплеем.

 Классы iostream используют перегруженные операции “<<” для записи (занесения в поток) и операциb “>>” для чтения (извлечения из потока). Операции возвращают ссылку на тип iostream, что позволяет сцеплять потоковые операции. Они перегружаются для всех типов данных (в том числе и для пользовательских), тем самым необходимость проверки соответствия типов отпадает. Компилятор самостоятельно выбирает необходимую функцию в соответствии с типом данных:

int ivalue;

float fvalue;

char c;

cin>>ivalue>>fvalue>>c;

cout<<”integer: “<<ivalue<<endl<<” float: “<<fvalue<<”char: “<<c;

Для вставки символа перевода строки необходимо либо выводить символ ‘\n’, либо константу endl.

Для форматирования выводимых данных для объектов iostream включены следующие методы:

precision(int p) - количество знаков после запятой,

width(int w) - размер поля для вывода,

setf(long manip) - установка флагов, определяющих формат вывода(ios::dec, ios::oct, ios::hex, ios::fixed, ios::scientific, ios::left, ios::right).

Классы iostream.

Все объекты ввода/вывода, описанные в библиотеке iostream, используют оди и тот же базовый класс ios (за исключением классов буферизованных потоков). Эти производные классы делятся на 4 категории.

Классы потокового ввода

istream Универсальный класс ввода, или родительский класс для других производных потоковых классов ввода. ifstream Ввод из файлов. istream_withassign Ввод из потока cin. istrstream Ввод из строки.

Классы потокового вывода

ostream Универсальный класс вывода, или родительский класс для других производных потоковых классов вывода. ofstream Вывод в файлы. ostream_withassign Вывод в потоки cout, cerr и clog. ostrstream Вывод в строку.

Поделиться с друзьями:

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

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.034 с.