сортировка односвязного списка C++

240
27 апреля 2018, 14:13

помогите, пожалуйста, с сортировкой односвязного списка. есть структура студент, формат фамилия_имя_отчество_возраст_успеваемость. нужно сделать сортировку по фамилии. ниже прикреплю свою неудачную попытку, саму структуру и небольшой кусок программы.

struct student
{
 string name;
 string surname;
 string middlename;
 float progress;
 int age;
 struct student* next;  
 };
struct list {
 student st;
 list *next;
 };
void Print(list *b)
  {
    list *print = b;
    while (print != NULL)
{
    std::cout << print->st.surname << " " << print->st.name << " "
    << print->st.middlename << " " << print->st.age << " "       
    << print->st.progress << endl;
    print = print->next;
}
std::cout << "NULL\n";
}
 void sort(list **begin)
 {
  list *t = new list;
  list *t2 = *begin;
  t = *begin;      
    while (t != 0)
    {
            list *t1 = t->next;
        if (t1->st.surname < t2->st.surname)
        {
            list *tmp = t2;
            t2 = t1;
            t = t2;
        }
        t = t->next;
}
}
int main()
 {
  setlocale(LC_ALL, "Russian");
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
  forward_list <student> st;
  list* begin = NULL;
  list* head = nullptr;
  list* item = nullptr;
   for (;;) {
    int x = menu();
    switch (x) {
    case 1:
    {
        Print(begin);
        break;
    }
    case 8:
    {
        sort(&begin);
        break;
    }
Answer 1

Итак, у вас есть: структура с именем студента. То что вы именовали list - это не список. Вообще вы как то странно поступили: создали этот list, его передаете в функцию сортировки, но при этом список создаете из структур student. Короче будем считать, что список это:

forward_list <student> st;

Что вам нужно, чтобы его отсортировать? Для начала нужно его наполнить, но это чисто ваша ответственность.

1) Операция больше или меньше для структур типа student.С этим вообще никаких проблем, так как это зависит только от имени, а имя определено как string, для которого уже есть эти операции

bool operator>(student &a, student &b)
{
    return a.name > b.name;
}

2) Нужна функция сортировки. Для этого, в самом простом варианте, просто проходите список от начала до конца и сравниваете два рядом стоящих элемента, если первый больше, чем второй (для этого и нужна операция >), то меняете их местами. И так несколько раз, пока весь список не будет отсортирован.

READ ALSO
Проблема передачи указателя на строку

Проблема передачи указателя на строку

Передаю _TCHAR указатель в функцию

158
Решить С++ срочно надо [требует правки]

Решить С++ срочно надо [требует правки]

Решите пожалуйста 1)Дан двумерный массивПоменять местами вторую и четвертую строки 2)Все элементы массива, сумма индексов которых нечетна,...

162
Где в Linux взять таймер вызывающий события?

Где в Linux взять таймер вызывающий события?

Мне понадобился таймер который по истечению какого то времени вызывает событие, например std::functionВ Win32 API и в C# я очень часто использовал такие...

179
Оформить в виде класса

Оформить в виде класса

Помогите переделать програмку, чтобы она была оформлена как 3 файла - maincpp, class

172