Связные списки

Поддержка объектно-ориентированного и обобщённого программирования в C++. Создание разнообразных прикладных программ, разработка операционных систем, драйверов устройств и видеоигр. Динамические структуры данных, реализация операций над связными списками.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 10.07.2017
Размер файла 793,2 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

[Введите текст]

Федеральное агентство связи

Федеральное государственное бюджетное учреждение образовательное

высшего образования

«Сибирский государственный университет телекоммуникаций и

информатики» (СибГУТИ)

Кафедра телекоммуникационных сетей и вычислительных средств (ТС и ВС)

Курсовая работа по информатике на тему:

"Связные списки"

Выполнил: Насирахунов И. М.

Проверила: Лебеденко Л.Ф.

г. Новосибирск 2017

Содержание

Введение

Теоретические сведения

Задание

Програмная реализация

Разработка программы и результаты выполнения

Инструкция для пользователя

Заключение

Список используемой литературы

Введение

C++ -- компилируемый язык программирования общего назначения, сочетает свойства как высокоуровневых, так и низкоуровневых языков программирования. В сравнении с его предшественником -- языком программирования C, -- наибольшее внимание уделено поддержке объектно-ориентированного и обобщённого программирования. Название «язык программирования C++» происходит от языка программирования C, в котором унарный оператор ++ обозначает инкремент переменной.

Язык программирования C++ широко используется для разработки программного обеспечения. А именно, создание разнообразных прикладных программ, разработка операционных систем, драйверов устройств, а также видеоигр.

Не существует единственного самого лучшего способа создания программ. Для решения задач разного рода и уровня сложности требуется применять разные технологии программирования. Довольно часто можно встретить задачи, в которых количество элементов постоянно меняется, но при этом последовательность следования объектов должна оставаться неизменной. Но более жестким условием является непредсказуемость количества «объектов». В подобных случаях можно заказать массив размером, превышающий максимально возможный. Однако это неэффективно и могут возникнуть проблемы в других частях программы. Лучшим решением является организация списка. Организация многосвязного списка и является целью моей работы.

Теоретические сведения

Список представляет собой позиционно-ориентированную, линейную последовательность с доступом к элементам по номеру позиции или по значению. Элемент списка хранит значение объекта, включённого в список. Номера элементов в списке задаются в линейном порядке, начиная со значения 0 или 1. У списка есть первый и последний элементы. У всех остальных элементов есть единственный предшествующий элемент и последующий элемент. Идея связных списков состоит в представлении данных в виде объектов, связанных друг с другом указателями.

S1 и S2 являются указателями начала двух разных односвязных списков, в которые одновременно входит каждый из пяти элементов, а P1 и P2 - обозначения связок в 1 и 2 односвязных списках соответственно. S1 и S2 являются компонентами двух разных дескрипторов односвязных списков. (Рисунок 1)

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

Ссылка в каждом узле указывает на следующий узел в списке. В односвязном списке можно передвигаться только в сторону конца списка. Узнать адрес предыдущего элемента, опираясь на содержимое текущего узла невозможно.

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

Рисунок 1.

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

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

Линейный односвязный список является самым простым видом связных списков, к которому относятся односвязные и двусвязные списки.

Разновидностью связных списков является кольцевой (циклический, замкнутый) список. Он тоже может быть односвязным или двусвязным. Последний элемент кольцевого списка содержит указатель на первый, а первый (в случае двусвязного списка) -- на последний. Реализация такой структуры происходит на базе линейного списка. В каждом кольцевом списке есть указатель на первый элемент. В этом списке константы NULL не существует.

Если список не является ни линейным, ни кольцевым, то остаётся единственный вариант - ветвящийся список, фактически являющийся одной из древовидных структур данных.

Для списков характерны следующие операции:

добавление нового звена списка (вставка звена); удаление звена; просмотр (или прохождение) списка; поиск данных в списке; создание ведущего (заглавного) звена (при необходимости); сортировка списка; обращение (реверсирование) списка, т.е. перестановка всех его звеньев в обратном порядке. список программирование драйвер связный

Реализация операций над связными списками

Перебор элементов списка. Эта операция, возможно, чаще других выполняется над линейными списками. При ее выполнении осуществляется последовательный доступ к элементам списка - ко всем до конца списка или до нахождения искомого элемента.

1) Указатель текущего элемента устанавливается на начало списка.

2) Если указатель текущего элемента пустой - конец перебора.

3) Обрабатывается информационная часть текущего элемента, на который из текущего элемента выбирается указатель на следующий элемент, следующий элемент становится текущим.

