Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СА_МВ_ДЗ_ЛР_1.doc
Скачиваний:
4
Добавлен:
01.07.2025
Размер:
432.13 Кб
Скачать

Порядок виконання роботи

  1. Вивчити теоретичні відомості.

  2. За індивідуальним завданням (таблиця 1) розробити програму.

  3. Одержати результати роботи.

  4. Оформити звіт.

  5. Підготуватися до захисту лабораторної роботи.

Звіт повинен містити

  1. Прізвище, ім'я, по батькові та групу студента.

  2. Номер і назву роботи.

  3. Ціль роботи.

  4. Індивідуальне завдання.

  5. Текст програми.

  6. Результати роботи програми.

  7. Виводи.

Таблиця 1 – Індивідуальні завдання

Вид динамічної структури

Реалізовані функції

Список однозв‘язний лінійний

Створення, видалення, додавання

Список однозв‘язний лінійний

Створення, видалення, вставка

Список однозв‘язний лінійний

Створення, видалення, пошук за індексом

Список однозв‘язний лінійний

Створення, видалення, пошук за значенням

Список однозв‘язний лінійний

Створення, видалення, сортування

Список двузв‘язний

Створення, видалення, додавання

Список двузв‘язний

Створення, видалення, вставка

Список двузв‘язний

Створення, видалення, пошук за індексом

Список двузв‘язний

Створення, видалення, пошук за значенням

Список двузв‘язний

Створення, видалення, сортування

Список однозв‘язний кільцевий

Створення, видалення, додавання

Список однозв‘язний кільцевий

Створення, видалення, вставка

Список однозв‘язний кільцевий

Створення, видалення, пошук за індексом

Список однозв‘язний кільцевий

Створення, видалення, пошук за значенням

Список однозв‘язний кільцевий

Створення, видалення, сортування

Список двузв‘язний кільцевий

Створення, видалення, додавання

Список двузв‘язний кільцевий

Створення, видалення, вставка

Список двузв‘язний кільцевий

Створення, видалення, пошук за індексом

Список двузв‘язний кільцевий

Створення, видалення, пошук за значенням

Список двузв‘язний кільцевий

Створення, видалення, сортування

Контрольні питання для підготовки та самостійної роботи

  1. Які структури даних можна назвати динамічними?

  2. Які елементи повинні перебувати в структурі для побудови динамічної структури даних?

  3. Яким чином структури зв‘язуються між собою?

  4. Які типові динамічної структури даних існують?

  5. Які принципи роботи з даними реалізують типові динамічні структури даних?

  6. Які функції можуть використовуватися для роботи з типовими динамічними структурами даних?

  7. Як динамічно виділяється пам‘ять для нових структур?

  8. Як звільняється пам’ять при знищенні структури (елемента динамічної структури даних)?

  9. У чому відмінність між списками та стеками?

  10. Для чого використовують неповні оголошення структур?

Приклад реалізації програми для роботи з динамічною структурою даних:

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <string.h>

#include <alloc.h>

class TItem { // Базовий клас елементів списку

public:

int data; // Дані, що зберігаються у вузлі

int ind; // Індекс елемента

TItem *next; // Покажчик на наступний елемент

TItem(); // Конструктор

~TItem();// Деструктор};

class TList { // Клас список

TItem *ent; // Покажчик на точку входу в список

public:

int count; // Кількість елементів списку

TItem *cur; // Покажчик на поточний елемент списку

virtual void append(void); // Додати елемент у кінець списку

virtual void add(void); // Додати елемент після поточного елемента

virtual void del(void); // Видалити поточний елемент

virtual void clear(void); // Видалити зі списку всі елементи

virtual void last(void); // Встановити поточним останній елемент списку

virtual void first(void); // Встановити поточним перший елемент списку

virtual void next(void); // Встановити поточним наступний елемент списку

virtual void prior(void); // Встановити поточним попередній елемент списку

virtual void seek(int i); // Перемістити покажчик на заданий елемент списку

virtual void PersonalJob() /* Метод, що реалізує дії зі списком у відповідності з завданням*/

TList(); //Конструктор

~TList(); //Деструктор};

int main(void){

TList l;

for (int i=0;i<=5;i++){ l.add(); *l[i] = 10 - i; } //Ініціалізація списку

l.sort(); l.first(); //Виконання необхідних дій

for (i=0;i<=l.count-1;i++) {printf("%d%d\n",i,l[i]->data);l.next(); } //Вивід

return(0); }

//Реалізація класу TItem

TItem::TItem(void) { data = 0; next=NULL }

TItem::~TItem(void){}

//Реалізація класу TList

TList::TList() { count = 0; ent = NULL; cur = NULL; }

TList::~TList() { clear(); }

void TList::append(void){ last(); add(); }

void TList::add(void)

{ if (ent == NULL) { // Якщо в списку немає елементів

ent = new TItem; ent->next = ent; cur = ent;

} else { TItem *it;

it = new TItem; it->next = cur->next; cur->next = it; cur = it; }

cur->ind = count; count++; }

void TList::del(void) {

if (count > 0) {

if (cur->next == ent && cur == ent) { // Якщо в списку всього 1 елемент

delete cur;

} else {

if (cur->next == ent) { TItem *tmp;

tmp = cur->next; memcpy(cur, tmp, sizeof(TItem));

delete tmp; ent = cur;

} else { TItem *tmp; tmp = cur->next;

memcpy(cur, tmp, sizeof(TItem)); delete tmp; }

} count-і; } }

void TList::clear(void){ while (count > 0) { del(); } }

void TList::first(void) { if (count > 0) { cur = ent; } }

void TList::last(void) {

if (count > 0) { // Якщо в списку є елементи

while (cur->next != ent) {// Останній елемент указує на точку входу

next(); } } }

void TList::next(void) { if (count > 0) { cur = cur->next; } }

void TList::prior(void) {

if (count > 0) { TItem *tmp = cur; while (cur->next != tmp) next(); } }

void TList::seek(int i) { if (i > 0) { for (int k=1;k<=i;k++) next(); }

else { if (i < 0) { for (int k=1;k<=((-1)*i);k++) prior(); } } }

void TList::PersonalJob() {/*Реалізація методу за індивідуальним завданням*/}