Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ASD.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
204 Кб
Скачать
☆

Лабораторна робота №3 «Розробка програми створення зв'язаного списку»

Завдання: Необхідно створити зв'язаний список із записів, що містять відомості про автомобілі, а також реалізувати операції зі зв'язаним списком: запис першим у списку, видалення першого об'єкта зі списку, перегляд усього списку, видалення об'єкта, наступного за вказаним.

Код программи:

#include <iostream>

#include <conio.h>

#include <string>

using namespace std;

struct Cars {

int id;

char *brend; // Марка автомобиля (максимально - 50 символов). Функция Input

char *model; // Модель автомобиля (максимально - 50 символов). Функция Input

char *speed; // Скорость автомобиля (максимально - 10 символов). Функция Input

char *price; // Цена автомобиля (максимально - 10 символов). Функция Input

Cars *next;

} *begin;

struct command {

int id;

char *cmd;

};

command key[5] = {

{ 0, "create" },

{ 1, "show" },

{ 2, "addbegin" },

{ 3, "delete" },

{ 4, "exit" }

};

int n = NULL;

//void menu1(); //  Меню

void menu();

void newNode(Cars **begin, int n); //Новый список

void publ(Cars *pointer); //Публикация списка

void Input(Cars *pointer, bool begin, int num); // Ввод для списка. true - begin; num 1 - name; num 2 - model

void addBegin(Cars *pointer); // Добавить в начало списка--------

void delNode(Cars **pointer);//----------

void Free(Cars * pointer);

void main() {

setlocale(LC_ALL, "Rus");

menu();

}

void menu() {

cout << "Список команд: " << endl;

cout << "create\t\t Создать список\n";

cout << "show\t\t Показать список\n";

cout << "addbegin\t Добавить в начало списка\n";

cout << "delete\t\t Удаление э-та по ID\n";

cout << "exit\t\t Выйти из программы\n";

cout << endl << "Введите пожалуйста команду: ";

char temp[10];

cin.getline(temp, 10);

int keys;

for (int i = 0; i < 5; i++)

{

if (!strcmp(key[i].cmd, temp))

keys = key[i].id;

}

switch (keys) {

case 0:

{

system("cls");

cout << "Введите количество эл-тов: ";

cin >> ::n;

newNode(&::begin, n);

system("cls");

cout << "Список успешно создан" << endl << endl;

menu();

break;

}

case 1:

{

publ(::begin);

cout << endl;

menu();

break;

}

case 2:

{

addBegin(::begin);

menu();

break;

}

case 3:

{

system("cls");

delNode(&::begin);

menu();

break;

}

case 4:

{

exit(0);

break;

}

default: {

system("cls");

cout << "Команда \"" << temp << "\" неизвестна системе" << endl << endl;

menu();

break;

}

}

_getch();

}

void Free(Cars *pointer) {

if (!pointer)

return;

Cars *p;

while (pointer) {

p = pointer;

pointer = pointer->next;

delete p;

}

}

void newNode(Cars **begin, int n) {

system("cls");

(*begin) = new Cars;

(*begin)->id = 1;

Input((*begin), true, 0);

(*begin)->next = NULL;

Cars *end = (*begin);

for (int i = 2; i <= n; i++)

{

end->next = new Cars;

end = end->next;

end->id = i;

Input(end, false, 0);

end->next = NULL;

}

}

void publ(Cars * pointer) {

system("cls");

if (!pointer) {

cout << "Сначала создайте односвязный список." << endl;

return;

}

while (pointer)

{

cout << "ID cars[" << pointer->id << "]: " << pointer->brend << "\n" << pointer->model << "\n" << pointer->speed << "\n" << pointer->price << "\n";

pointer = pointer->next;

}

}

void Input(Cars *pointer, bool begin, int num) {// true - begin; num 0 - name; num 1 - description

if (!num && begin) { // Имя и begin

cout << "Введите бренд машины: ";

pointer->brend = new char[50];

pointer->model = new char[50];

pointer->speed = new char[10];

pointer->price = new char[10];

cin.get();

cin.getline(pointer->brend, 50);

cout << "Введите модель машины: ";

cin.getline(pointer->model, 50);

cout << "Введите скорость машины: ";

cin.getline(pointer->speed, 10);

cout << "Введите цена машины: ";

cin.getline(pointer->price, 10);

}

else if (!num && !begin) { // Имя и не begin

cout << "Введите бренд машины: ";

pointer->brend = new char[50];

pointer->model = new char[50];

pointer->speed = new char[10];

pointer->price = new char[10];

cout << "Введите бренд машины: ";

cin.getline(pointer->brend, 50);

cout << "Введите модель машины: ";

cin.getline(pointer->model, 50);

cout << "Введите скорость машины: ";

cin.getline(pointer->speed, 10);

cout << "Введите цена машины: ";

cin.getline(pointer->price, 10);

}

}

void addBegin(Cars *pointer)

{

system("cls");

if (!pointer) {

cout << "Сначала создайте односвязный список.\n";

return;

}

Cars *temp = new Cars;

temp->brend = pointer->brend;

temp->model = pointer->model;

temp->speed = pointer->speed;

temp->price = pointer->price;

temp->id = pointer->id;

temp->next = pointer->next;

pointer->id = temp->id - 1;

Input(pointer, true, 0);

pointer->next = temp;

n += 1;

cout << "В начало списка добавлен новый эл-т списка - ID[" << ::begin->id << "]" << endl << endl;

}

void delNode(Cars **pointer) {

if (!(*pointer)) {

cout << "Сначала создайте односвязный список.\n";

return;

};

int id;

cout << "Какой элемент списка удалить? "; cin >> id;

Cars *temp = (*pointer);

if (temp->id == id)

{

::begin = ::begin->next;

delete temp;

n -= 1;

cout << "Элемент [" << id << "] успешно удалён" << endl << endl;

cin.get();

return;

}

Cars *temp1 = temp->next;

while (temp1) {

if (temp1->id == id)

{

temp->next = temp1->next;

delete temp1;

n -= 1;

system("cls");

cout << "Элемент [" << id << "] успешно удалён" << endl << endl;

cin.get();

return;

}

else {

temp = temp1;

temp1 = temp1->next;

} // else

} // while

}

Вивід:

Створеного списку:

Додаток елемента у початок списку:

Видалення елемента зі списку:

Питання до захисту

Особливості зв’язаного списку.

Відповідь: Гнучкість зв’язаного списку, порядок елементів зв'язкового списку може не збігатися з порядком розташування елементів даних в пам'яті комп'ютера , а порядок обходу списку завжди явно задається його внутрішніми зв'язками.

Основні операції зі зв’язними списками.

Відповідь: перевірка на пустоти, 3 операції додавання у список,операція що показує головний елемент.

В яких випадках раціональне використання зв’язних списків?

Відповідь: у випадках, коли елементи массиву мають зв’язок між собою (список усіх груп зі студентами одного потоку)

Роботу виконав Роботу перевірив

Богословський В. Манєва Р. І.

Задніпровський В.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]