В двухсвязном списке возможен перебор как в прямом направлении (он выглядит точно так же, как и перебор в односвязном списке), так и в обратном.

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

Задание

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

а 1 2 ,...,а n,0,

в которой 0 отмечает конец ввода число N не вводится, а подсчитывается при вводе последовательности), а второе используется для связи элементов списка. Если N нечетно, то один из однонаправленных списков должен оказаться короче другого. Ссылочным полям, которые никуда не ведут, должно быть присвоено значение NIL. Ссылочная переменная S используется для доступа к списочной структуре.

Разработка алгоритма

Блок-схема алгоритма формирование двух списков:

Программная реализация

Создана структура для элемента однонаправленного списка List1, которая содержит следующие поля:

· Информационное поле

· Указатель на правый элемент

Создана структура для элемента трехнаправленного списка List3, которая содержит следующие поля:

· Указатель на верхний элемент

· Указатель на нижний элемент

· Указатель на правый элемент

Работа программы происходит по следующим этапам:

· Объявляем указатель s на начало списка. Сначала его обнуляем.

· Вызываем функцию InputList, которая создает списки и возвращает количество введенных элементов. Эта функция размещает элементы списка в динамической памяти, вводит числа (информационные поля элементов списка) с клавиатуры и настраивает связи между элементами списков.

· Вызываем функцию ViewList, которая позволяет просматривать списки. Эта функция при нажатии клавиши `2' позволяет из трехнаправленного списка перемещаться в нижний список, при нажатии клавиши `8' позволяет из трехнаправленного списка перемещаться в верхний список, а при нажатии клавиши `6' позволяет перемещаться вправо по трехнаправленному списку.

При всех перемещениях на экран выводится информация о текущем элементе списка.

Нажатие клавиши `0' - окончание просмотра.

Разработка программы и результаты выполнения

#include <iostream>

#include <stdio.h>

#include <conio.h>

using namespace std;

FILE *f; // Файл для вывода результатов

// Структура для однонаправленного списка

struct List1

{

int info; // Информационное поле

List1 *right; // Указатель на правый элемент

};

// Структура для трехнаправленного списка

struct List3

{

List1 *up; // Указатель на верхний элемент

List1 *down; // Указатель на нижний элемент

List3 *right; // Указатель на правый элемент

};

// Вводит список. Возвращает число n

int InputList(List3 **s)

{

List1 *t1 = 0; // Указатель на текущий элемент верхнего или нижнего списка

List3 *t3 = 0; // Указатель на текущий элемент трехнаправленного списка

List1 *p2 = 0; // Указатель на последний введенный элемент верхнего списка

List3 *p0 = 0; // Указатель на последний элемент трехнаправленного списка

List1 *p1 = 0; // Указатель на последний введенный элемент нижнего списка

int n = 0; // Количество элементов

int a; // Вводимое число

scanf("%d", &a);

fprintf(f, "%d ", a);

while (a != 0) {

n++;

t1 = (List1 *) malloc(sizeof(List1)); // Создаем новый элемент

t1->info = a;

t1->right = 0;

if (n % 2 == 1) { // Если вводим элемент нижнего списка

t3 = (List3 *) malloc(sizeof(List3)); // Создаем новый элемент

t3->up = 0;

t3->down = t1;

t3->right = 0;

}

if (n == 1) // Если вводим первый элемент

*s = t3;

if (n % 2 == 1) { // Если вводим элемент нижнего списка

if (n != 1) { // Если вводим не первый элемент

p1->right = t1;

p0->right = t3;

}

p1 = t1;

p0 = t3;

}

else { // Если вводим элемент верхнего списка

if (n != 2) // Если вводим не второй элемент

p2->right = t1;

p2 = t1;

p0->up = t1;

}

scanf("%d", &a);

fprintf(f, "%d ", a);

}

fprintf(f, "\n");

return n;

}

// Просматривает список

void ViewList(List3 *s)

{

List1 *t1 = 0; // Указатель на текущий элемент верхнего или нижнего списка

List3 *t3 = 0; // Указатель на текущий элемент трехнаправленного списка

char y = 'y';

char c;

while (y == 'y') {

printf("\nПросмотр списка ");

printf("(8 - Переход вверх, 2 - Переход вниз, 6 - Переход вправо, 0 - Конец просмотра):\n");

fprintf(f, "\nПросмотр списка ");

fprintf(f, "(8 - Переход вверх, 2 - Переход вниз, 6 - Переход вправо, 0 - Конец просмотра):\n");

t3 = s;

c = '?';

while (c != '8' && c != '2' && c != '0') {

if (c == '6') { // Если идем вправо

if (t3->right != 0) {

printf("Вправо ");

fprintf(f, "Вправо ");

t3 = t3->right;

}

else {

printf("Пусто справа ");

fprintf(f, "Пусто справа ");

}

}

c = getch(); // Ждем нажатия клавиши

while (c == '8' && t3->up == 0) {

printf("Пусто вверху ");

fprintf(f, "Пусто вверху ");

c = getch(); // Ждем нажатия клавиши

}

}

if (c == '8' || c == '2') { // Если идем вверх или вниз

if (c == '8') { // Если идем вверх

t1 = t3->up;

printf("\nВверх\n");

fprintf(f, "\nВверх\n");

}

else { // Если идем вниз

t1 = t3->down;

printf("\nВниз\n");

fprintf(f, "\nВниз\n");

}

printf("6 - Переход вправо, 0 - Конец просмотра):\n");

fprintf(f, "6 - Переход вправо, 0 - Конец просмотра):\n");

c = getch(); // Ждем нажатия клавиши

while (c != '0') {

if (c == '6') { // Если идем вправо

if (t1->right != 0) {

printf("%d Вправо ", t1->info);

fprintf(f, "%d Вправо ", t1->info);

t1 = t1->right;

}

else {

printf("%d Пусто справа ", t1->info);

fprintf(f, "%d Пусто справа ", t1->info);

}

}

c = getch(); // Ждем нажатия клавиши

}

}

printf("\nНовый просмотр? (y/n) ");

fprintf(f, "\nНовый просмотр? (y/n) ");

y = getch(); // Ждем нажатия клавиши

}

}

void main()

{

setlocale(LC_ALL, "russian"); // Русский шрифт

List3 *s = 0; // Указатель на первый элемент списка

f = fopen("results.txt", "w"); // Открываем файл results.txt для записи результатов

puts("Введите последовательность целых чисел, в которой 0 отмечает конец ввода:");

fprintf(f, "Последовательность целых чисел:\n");

int n = InputList(&s);

if (n < 1) {

puts("В последовательности должно быть хотя бы одно число. Нажмите любую клавишу для выхода");

fprintf(f, "В последовательности должно быть хотя бы одно число\n");

fclose(f); // Закрываем файл

getch(); // Ждем нажатия любой клавиши

return;

}

ViewList(s);

fclose(f); // Закрываем файл

}

Результат выполнения:

Таким образом, видим, что информационные поля и связи внутри списков и между списками настроены правильно.

Программа отлажена в Microsoft Visual Studio 2008.

Инструкция пользователя

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

Далее программа предлагает выполнить просмотр созданных списков. Для этого можно нажимать следующие клавиши:

· нажатие клавиши `2' позволяет из трехнаправленного списка перемещаться в нижний список.

· нажатие клавиши `8' позволяет из трехнаправленного списка перемещаться в верхний список.

· нажатие клавиши `6' позволяет перемещаться вправо по любому из трех списков.

· нажатие клавиши `0' - окончание просмотра.

При всех перемещениях по однонаправленным спискам на экран выводится информация о текущем элементе списка.

Заключение

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

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

В ходе выполнения курсовой работы были получены основы разработки многосвязных списков. Была изучена среда разработки Microsoft Visual Studio 2008. В результате работы была написана программа, которая строит списочную структуру, состоящую из кольцевого двунаправленного и однонаправленного списков, связанных между собой.

Список литературы

Карпов Б., Баранов Т. «С++: специальный справочник» - СПб.: Питер, 2001. -- 480 с.:ил.

Культин Н. «С/С++ в задачах и примерах» - СПб.:БХВ-Петербург, 2002. -- 288 с.

Павловская Т.А. “С/с++. Программирование на языке высокого уровня. - СПб.: Лидер, 2010. -- 461 с.:ил.

Размещено на Allbest.ru

...

Подобные документы

  • Средства выделения и освобождения памяти. Динамические структуры данных. Связные линейные списки и их машинное представление. Структура одно- и двухсвязного списка. Реализация операций над связными линейными списками. Разработка программы на языке С++.

    курсовая работа [944,7 K], добавлен 14.03.2015

  • Понятие объектно-ориентированного программирования, характеристика используемых языков. Практическая разработка средств объектно-ориентированного программирования в задачах защиты информации: программная реализация на языке С++, а также Turbo Pascal.

    курсовая работа [275,9 K], добавлен 22.12.2011

  • Использование объектно-ориентированного программирования - хорошее решение при разработке крупных программных проектов. Объект и класс как основа объектно-ориентированного языка. Понятие объектно-ориентированных языков. Языки и программное окружение.

    контрольная работа [60,1 K], добавлен 17.01.2011

  • Разработка структуры базы данных для хранения дипломных проектов в среде объектно-ориентированного программирования Python. Создание внешнего вида окон ввода-вывода информации, технологии переходов. Листинг программы с пояснениями; направления улучшения.

    курсовая работа [3,1 M], добавлен 27.02.2015

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

    курсовая работа [1,5 M], добавлен 31.01.2016

  • Изучение особенностей операционной системы, набора программ, контролирующих работу прикладных программ и системных приложений. Описания архитектуры и программного обеспечения современных операционных систем. Достоинства языка программирования Ассемблер.

    презентация [1,3 M], добавлен 22.04.2014

  • Анализ проблематики построения объектно-ориентированного канала связи. Основные понятия протокола Modbus. Возможности CodeSys для реализации объектно-ориентированного подхода. Разработка методики кроссплатформенной библиотеки для интеграции устройств.

    курсовая работа [38,6 K], добавлен 15.06.2013

  • Разработка приложения "Калькулятор с переходом в строковый калькулятор" с применением объектно-ориентированного программирования. Концепция и понятия объектно-ориентированного программирования. Язык программирования Java. Листинг программы "Калькулятор".

    курсовая работа [966,9 K], добавлен 11.02.2016

  • Исследование принципов объектно-ориентированного программирования на базе языка программирования С++. Разработка программного комплекса для ведения учёта памятников города. Описание процессов сортировки, поиска, формирования статистики по памятникам.

    курсовая работа [782,4 K], добавлен 26.05.2014

  • Приемы и правила объектно-ориентированного программирования с использованием языка С++. Общие принципы разработки объектно-ориентированных программ. Основные конструкции языка С++. Разработка различных программ для Windows с использованием WIN32 API.

    учебное пособие [1,6 M], добавлен 28.12.2013

  • Анализ объектно-ориентированного программирования, имитирующего способы выполнения предметов. Основные принципы объектно-ориентированного программирования: инкапсуляция, наследование, полиморфизм. Понятие классов, полей, методов, сообщений, событий.

    контрольная работа [51,7 K], добавлен 22.01.2013

  • Основные операции с АВЛ-деревьями, добавление и удаление элемента из сбалансированного дерева. Эффективность сортировки вставкой в АВЛ–дерево и итераторы. Алгоритм реализации АВЛ–деревьев через классы объектно–ориентированного программирования.

    курсовая работа [281,1 K], добавлен 29.11.2010

  • Общая характеристика объектно-ориентированного подхода в программировании, его основные свойства и принципы. Разработка программы для автоматизация деятельности кафе на основе объектно-ориентированного подхода, проектирования и реализации схемы данных.

    курсовая работа [1,2 M], добавлен 22.01.2012

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

    курсовая работа [175,5 K], добавлен 25.03.2015

  • Особенности исследования методик объектно-ориентированного проектирования программ с помощью языка UML по формализации, решению поставленной задачи, технологических приемов разработки объектно-ориентированных программ на языке Си++. Разработка программы.

    контрольная работа [188,9 K], добавлен 22.10.2014

  • Характеристики и свойства языков программирования. Исследование эволюции объектно-ориентированных языков программирования. Построение эволюционной карты механизмов ООП. Разработка концептуальной модели функционирования пользовательского интерфейса.

    курсовая работа [2,6 M], добавлен 17.11.2014

  • Принципы разработки алгоритмов и программ на основе процедурного подхода и на основе объектно-ориентированного подхода. Реализация программы Borland Pascal 7.0, ее интерфейс. Разработка простой программы в среде визуального программирования Delphi.

    отчет по практике [934,7 K], добавлен 25.03.2012

  • Технологии программирования. Сущность объектно-ориентированного подхода к программированию. Назначение Си, исторические сведения. Алфавит, базовые типы и описание данных. Структуры и объединения. Операторы Си++. Функции. Библиотека времени выполнения.

    курс лекций [51,9 K], добавлен 03.10.2008

  • Основные понятия объектно-ориентированного программирования в PHP5. Структурный и объектно-ориентированный подход. Класс как абстрактный тип. Реализация класса. Конструкторы и деструкторы. Функция l_visited_style изменение стиля посещенных ссылок.

    курсовая работа [433,2 K], добавлен 13.06.2008

  • Разработка приложения для работы с базой данных с использованием объектно-ориентированного и визуального программирования. Обзор языка элементов языка программирования Delphi. Проектирование базы данных автозаправки. Клиентская система приложения.

    курсовая работа [2,3 M], добавлен 31.01.2016

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.