С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/47: Рейтинг темы: голосов - 47, средняя оценка - 4.74
0 / 0 / 1
Регистрация: 22.02.2018
Сообщений: 31
1

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

17.06.2018, 17:16. Показов 9569. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Третий день пытаюсь понять как мне отсортировать сведения структуры, упорядоченные по какому-либо критерию.
Допустим стоит задача отсортировать по годам. Не понимаю как мне сравнивать между собой элементы списка. Тут же нет такого как в обычной структуре, например, Lib[i].year. Как сравнивать динамический список? Или ошибка в том, что я пытаюсь применить логику как для структуры, перемещая элементы?
Полазил по форуму, ничего подобного не нашел в разделе С++.
Вот последняя форма кода:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// просмотр отсортированной библиотеки
void view_node(p_Lib &head) 
{
    p_Lib p = head;
    while (p)
    {
        if ((*p).year < (*p).year)
        {
            p_Lib swap;
            strcpy_s(swap.number, (*p).number);
            // перемещение остальных элементов
 
            cout << p->number << " " << p->FIO << " " << p->name << " " << p->year << " " << p->count << endl;
        }
        p = p->next;
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.06.2018, 17:16
Ответы с готовыми решениями:

Сортировка односвязного списка
Помогите пишу курсач сделал все ф-ции кроме сортировки в голову не приходит как что не пробовал без...

Сортировка односвязного списка
Прошу сразу не ругаться ,знаю что на форуме миллион разных кодов сортировки ,но я не понимаю как их...

Сортировка односвязного списка
Как можно реализовать сортировку(быструю и пузырьковою в виде функций) структуры односвязного...

Сортировка односвязного списка
В условии задачи нужно считать из файла неопределенное количество студентов и занести их в...

10
189 / 174 / 93
Регистрация: 13.06.2018
Сообщений: 718
17.06.2018, 17:36 2
C++
1
2
3
4
5
    while (p && p->next)
    {
        p_Lib next=p->next;
        if (p->year < next->year)
        {//перекидываете содержимое
как то так
0
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
17.06.2018, 17:57 3
Можешь делать как в Java: копируешь сначала всё в массив, сортируешь массив, и копируешь обратно
0
0 / 0 / 1
Регистрация: 22.02.2018
Сообщений: 31
19.06.2018, 03:25  [ТС] 4
Есть два варианта, которые почти работают, но не до конца.

Первый работает и сортирует, но только два элемента, т.к. там нет обмена значений:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// сортировка библиотеки
void Sort(p_Lib &head)
{
    p_Lib p1 = head, p2 = nullptr;
    for (p2 = head; p2; p2 = p2->next)
    {
        for (p1 = head; p1->next; p1 = p1->next)
        {
            if (p1->year > p1->next->year)
            {
                p_Lib temp;
                strcpy_s(p1->number, p1->next->number);
                strcpy_s(p1->FIO, p1->next->FIO);
                strcpy_s(p1->name, p1->next->name);
                swap(p1->year, p1->next->year);
                swap(p1->count, p1->next->count);
 
 
            }
        }
    }
}
Второй вариант предусматривает обмен значений, но выдает ошибку:
" использована неинициализированная локальная переменная "temp" "

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// сортировка библиотеки
void Sort(p_Lib &head)
{
    p_Lib p1 = head, p2 = nullptr;
    for (p2 = head; p2; p2 = p2->next)
    {
        for (p1 = head; p1->next; p1 = p1->next)
        {
            if (p1->year > p1->next->year)
            {
                p_Lib temp;
                strcpy_s(temp->number, p1->number);
                strcpy_s(temp->FIO, p1->FIO);
                strcpy_s(temp->name, p1->name);
                swap(p1->year, p1->next->year);
                swap(p1->count, p1->next->count);
 
                strcpy_s(p1->number, p1->next->number);
                strcpy_s(p1->FIO, p1->next->FIO);
                strcpy_s(p1->name, p1->next->name);
 
                strcpy_s(p1->next->number, temp->number);
                strcpy_s(p1->next->FIO, temp->FIO);
                strcpy_s(p1->next->name, temp->name);
            }
        }
    }
}
Я объявил temp, но он его не видит, почему?
0
Вездепух
Эксперт CЭксперт С++
12792 / 6669 / 1795
Регистрация: 18.10.2014
Сообщений: 16,877
19.06.2018, 04:06 5
Цитата Сообщение от Newbie_MTF Посмотреть сообщение
Не понимаю как мне сравнивать между собой элементы списка.
"Сортировка списка" может подразумевать два принципиально/фундаментально различных действия:

1) обмен значений между элементами списка с целью достижения упорядоченности списка
2) изменение порядка сцепки элементов в списке с целью достижения упорядоченности списка

Вам сначала надо определиться, какой из способов сортировки вам нужно реализовать.

Цитата Сообщение от Newbie_MTF Посмотреть сообщение
Вот последняя форма кода:
Это попытка реализовать первый вариант. Вам точно нужно именно это?
0
0 / 0 / 1
Регистрация: 22.02.2018
Сообщений: 31
19.06.2018, 10:37  [ТС] 6
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Это попытка реализовать первый вариант. Вам точно нужно именно это?
Это потому что я пытался действовать по логике сортировки обычных массивов, уже осознал что нужно отойти от этих мыслей.
Второй вариант более привлекателен, думаю он даже более правильный, но хочу знать как реализовать оба варианта)
0
71 / 58 / 48
Регистрация: 12.03.2017
Сообщений: 563
19.06.2018, 11:22 7
Цитата Сообщение от New man Посмотреть сообщение
копируешь сначала всё в массив, сортируешь массив, и копируешь обратно
Если речь пойдет о производительности ПП , то твой вариант затратит много времени на лишние действия

Добавлено через 4 минуты
Цитата Сообщение от Newbie_MTF Посмотреть сообщение
" использована неинициализированная локальная переменная "temp" "
А что ты хотел? Ты её создал , но ничем не заполнил, и пытаешься взять данные от туда, раз там ничего нет, то и он даст тебе ошибку.

Добавлено через 5 минут
Это локальная переменная, и если ты пытаешься обратиться к ней из вне функции в которой она объявлена то не получится , объяви её как глобальную.
0
838 / 641 / 940
Регистрация: 26.06.2015
Сообщений: 1,409
19.06.2018, 18:01 8
Лучший ответ Сообщение было отмечено Newbie_MTF как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <iostream>
#include <string>
 
struct person {
    person* next;
    std::string name;
    std::string city;
    int age;
};
 
void slist_add(person*& lst, const char* name, const char* city, int age);
void slist_clear(person*& lst);
void slist_sort(person*& lst, bool (*cmp)(const person&, const person&));
void slist_print(std::ostream& _out, const person* lst);
 
bool cmp_asc(const  person& a, const person& b){ return (a.age < b.age); }
bool cmp_desc(const person& a, const person& b){ return (a.age > b.age); }
 
int main(void){
    person* lst = NULL;
    slist_add(lst, "Sveta", "Moscow", 30);
    slist_add(lst, "Petr", "Voronez", 23);
    slist_add(lst, "Stas", "Tula", 32);
    slist_add(lst, "Boris", "Omsk", 21);
    slist_add(lst, "Elena", "Saransk", 35);
    slist_add(lst, "Marina", "Tomsk", 28);
    slist_add(lst, "Oleg", "Orel", 19);
    //...
 
    std::cout << "name\tcity\tage" << std::endl << std::endl;
 
    //сортируем по возрасту(по возрастанию)
    slist_sort(lst, &cmp_asc);
    slist_print(std::cout, lst);
    std::cout << std::endl;
 
    //сортируем по возрасту(по убыванию)
    slist_sort(lst, &cmp_desc);
    slist_print(std::cout, lst);
    slist_clear(lst);
    std::cin.get();
    return 0;
}
 
//сортировка списка вставкой
void slist_sort(person*& lst, bool (*cmp)(const person&, const person&)){
    person* a, *b, *p, *h = NULL;
    for(person* i = lst; i != NULL; ) {
        a = i;
        i = i->next;
        b = h;
        for(p = NULL; (b != NULL) && (*cmp)(*b, *a); ) {
            p = b;
            b = b->next;
        }
 
        if(p == NULL){
            a->next = h;
            h       = a;
        } else {
            a->next = b;
            p->next = a;
        }
    }
    if(h != NULL)
        lst = h;    
}
 
//добавление в список
void slist_add(person*& lst, const char* name, const char* city, int age){
    person* p = new person();
    p->name   = name;
    p->city   = city;
    p->age    = age;
    p->next   = lst;
    lst = p;
}
 
//удаление всех
void slist_clear(person*& lst){
    person* p;
    while(lst != NULL){
        p   = lst;
        lst = lst->next;
        delete p;
    }
}
 
//вывод
void slist_print(std::ostream& _out, const person* lst){
    for(; lst != NULL; lst = lst->next)
        _out << lst->name << '\t' << lst->city << '\t' << lst->age << std::endl;
    _out << std::endl;
}
1
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
20.06.2018, 23:00 9
Цитата Сообщение от axela002 Посмотреть сообщение
Если речь пойдет о производительности ПП , то твой вариант затратит много времени на лишние действия
Разумеется. Поэтому я знатно прифигел, когда увидел этот код в исходниках Java 8.
0
0 / 1 / 0
Регистрация: 26.04.2018
Сообщений: 20
20.06.2018, 23:33 10
Может я чего то не понимаю ? Но что мешает отсортировать список обычным пузырьком. Например я пару дней назад писал курсовую и там отсортировал список по определенному параметру именно старым добрым пузырьком.

Вот отрывок кода:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void sortList(List* begin)
{
    if (!begin)
    {
        cout << "Список пуст." << endl;
 
        return;
    }
    List* ptrN = begin;
 
    while (ptrN->next != NULL)
    {
        List* ptr = begin;
 
        while (ptr->next != NULL)
        {
            if (ptr->crp.route_number > ptr->next->crp.route_number)
            {
                Car_park tmp = ptr->crp;
                ptr->crp = ptr->next->crp;
                ptr->next->crp = tmp;
            }
            
            ptr = ptr->next;
        }
 
        ptrN = ptrN->next;
    }
}
Если нужно посмотреть на весь код напиши.
0
0 / 0 / 1
Регистрация: 22.02.2018
Сообщений: 31
21.06.2018, 11:56  [ТС] 11
Цитата Сообщение от _falcon_9 Посмотреть сообщение
Но что мешает отсортировать список обычным пузырьком.
То что для работы с блоками, по типу списка, нужно менять их адреса при сортировке, а не доставать данные из них и менять их местами.
0
21.06.2018, 11:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.06.2018, 11:56
Помогаю со студенческими работами здесь

Сортировка односвязного списка
ребят, нужна помощь, учусь на втором курсе для зачета нужно написать сортировку односвязного...

Сортировка односвязного списка
Здравствуйте уважаемые киберфорумщики! Нужна срочная помощь!!! В общем у меня есть задача которую...

Сортировка односвязного списка
Добрый день форумчанам! Есть задача но не знаю как написать ее так как не знаю динамического...

Сортировка односвязного списка пузырьком
Сортирую список по убыванию пузырьком (он заполняется 46 случайными числами от 1 до 26) Смысл...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru