@Feor_slen

Как за одну итерацию в односвязном списке вернуть три последних добавленных элемента?

//функция класса List, односвязного списка по факту. Задача функции вернуть строку из последних трех 
//добавленных элементов
	string maliy_spisok() {
		string second_name;
		Node* node = head;
 // Node это собственно элементы списка (класс), внутри число и фамилия. Число отражает порядок 
//добавления. Сам список отсортирован по фамилиям. 
		int matrix[3];
		string names[3];
		matrix[0] = 0;
		matrix[1] = 0;
		matrix[2] = 0;

		while (node != NULL ) {
			if (node->indetefic > matrix[0]) {
				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]) {
				matrix[2] = matrix[1];
				names[2] = names[1];

				names[1] = node->data;
				matrix[1] = node->indetefic;
			}
			else if (node->indetefic > matrix[2]) {
				names[2] = node->data;
				matrix[2] = node->indetefic;

			}
			node = node->next;
		}
		second_name = names[0] + " " + names[1] + " " + names[2] + " ";
		return second_name;

	}

};


Я только начал изучать с++, и поэтому ошибка может быть на поверхности но мне не удается понять... Функция должна вернуть три имени с самыми крупными индетефикаторами а возвращает с самыми маленькими.

Пояснение безобразия:
Я создал две матрицы и по ходу цикла while, перебирая элементы списка List должен динамически менять их по следующему правилу:
Если номер индетефикатора элемента больше чем записанный в [n] то тогда мы сдвигаем эелемент n дальше на один порядок а на место n ставим текущий индетефикатор паралельно меняя массив names записывая туда имена присущие индетификаторам
  • Вопрос задан
  • 100 просмотров
Решения вопроса 1
@Feor_slen Автор вопроса
Полный код:
#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;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы