- •Журнал лабороторних робіт з дисципліни: Алгоритми і структури данних
- •Лабораторна робота №1
- •Питання до захисту :
- •Лабораторна робота №2 «Робота з чергою та стеком»
- •Лабораторна робота №3 «Розробка програми створення зв'язаного списку»
- •Лабораторна робота №4
- •Лабораторна робота №6 «Бінарне дерево пошуку»
- •Питання до захисту :
- •Лабораторна робота №5 «Побудова рекурсивних функцій»
- •Питання до захисту :
- •Питання до захисту :
- •Лабораторна робота №7 «Реалізація алгоритмів обмінних сортувань»
Лабораторна робота №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 операції додавання у список,операція що показує головний елемент.
В яких випадках раціональне використання зв’язних списків?
Відповідь: у випадках, коли елементи массиву мають зв’язок між собою (список усіх груп зі студентами одного потоку)
Роботу виконав Роботу перевірив
Богословський В. Манєва Р. І.
Задніпровський В.
