Главная страница

Алгоритмы и структуры данных ЛР2. Двусвязные списки


Скачать 0.5 Mb.
НазваниеДвусвязные списки
АнкорАлгоритмы и структуры данных ЛР2
Дата18.07.2022
Размер0.5 Mb.
Формат файлаdocx
Имя файлаАлгоритмы и структуры данных ЛР2.docx
ТипЛабораторная работа
#632797

Министерство цифрового развития, связи и

массовых коммуникаций Российской Федерации

Сибирский государственный университет телекоммуникаций и информатики
Межрегиональный учебный центр переподготовки специалистов
Лабораторная работа №2

по дисциплине: Алгоритмы и структуры данных


Лабораторная работа №2
Тема: Двусвязные списки

Цель работы: изучить понятие и способы описания двусвязных списков и освоить их программную реализацию средствами языка С++.
Задание:

На основе материалов конспекта лекций (раздел 3) и рекомендуемой литературы изучить теоретический материал по программированию двусвязного и кольцевого списка.

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

Сформировать список произвольных целых чисел (не менее 10 элементов) и вывести его на экран.

В соответствии с индивидуальным вариантом (табл. 1) обработать данные списка. При этом не использовать дополнительные списки или массивы. Обработанные данные вывести на экран.

Модифицировать программу для работы с кольцевым двусвязным списком и протестировать ее работу.

Сравнить реализации обоих списков и сделать выводы.
Таблица 1 - Индивидуальные задания к лабораторной работе №2

№ варианта

Обработка

2

Упорядочить элементы списка по возрастанию

Блок-схемы алгоритмов.



Рисунок 1. Блок-схема основной программы



Рисунок 2. Блок-схема инициализации списка с 1 узлом и данными параметра а



Рисунок 3. Блок-схема добавления элемента в конец списка



Рисунок 4. Блок-схема добавления элемента в начало списка



Рисунок 5. Блок-схема вывода списка на экран



Рисунок 6. Блок-схема вывода списка на экан в обратном порядке



Рисунок 7. Блок-схема добавления элемента в указанную позицию



Рисунок 8. Блок-схема удаления элемента из указанной позиции



Рисунок 9. Блок-схема изменения элемента в указанной позиции



Рисунок 10. Блок-схема сортировки списка

Текст программы.
#include

#include

#include

#include

#include
using namespace std;
// Статическая структура, описывающая узел списка

typedef struct list

{

int info;

struct list* next;

struct list* prev;

};
typedef list* LLink; // тип данных: указатель на элемент

LLink Head = NULL;
// Функция инициализации списка с 1 узлом и данными параметра а

list* init(int a)

{

list* lst = new list;

lst->info = a;

lst->next = NULL;

lst->prev = NULL;

Head = lst;

return Head;

}
// Функция добавления элемента в конец списка

void add_tail(list* lst, int item)

{

if (lst == NULL)

lst = init(item);

else

{

list* tmp = lst;

while (tmp->next != NULL) tmp = tmp->next;

list* p = new list;

tmp->next = p;

p->info = item;

p->next = NULL;

p->prev = tmp;

}

}
// Функция добавления элемента в начало списка

void add_head(list* lst, int item)

{

list* p = new list;

p->next = lst;

lst->prev = p;

lst = p;

p->info = item;

p->prev = NULL;

Head = lst;

}
// Функция вывода списка на консоль

void printlist(list* lst)

{

list* p = lst;

wcout << L"LIST:" << endl;

while (p!= NULL)

{

wcout << (*p).info << L" ";

p = (*p).next;

}

wcout << endl;

}
// Функция вывода списка в обратном порядке на консоль

void printlist_rev(list* lst)

{

list* p = lst;

wcout << L"LIST:" << endl;

while (p->next!= NULL) p = (*p).next;

while (p->prev!= NULL)

{

wcout << (*p).info << L" ";

p = (*p).prev;

}

wcout << (*p).info << L" ";

wcout << endl;

}
// Функция добавления элемента в указанную позицию

