Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Звіт
з лабораторної роботи № 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;
}