Автор работы: Пользователь скрыл имя, 25 Марта 2015 в 16:02, курсовая работа
Общая постановка задачи: реализовать комбинированную структуру данных на основе структурного подхода. Структура данных: статический список упорядоченных двунаправленных динамических списков.
Введение. 3
1. Постановка задачи 4
2. Теоретическое описание используемых структур данных с алгоритмами реализации основных операций. 5
2.1. Структура данных типа «Список». 5
2.2. Статическая реализация списка. 5
2.3. Динамическая реализация упорядоченного двунаправленного списка. 7
3. Комбинированная структура данных «Статический список динамических упорядоченных двунаправленных списков» 10
4. Руководство для программиста. 11
4.1. Описание структуры проекта. 11
4.2. Описание разработанных структур. 11
4.3. Описание разработанных функций. 12
4.4. Структурные схемы основных функций для работы с главной и присоединенной структурами. 16
5. Руководство для пользователя. 20
5.1. Функции основного меню. 20
5.2 Файл. 29
6.Результаты тестирования. 30
Заключение. 36
Список используемой литературы. 37
Приложение 1. Листинг программы. 38
Приложение 2. Пример заранее предопределенной структуры .TXT файла. 50
Министерство образования и науки Российской Федерации
КНИТУ-КАИ
имени А.Н.Туполева
==============================
Институт Технической кибернетики и информатики
Кафедра ПМИ им. Ю. В. Кожевникова
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к
курсовой работе
по дисциплине
«Алгоритмы и структуры данных»
на тему: «Реализация комбинированной структуры данных на основе статического списка упорядоченных двунаправленных динамических списков»
Выполнил: Студент группы 4217.
Валиев И. И.
Проверил: Сотников С.В.
КАЗАНЬ 2013.
Оглавление
Типизация данных является одним из фундаментальных понятий современного программирования. Отнесение переменных к тому или иному типу позволяет установить внутренний формат хранения значений этой переменной и набор допустимых операций. Все распространенные языки программирования имеют набор базовых простейших типов данных (целочисленные, вещественные, символьные, логические) и возможность объединения их в составные наборы – массивы, записи, файлы. Понятие структуры данных определяется двумя моментами:
• способом объединения отдельных компонент в единую структуру
• способами обработки как отдельных компонент структуры, так и всей структуры в целом.
Большинство дополнительных структур данных можно реализовать двумя способами:
• статически на основе массива
• динамически с помощью специальных переменных-указателей.
Каждый из этих способов имеет свои преимущества и недостатки.
Общая постановка задачи: реализовать комбинированную структуру данных на основе структурного подхода.
Общие требования:
1. Реализация всех необходимых операций (добавление и удаление в основной и присоединенной структурах).
2. Возможность сохранения всей структуры во внешнем файле (текстовом или XML) с обратной загрузкой
3. Реализация структуры для хранения и обработки данных конкретной информационной задачи
4. Именование типов, структур и их полей в соответствии с конкретной
информационной задачей.
Структура данных: статический список упорядоченных двунаправленных динамических списков.
Информационное наполнение: Железная дорога (название) - композиция депо (номер). Депо - композиция электровозов(марка, регистрационный номер) .
Выбранный язык реализации: C++.
Используемые структуры данных:
Линейный список – это набор связанных однотипных элементов, в котором каждый элемент каким-то образом определяет следующий за ним элемент. В отличие от стека и очереди, добавление нового элемента возможно в любом месте списка, также можно удалить любой элемент списка.
Стандартный набор операций со списком включает:
Как обычно, возможна статическая и динамическая реализация списков. При этом статическая реализация на базе массива может быть выполнена двумя способами. Нам необходима динамическая реализация.
Есть два способа реализации списка на основе массива: способ, используемый в данной курсовой работе (будет описан ниже),второй способ (логический номер элемента списка полностью соответствует номеру ячейки массива).
Этот способ реализации списка на основе массива использует принцип указателей (но БЕЗ динамического распределения памяти). В этом случае каждый элемент списка (кроме последнего) должен содержать номер ячейки массива, в которой находится следующий за ним элемент. Это позволяет РАЗЛИЧАТЬ физический и логический порядок следования элементов в списке.
Проход по списку:
Алгоритм добавления элемента перед заданным включает следующие шаги:
Удаление элемента списка включает в себя:
Динамическая реализация линейного списка, также как стека и очереди, основана на динамическом выделении и освобождении памяти для элементов списка. Логическая последовательность элементов списка создается ссылочными переменными с адресами последующих элементов (последний элемент имеет пустую ссылку null).
Для удобства реализации будем считать, что список ВСЕГДА содержит хотя бы один элемент-заголовок с адресом первого реального элемента списка. Это позволяет унифицировать процедуры добавления и удаления крайних элементов и устранить некоторые проверки. Адрес элемента-заголовка задается переменной-указателем Head. Эта переменная устанавливается при первоначальном создании списка и в дальнейшем НЕ изменяется. Для реализации основных действий используются вспомогательные ссылочные переменные.
Если при обработке списков часто бывает необходимо переходить от текущего элемента к его предшественнику, то такая односторонняя организация становится неудобной. Выходом является построение двунаправленных списков, в которых каждый элемент “знает” обоих своих соседей, как левого, так и правого.
Для этого каждый элемент должен иметь не одно, а два связующих поля: указатель на элемент слева и указатель на элемент справа.
Аналогично обычным спискам, удобно ввести фиктивный заголовочный элемент, а поскольку двунаправленные списки являются симметричными, удобно сделать их замкнутыми, кольцевыми: правая ссылка последнего элемента указывает на заголовок, а левая ссылка заголовка – на последний элемент. Адрес заголовка определяется указателем pHead.
Отметим достоинства и недостатки двунаправленных списков. Достоинство – простота перехода от текущего элемента к любому его соседу. Недостатки – увеличиваются затраты памяти и число операций на поддержку дополнительного указателя.
Двунаправленный список можно реализовать как на основе массива (причем – обеими способами), так и динамически.
В последнем случае описание структуры данных выглядит следующим образом:
TDin2Item = record {базовый тип}
left, right : pDin2Item; {адреса соседних элементов}
Если pHead есть указатель на заголовок, то пустой список создается так:
(при этом пустая ссылка nil нигде НЕ используется!)
Набор операций расширяется просмотром и поиском не только в прямом, но и в обратном направлениях. Немного изменяется условие достижения конца списка – вместо условия появления пустой ссылки надо использовать условие получения на текущем шаге адреса заголовка. Например, проход в обратном направлении реализуется так:
while pCurrent <> pHead do pCurrent := pCurrent^.left;
Удаление заданного элемента требует изменения большего числа ссылочных полей. Надо изменить правый указатель у левого соседа удаляемого элемента и левый указатель у правого соседа.
Если удаляемый элемент адресуется указателем pCurrent, то pCurrent^.left определяет адрес левого соседа, а pCurrent^.right – адрес правого соседа. Тогда необходимые изменения реализуются так:
pCurrent^.left^.right := pCurrent^.right;
pCurrent^.right^.left := pCurrent^.left;
Аналогично выполняется добавление нового элемента, например – после заданного указателем pCurrent. Пусть как обычно новый элемент определяется указателем pTemp. Тогда для вставки его в список надо настроить оба его ссылочных поля, изменить правое ссылочное поле у текущего элемента и левое ссылочное поле у его правого соседа.
Необходимые присваивания (порядок следования важен!):
pTemp^.right := pCurrent^.right;
pTemp^.left := pCurrent;
pCurrent^.right^.left := pTemp;
pCurrent^.right := pTemp;
Аналогично реализуется добавление нового элемента перед заданным элементом, только вместо правого соседа обрабатывается левый сосед текущего элемента.
Статический список динамических упорядоченных двунаправленных списков – комбинированная структура данных, реализованная на основе статического списка и динамических упорядоченных двунаправленных списков. Статический список является основной структурой, динамическая упорядоченный двунаправленный список – присоединенной.
Основной набор операций:
1. Графическое представление комбинированной структуры данных.
Для разработки проекта была использована следующая среда разработки программного обеспечения: Microsoft Visual Studio 2012.
Весь программный код, включая основную программу, хранится в файлах .cpp . Инструментарий Microsoft Visual Studio 2012 использует расширение .vcxproj и .sln. Никакие сторонние библиотеки для успешной компиляции проекта не требуются.
Было разработано две структуры данных: для организации статического списка и для организации динамического упорядоченного двунаправленного списка.
#define SIZE 20
struct ZD
{
string name; //название железной дороги