Полный код:
#include <iostream>
#include <string>
using namespace std;
// односвязный список
class Node { //это отдельный объект односвязного списка
public:
string data; //определим тип
Node* next;
int indetefic = 5000;
public:
Node(string data, int indetefic) { //создадим конструктор на вход которого подадим данные
this->data = data; //приравняем data класса к переданным в конструктор данным
this->next = NULL;
this->indetefic = this->indetefic + indetefic;
}
};
class List {
public:
Node* head, * tail;
public:
List() { //при инициализации ссылка и на голову и на хвост списка это ничего, потому как список путс
this->head = this->tail = NULL;
}
~List() { // разработка деструктора же более сложкая, так как он предотвращая утечку памяти должен удалить все элементы списка
while (head != NULL)pop_front();
}
void add_front(Node* node) {
node->next = head;
head = node;
}
void pop_front() {
if (head == NULL) {
return;
}
if (head == tail) {
delete tail;
head = tail = NULL;
return;
}
Node* node = head; //ставим стрелочку на объект
head = node->next; //передвигаем основную ссылку указателя через класс Node
delete node; //удаляем объект сохраняя цепочку целой
}
int pervenstvo_bukvi(char _new, char data) {
setlocale(LC_ALL, "RU");
// если новый элемент стоит в алфавите до
if (int(_new) < int(data)) {
return 1;
};
// если новый элемент стоит в алфавите после
if (int(_new) > int(data)) {
return -1;
};
//Если элементы одинаковые
if (int(_new) == int(data)) {
return 0;
};
}
void Add(string data, int iteration) {
setlocale(LC_ALL, "RU");
Node* node = new Node(data, iteration);
if (head == NULL) { //нулевая итерация
head = tail = node;
}
else {
Node* _for_iteration = head;
Node* pred_el = head;
for (int i = 0; i < iteration; i++) {
int n = pervenstvo_bukvi(data[0], _for_iteration->data[0]);
if (n == 0) { //если буквы равны
if (data == _for_iteration->data) {
cout << "Element ne dobavlen, naideno sovpadenie" << _for_iteration->data << _for_iteration->indetefic << endl;
return;
}
n = pervenstvo_bukvi(data[1], _for_iteration->data[1]);
}
if (n == -1) { //если буква нового имени стоит позже в алфавите чем текущий контейнер
pred_el = _for_iteration;
_for_iteration = _for_iteration->next;
}
if (n == 1) { // если буква в алфавите нового контейнера раньше чем проверяемого
if (_for_iteration == head) {
add_front(node);
return;
}
else {
node->next = _for_iteration;
pred_el->next = node;
return;
}
}
if (pred_el->next == NULL) {
pred_el->next = node;
tail = node;
return;
}
}
}
}
int poisk_po_imeny(bool del, string surname) {
setlocale(LC_ALL, "RU");
Node* node = head;
Node* pred_el = tail;
int n = 0;
while (node != NULL) {
if (surname == node->data) {
n = 1;
if (del == false) {
cout << "Po vashemy zaprosy " << node->data << node->indetefic << endl;
}
else {
if (node == head) {
pop_front();
return 1;
if (head == NULL) {
cout << "Список пуст" << endl;
}
}
else {
pred_el->next = node->next;
delete node;
}
}
}
pred_el = node;
node = node->next;
}
if (n == 0) {
cout << "Takih netu" << endl;
}
}
void prosmotr() {
int n = 0;
Node* node = head;
while (node != NULL)
{
cout << node->data << node->indetefic << endl;
node = node->next;
n = 1;
}
if (n == 0 && head != NULL) {
cout << node->data << node->indetefic << endl;
}
}
string maliy_spisok() {
string second_name;
Node* node = head;
int matrix[3];
string names[3];
matrix[0] = 0;
matrix[1] = 0;
matrix[2] = 0;
while (node != NULL) {
if (node->indetefic > matrix[0]) {
cout << "Первое условие";
matrix[2] = matrix[1];
names[2] = names[1];
matrix[1] = matrix[0];
names[1] = names[0];
names[0] = node->data;
matrix[0] = node->indetefic;
}
else if (node->indetefic > matrix[1]) {
cout << "Второе условие";
matrix[2] = matrix[1];
names[2] = names[1];
matrix[1] = node->indetefic;
names[1] = node->data;
}
else if (node->indetefic > matrix[2]) {
cout << "Третье условие";
matrix[2] = node->indetefic;
names[2] = node->data;
}
cout << matrix[0] << " " << matrix[1] << " " << matrix[2] << endl;
//cout << names[0] << " " << names[1] << " " << names[2] << endl;
node = node->next;
}
second_name = names[2] + " " + names[1] + " " + names[0] + " ";
cout << second_name;
return second_name;
}
};
int main() {
setlocale(LC_ALL, "RU");
List list;
List litle_list;
int k = 0;
int for_menu = 0;
int iteration = 0;
string data;
string str_for_litle_list;
while (for_menu != 5) {
cout << "Введите команду для списка" << endl << "1. Добавление элемента" << endl << "2. Просмотр списка" << endl << "3. Поиск по Фамилии" << endl << "4. Удаление по фамилии" << endl << "5. Окончание работы" << endl;
cout << "6. Сформировать малый список из трёх последних элементов" << endl << "7. Просмотр маленького списка" << endl;
cin >> for_menu;
if (for_menu == 1) {
cout << "Введите фамилию которую хотите добавить" << endl;
cin >> data;
list.Add(data, iteration);
iteration++;
}
else if (for_menu == 2) {
cout << "Текущие элементы:" << endl;
list.prosmotr();
}
else if (for_menu == 3) {
cout << "Введите фамилию которую ищете" << endl;
cin >> data;
list.poisk_po_imeny(false, data);
}
else if (for_menu == 4) {
cout << "Введите фамилию которую хотите удалять" << endl;
cin >> data;
list.poisk_po_imeny(true, data);
list.poisk_po_imeny(false, data);
}
else if (for_menu == 6) {
for (int i = 0; i < 4; i++) {
litle_list.pop_front();
}
str_for_litle_list = list.maliy_spisok();
int start_cut = 0;
int end_cut;
string second_name;
for (int i = 0; i < str_for_litle_list.size(); i++) {
if (str_for_litle_list[i] == ' ') {
end_cut = i;
second_name = str_for_litle_list.substr(start_cut, end_cut);
litle_list.Add(second_name, k);
k += 1;
start_cut = end_cut + 1;
}
}
}
else if (for_menu == 7) {
if (k == 0) {
cout << "Список не был сформирован";
}
else {
litle_list.prosmotr();
}
}
}
return 0;
}