Выдренко_ЛР7. Лабораторная работа 7 Линейный односвязный список По дисциплине Основы алгоритмизации и программирования
Скачать 63.56 Kb.
|
Министерство образования Республики Беларусь Учреждение образования «Полоцкий государственный университет» Факультет информационных технологий Кафедра технологии программирования Лабораторная работа №7 Линейный односвязный список По дисциплине «Основы алгоритмизации и программирования» Выполнил: Выдренко Е.О. Группа 19-МС Проверил: Данченко Е.В. Новополоцк 2020 г. Тема: Модульное программирование Цель: изучить методы организации списочных структур в динамической памяти. Реализовать алгоритмы добавления, удаления и сортировки списков. Ход работы Создание односвязного линейного списка с выполнением поставленной задачи, а именно: функция добавления, удаления, смещения, вставки элемента на определённую позицию в списке. Решение Листинг #include #include #include #include using namespace std; // переменная ошибок int listOneError; // описание исключительных ситуаций const int listOneOK = 0; const int listOneEmpty = 1; const int listOneNoMem = 2; const int listOneEnd = 3; struct element { double data; element* link; }; struct ListOne { element* start; element* ptr; }; int isEmptyListOne(ListOne* L) { if (!L->start->link) { listOneError = listOneEmpty; return 1; } return 0; } void initListOne(ListOne* L) { L->start = (element*)malloc(sizeof(element)); if (!L->start) { listOneError = listOneNoMem; return; } L->ptr = L->start; L->ptr->link = NULL; } void putListOne(ListOne* L, double E) { element* temp = (element*)malloc(sizeof(element)); if (!L->start) { listOneError = listOneNoMem; return; } temp->data = E; temp->link = L->ptr->link; L->ptr->link = temp; } void getListOne(ListOne* L, double* E) { if (isEmptyListOne(L)) return; if (!L->ptr->link) { listOneError = listOneEnd; return; } element* pntr = L->ptr->link; L->ptr->link = pntr->link; *E = pntr->data; pntr->link = NULL; free(pntr); } void printListOne(ListOne* L) { element* tmp; tmp = L->start->link; while (tmp != NULL) { cout << "\t" << tmp->data; tmp = tmp->link; } free(tmp); } void movePtrListOne(ListOne* L) { if (!L->ptr->link) { listOneError = listOneEnd; return; } L->ptr = L->ptr->link; } void beginPtrListOne(ListOne* L) { L->ptr = L->start; } void endPtrListOne(ListOne* L) { while (L->ptr->link) movePtrListOne(L); } void doneListOne(ListOne* L) { beginPtrListOne(L); double temp; while (!isEmptyListOne(L)) getListOne(L, &temp); free((void*)L->ptr); } void vstavka(ListOne* L, double i, double x) { beginPtrListOne(L); for (int j = 0; j < i - 1; j++) { movePtrListOne(L); } putListOne(L, x); beginPtrListOne(L); } int main(void) { SetConsoleCP(1251); SetConsoleOutputCP(1251); ListOne* List = (ListOne*)malloc(0); initListOne(List); putListOne(List, 1); putListOne(List, 2); putListOne(List, 3); putListOne(List, 4); putListOne(List, 5); cout << "Список после добавления элементов:" << endl; printListOne(List); double i = 0; movePtrListOne(List); getListOne(List, &i); cout << "\n"; system("PAUSE"); cout << endl << "После смещения удалён элемент: " << i << endl; printListOne(List); movePtrListOne(List); movePtrListOne(List); getListOne(List, &i); cout << "\n"; system("PAUSE"); cout << endl << "После ещё двух смещений удалён элемент: " << i << endl; printListOne(List); beginPtrListOne(List); cout << "\n"; system("PAUSE"); cout << endl << "Первый элемент: " << List->ptr->link->data << endl; printListOne(List); endPtrListOne(List); cout << "\n"; system("PAUSE"); cout << endl << "Последний элемент: " << List->ptr->data << endl; printListOne(List); cout << "\n"; cout << "Вставка Элемента 7 на третью позицию" << endl; vstavka(List, 3, 7); printListOne(List); doneListOne(List); cout << "\n"; return 0; } Тесты Вывод: изучил методы организации списочных структур в динамической памяти. Реализовал алгоритмы добавления, удаления и сортировки списков. |