void add_pos(list* lst, int pos, int item)

{

list* p = lst;

if (pos <= 0)

{

wcout << L"В указанную позицию вставить элемент не возможно" << endl;

return;

}

else if (pos == 1)

{

add_head(lst, item);

return;

}

else

{

for (int i=1; i < pos-1; i++)

{

if (p->next == NULL)

{

add_tail(lst, item);

return;

}

else

{

p = p->next;

}

}

list* s = new list;

s->info = item;

p->next->prev = s;

s->next = p->next;

p->next = s;

s->prev = p;

p = p->next;

}

}
// Функция удаления элемента из указанной позиции

void del_pos(list* lst, int pos)

{

list* p = lst;

if (pos <= 0)

{

wcout << L"Указанной позиции не существует" << endl;

return;

}

else if (pos == 1)

{

Head = p->next;

return;

}

else

{

for (int i = 1; i < pos; i++)

{

if (p->next == NULL)

{

wcout << L"Указанной позиции не существует" << endl;

return;

}

else

{

p = p->next;

}
}

p->prev->next = p->next;

}

}
// Функция изменения элемента в указанной позиции

void edit_pos(list* lst, int pos, int item)

{

list* p = lst;

if (pos <= 0)

{

wcout << L"В указанной позиции нет элемента" << endl;

return;

}

else if (pos == 1)

{

p->info = item;

return;

}

else

{

for (int i = 1; i < pos; i++)

{

if (p->next == NULL)

{

wcout << L"В указанной позиции нет элемента" << endl;

return;

}

else

{

p = p->next;

}
}

p->info = item;

}

}
// Функция сортировки списка

void sort(list* lst)

{

LLink curr;

int tmp;

curr = lst->next;

while (curr) {

tmp = curr->info;

LLink prv = curr->prev;

while (prv != NULL && tmp < prv->info)

{

prv->next->info = prv->info;

prv = prv->prev;

}

if (prv == NULL) lst->info = tmp;

else prv->next->info = tmp;

curr = curr->next;

}

}

int main()

{

wcout.imbue(locale("rus_rus.866"));

int Num; //число ряда

list* lst = new list;

for (int i = 1; i <= 10; i++) //ввод чисел ряда в список

{

wcout << L"Введите " << i << L"-е число: ";

wcin >> Num;

add_tail(Head, Num); //добавление в список новых чисел

}

wcout << L"Вывод списка: " << endl;

printlist(Head); //вывод списка в консоль

wcout << L"Вывод списка в обратном порядке: ";

printlist_rev(Head); //вывод списка в обратном порядке в консоль

wcout << L"Введите число для добавления в начало списка: ";

wcin >> Num;

add_head(Head, Num); //добавление в начало списка нового числа

wcout << L"Вывод списка: " << endl;

printlist(Head); //вывод списка в консоль

int pos;

wcout << L"Введите позицию списка для добавления: ";

wcin >> pos;

wcout << L"Введите число: ";

wcin >> Num;

add_pos(Head, pos, Num); //добавление в выбранную позицию списка нового числа

wcout << L"Вывод списка: " << endl;

printlist(Head); //вывод списка в консоль

wcout << L"Введите позицию списка для удаления: ";

wcin >> pos;

del_pos(Head, pos); //удаление числа из позиции в списке

wcout << L"Вывод списка: " << endl;

printlist(Head); //вывод списка в консоль

wcout << L"Введите позицию списка для изменения: ";

wcin >> pos;

wcout << L"Введите число: ";

wcin >> Num;

edit_pos(Head, pos, Num); //изменение числа в выбранной позиции списка

wcout << L"Вывод списка: " << endl;

printlist(Head); //вывод списка в консоль

sort(Head); //сортировка списка

wcout << L"Вывод списка после сортировки: " << endl;

printlist(Head); //вывод списка в консоль

char ch = _getch(); //ожидание нажатия любой клавиши

}

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



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


написать администратору сайта