Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <iomanip>
- #include <string>
- #include <list>
- struct Student
- {
- std::string name;
- std::string group;
- unsigned short book;
- unsigned short marks[4];
- };
- struct ListNode
- {
- Student s; // Значение
- ListNode *prev = nullptr; // Линковка
- ListNode *next = nullptr;
- };
- // Меняет местами значения вершин
- void swap(ListNode &l, ListNode &r)
- {
- // Избегаем излешнее копирование
- Student s = std::move(l.s);
- l.s = std::move(r.s);
- r.s = std::move(s);
- }
- // Сортировка (прямой выбор)
- void sort(ListNode *start)
- {
- // Своеобразный цикл для обхода списка
- for (ListNode *current = start; current != nullptr; current = current->next) {
- ListNode *minimum = current; // Минимум - текущий элемент
- for (ListNode *inside = current; inside != nullptr; inside = inside->next) {
- if (inside->s.name < minimum->s.name) {
- minimum = inside; // Меньше минимума? Меняем
- }
- }
- if (minimum != current) { // Менять элемент на себя бессмысленно
- swap(*minimum, *current);
- }
- }
- }
- int main()
- {
- ListNode *currentNode = nullptr; // Текущая вершина
- size_t n; // Размер списка
- std::cout << "Enter amount of students: ";
- std::cin >> n;
- for (size_t i = 0; i < n; i++) { // Обход
- if (currentNode == nullptr) { // Если нет вершины
- currentNode = new ListNode; // Создаем
- } else {
- auto newNode = new ListNode; // Создаем новую вершину
- currentNode->next = newNode; // Линковка
- newNode->prev = currentNode;
- currentNode = newNode;
- }
- Student &s = currentNode->s; // Ссылка на текущ студента
- std::cin.ignore(); // Костыль
- std::cout << "[S " << std::setw(3) << i << "] Name : ";
- std::getline(std::cin, s.name); // Ввод
- std::cout << "[S " << std::setw(3) << i << "] Group : ";
- std::getline(std::cin, s.group);
- std::cout << "[S " << std::setw(3) << i << "] Book : ";
- std::cin >> s.book;
- for (size_t j = 0; j < 4; j++) {
- std::cout << "[S " << std::setw(3) << i
- << "] Mark(" << j << "): ";
- std::cin >> s.marks[j];
- }
- }
- // Отходим назад
- while (currentNode && currentNode->prev) {
- currentNode = currentNode->prev;
- }
- sort(currentNode); // Сортируем
- // Своеобразный цикл для обхода списка
- for (ListNode *current = currentNode; current != nullptr; current = current->next) {
- static size_t counter = 0; // Счетчик
- std::cout << "[S " << std::setw(3) << counter
- << "] Name : " << current->s.name
- << std::endl;
- std::cout << "[S " << std::setw(3) << counter
- << "] Group : " << current->s.group
- << std::endl;
- std::cout << "[S " << std::setw(3) << counter
- << "] Book : " << current->s.book
- << std::endl;
- for (size_t j = 0; j < 4; j++)
- std::cout << "[S " << std::setw(3) << counter
- << "] Mark(" << j << "): "
- << current->s.marks[j] << std::endl;
- counter++;
- }
- // Своеобразный цикл для обхода списка
- for (ListNode *current = currentNode; current != nullptr; current = current->next) {
- if (current->prev != nullptr) {
- delete current->prev; // Очистка памяти
- }
- currentNode = current; // Двигаем основную вершину в конец
- }
- delete currentNode; // Удаляем
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement