Как отсортировать односвязный список

399
20 марта 2018, 01:56
#include "stdafx.h"
#include <iostream>
#include <locale.h>
#include <conio.h>
#include <windows.h>
using namespace std;

struct Sotrudnik {
    char secondname[20], firstname[20], position[20];
    int year = 0, yearpos = 0;
    Sotrudnik *next;
};
Sotrudnik *head = 0;  //адрес головы списка
Sotrudnik *current, *checkyear;
int main()
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    char c;
    cout << "Ввести данные о субъекте? Y/y - чтобы запустить.";
    c = _getche();
    //формирование списка с клавиатуры
    while (c == 'y' || c == 'Y')
    {
        if (head) //если добавляется не первый элемент списка
        {
            current->next = new Sotrudnik; /*выделяем память под новый элемент списка и заносим его адрес в поле next текущего (последнего на данный момент) элемента списка*/
            current = current->next; /* текущим объявляем вновь созданный элемент */
        }
        else //если добавляем первый элемент в список
        {
            head = new Sotrudnik; /* выделяем память под новый элемент списка и заносим его адрес в переменную head */
            current = head;  /* первый элемент списка объявляем текущим */
        }
        system("cls");
        cout << "\nВведите данные о субъекте:\n";
        cout << "Фамилия:" << endl;
        cin >> current->secondname;
        cout << "Имя:" << endl;
        cin >> current->firstname;
        cout << "Год:" << endl;
        cin >> current->year;
        cout << "Введите год для проверки:" << endl;
        cin >> current->yearpos;
        cout << "Введите должность:" << endl;
        cin >> current->position;
        current->next = 0;
        cout << "Ввести данные о еще одном субъекте?";
        c = _getche();
    }
    if (head)//если список не пуст
    {
        system("cls");
        cout << "Список введенных субъектов:\n";
        current = head;
        while (current != 0)
        {
            cout << "Фамилия:" << current->secondname << endl << "Имя:" << current->firstname << endl << "Год: " << current->year << endl << "Год для проверки:" << current->yearpos << endl << "Должность: " << current->position << endl;
            current = current->next;
        }
        _getch();
        cout << endl;
        int check = 0;
        cout << "Сортировка: введите \n 0 - чтобы отсортировать по именам, \n 1 - чтобы отсортировать по фамилиии,\n 2 - чтобы отсортировать по годам\n > ";
        cin >> check;
        cout << "Вы ввели" << check << endl;
        switch (check)
        {
        case 0:
            sortfirstname(head);
            break;
        case 1:
            sortsecondname(head);
            break;
        case 2:
            sortyear(head);
            break;
        default:
            cerr << "Введите корректное число.";
            break;
        }
        // Удаление  из списка информацию о тех сотрудниках, которые были приняты на работу позже заданного года
        current = head;
        checkyear = head;
        while (current != 0)
        {
        if (current->year>current->yearpos)
        checkyear = current;
        current = current->next;
        }
        if (checkyear != head)
        {
        current = head;
        while (current->next = checkyear)
        current = current->next;
        current->next = checkyear->next;
        }
        else {
        head = checkyear->next;
        }
        delete checkyear;
        current = head;
        while (current != 0)
        {
            cout << "Фамилия:" << current->secondname << endl << "Имя:" << current->firstname << endl << "Год: " << current->year << endl << "Год для проверки:" << current->yearpos << endl << "Должность: " << current->position << endl;
            current = current->next;
        }
        _getch();
        return 0;
    }
}

Подскажите как отсортировать список по имени, фамилии и году

Answer 1

Для сортировки сразу по нескольким полям создай у каждого элемента списка новую переменную типо int forSorting = 0, затем тебе нужно определиться с приоритетом сортировки(по какому полю нужно сортировать в первую очередь), потом придумываешь с-му коэффициентов, согласно которой прибавляешь значения в свою переменную.(Например сортируем по по минутам и секундам (22 мин 43 сек)--> forSorting = 22*60 +43, если бы было ещё какое-то поле, по которому нужно сортировать, но приоритет его меньше чем у секунд, то максимальное значение данного поля не должно превышать 1), и потом просто сравниваешь forSorting у всех полей, перестраиваешь свой список

Answer 2

Надо написать собственную функцию сравнения и передать указатель на нее в параметрах методу .sort(). Хороший пример приведен в www.cplusplus.com/reference/list/list/sort/index.html

READ ALSO
g++.exe fatal error no input files compilation terminated codelite КАК ИСПРАВИТЬ

g++.exe fatal error no input files compilation terminated codelite КАК ИСПРАВИТЬ

Захотел научиться программировать на C++Скачал CodeLite, создал workspace, new project и скопировал текст программы "Hellow world!" в новый файл

204
программная реализация функции atoi

программная реализация функции atoi

в теме по ссылке Реализация функции atoi для меня кое что неясно: зачем от текущей ячейки s[i] отнимать символ '0'? И можно ли фильтр содержимого...

250
c++ how to multisets? [требует правки]

c++ how to multisets? [требует правки]

c++ how to get multiset which is the difference of two others multisets?

184
QValidator для QLineEdit

QValidator для QLineEdit

Какие нужно сделать условия, чтобы в виджете QLineEdit при написании текста, а затем при нажатии на кнопку принятия ("ОК"), были подходящими только...

214