Лабораторна робота №6 Програмування, ч3

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
СІ
Кафедра:
Не вказано

Інформація про роботу

Рік:
2017
Тип роботи:
Лабораторна робота
Предмет:
Програмування алгоритмів цифрової обробки сигналів та зображень

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти і науки України Національний університет „Львівська політехніка” Звіт з лабораторної роботи № 6 з дисципліни: “Структури даних та алгоритми» На тему: “ Структура даних СПИСОК” Варіант 4 1. МЕТА РОБОТИ Вивчення фундаментальної абстрактної структури даних список. Набуття практичних навичок побудови списка, дослідження динаміки його вмісту та використання списків для розв'язання прикладних задач. 2. ЗАВДАННЯ 2.1 Постановка задачі Побудувати динамічну структуру даних список, реалізований за допомогою зв’язаних вузлів. Написати програму, яка будує лінійний зв’язаний список, що містить N випадкових цілих чисел з проміжку [111 ; 222] і вилучає з нього кожний другий елемент. 2.2 Алгоритм розв’язання задачі 2.2.1 Створюю новий проект C++ в середовищі розробки Visual Studio 2017 2.2.2 Моделюю список за допомогою зв’язаних вузлів, переписуючи основні операції роботи зі списком: void pushFront(DblLinkedList *list, void *data) //Додавання до голови void* popFront(DblLinkedList *list) //Видалення з голови void pushBack(DblLinkedList *list, void *value) //Додавання в кінець void* popBack(DblLinkedList *list) //Видалення з кінця Node* getNth(DblLinkedList *list, size_t index) //Повернення n-го елемента void insert(DblLinkedList *list, size_t index, void *value) //Додавання вузла void* deleteNth(DblLinkedList *list, size_t index) //Видалення вузла void printDblLinkedList(DblLinkedList *list, void(*fun)(void*))//Вивід списка void printInt(void *value) 2.2.3 Виконую індивідуальне завдання згідно з варіантом; 2.2.4 Закінчую створення програми та перевіряю правильність її виконання. 2.3 Результати виконання програми / Рис 2.3 Результат виконання програми ВИСНОВКИ Під час виконання лабораторної роботи я набув практичних навичок побудови списка, дослідив динаміку його вмісту та використання списка для розв'язання прикладних задач. ДОДАТКИ Файл plist.h #pragma once #include "stdafx.h" #include <iostream> using namespace std; typedef struct _Node { void *value; struct _Node *next; struct _Node *prev; } Node; typedef struct _DblLinkedList { size_t size; Node *head; Node *tail; } DblLinkedList; //Екземпляр структури DblLinkedList* createDblLinkedList() { DblLinkedList *tmp = (DblLinkedList*)malloc(sizeof(DblLinkedList)); tmp->size = 0; tmp->head = tmp->tail = NULL; return tmp; } //Видалення списку void deleteDblLinkedList(DblLinkedList **list) { Node *tmp = (*list)->head; Node *next = NULL; while (tmp) { next = tmp->next; free(tmp); tmp = next; } free(*list); (*list) = NULL; } //Додавання до голови void pushFront(DblLinkedList *list, void *data) { Node *tmp = (Node*)malloc(sizeof(Node)); if (tmp == NULL) { exit(1); } tmp->value = data; tmp->next = list->head; tmp->prev = NULL; if (list->head) { list->head->prev = tmp; } list->head = tmp; if (list->tail == NULL) { list->tail = tmp; } list->size++; } //Видалення з голови void* popFront(DblLinkedList *list) { Node *prev; void *tmp; if (list->head == NULL) { exit(2); } prev = list->head; list->head = list->head->next; if (list->head) { list->head->prev = NULL; } if (prev == list->tail) { list->tail = NULL; } tmp = prev->value; free(prev); list->size--; return tmp; } //Додавання в кінець void pushBack(DblLinkedList *list, void *value) { Node *tmp = (Node*)malloc(sizeof(Node)); if (tmp == NULL) { exit(3); } tmp->value = value; tmp->next = NULL; tmp->prev = list->tail; if (list->tail) { list->tail->next = tmp; } list->tail = tmp; if (list->head == NULL) { list->head = tmp; } list->size++; } //Видалення з кінця void* popBack(DblLinkedList *list) { Node *next; void *tmp; if (list->tail == NULL) { exit(4); } next = list->tail; list->tail = list->tail->prev; if (list->tail) { list->tail->next = NULL; } if (next == list->head) { list->head = NULL; } tmp = next->value; free(next); list->size--; return tmp; } //Повернення n-го елемента Node* getNth(DblLinkedList *list, size_t index) { Node *tmp = list->head; size_t i = 0; while (tmp && i < index) { tmp = tmp->next; i++; } return tmp; } Node* getNthq(DblLinkedList *list, size_t index) { Node *tmp = NULL; size_t i; if (index < list->size / 2) { i = 0; tmp = list->head; while (tmp && i < index) { tmp = tmp->next; i++; } } else { i = list->size - 1; tmp = list->tail; while (tmp && i > index) { tmp = tmp->prev; i--; } } return tmp; } //Додавання вузла void insert(DblLinkedList *list, size_t index, void *value) { Node *elm = NULL; Node *ins = NULL; elm = getNth(list, index); if (elm == NULL) { exit(5); } ins = (Node*)malloc(sizeof(Node)); ins->value = value; ins->prev = elm; ins->next = elm->next; if (elm->next) { elm->next->prev = ins; } elm->next = ins; if (!elm->prev) { list->head = elm; } if (!elm->next) { list->tail = elm; } list->size++; } //Видалення вузла void* deleteNth(DblLinkedList *list, size_t index) { Node *elm = NULL; void *tmp = NULL; elm = getNth(list, index); if (elm == NULL) { exit(5); } if (elm->prev) { elm->prev->next = elm->next; } if (elm->next) { elm->next->prev = elm->prev; } tmp = elm->value; if (!elm->prev) { list->head = elm->next; } if (!elm->next) { list->tail = elm->prev; } free(elm); list->size--; return tmp; } //Вивід списка void printDblLinkedList(DblLinkedList *list, void(*fun)(void*)) { Node *tmp = list->head; while (tmp) { fun(tmp->value); tmp = tmp->next; } printf("\n"); } void printInt(void *value) { printf("%d ", *((int*)value)); } //Створення списка з масиву DblLinkedList* fromArray(void *arr, size_t n, size_t size) { DblLinkedList *tmp = NULL; size_t i = 0; if (arr == NULL) { exit(7); } tmp = createDblLinkedList(); while (i < n) { pushBack(tmp, ((char*)arr + i*size)); i++; } return tmp; } Файл lab6.cpp #include "stdafx.h" #include <iostream> #include "plist.h" using namespace std; void RemoveEach2stElement(DblLinkedList *list, int size) { int *tmp_arr = new int[size]; for (int i=0; i<size;i++) { tmp_arr[i] = *((int*)(getNthq(list, i))->value); } cout << endl; for (int i = 0; i < size; i++) { popBack(list); } for (int i=0; i<size; i=i+2) { pushBack(list, &tmp_arr[i]); } cout << "Removing each 2st element:" << endl;; printDblLinkedList(list, printInt); delete[] tmp_arr; } int main() { DblLinkedList *list = createDblLinkedList(); cout << "Enter size:"; int size; cin >> size; cout << endl; int *arr = new int[size]; for (int i=0; i< size; i++) { arr[i] = rand()%112+111; pushBack(list, &arr[i]); } cout << "New list:" << endl; printDblLinkedList(list, printInt); RemoveEach2stElement(list, size); delete[] arr; system ("pause"); return 0; }
Антиботан аватар за замовчуванням

28.05.2019 18:05-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!