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

    @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;
    }
    Ответ написан
    Комментировать
  • После того как нашел совпадениев Json, как мне его удалить?

    @Feor_slen
    file1.clear - очистит вашу переменную от данных взятых из файла
    Ответ написан
  • Как добавить перенос строки?

    @Feor_slen
    Малоопытный кодер глаголит, что можно сделать так:
    my_str = "Lorem Ipsum Lorem Ipsum"
    perenos = 15
    perenos1 = []
    for i in my_str:
        perenos1.append(i)
    perenos1.insert(perenos,'\n')
    my_str = ''.join(perenos1)
    print(my_str)
    Ответ написан
  • Не работает оператор условия в функции с return, как исправить?

    @Feor_slen Автор вопроса
    понял где ошибся:

    if exit == 0:
        num.pop()
        return num
    else:
        return terra(num)
    Ответ написан
    Комментировать