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

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

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

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Третий день пытаюсь понять как мне отсортировать сведения структуры, упорядоченные по какому-либо критерию.
Допустим стоит задача отсортировать по годам. Не понимаю как мне сравнивать между собой элементы списка. Тут же нет такого как в обычной структуре, например, 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)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.06.2018, 17:16
Ответы с готовыми решениями:

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

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

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

10
Заблокирован
17.06.2018, 17:36
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
Можешь делать как в Java: копируешь сначала всё в массив, сортируешь массив, и копируешь обратно
0
0 / 0 / 1
Регистрация: 22.02.2018
Сообщений: 31
19.06.2018, 03:25  [ТС]
Есть два варианта, которые почти работают, но не до конца.

Первый работает и сортирует, но только два элемента, т.к. там нет обмена значений:
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Эксперт С++
 Аватар для TheCalligrapher
12935 / 6802 / 1821
Регистрация: 18.10.2014
Сообщений: 17,214
19.06.2018, 04:06
Цитата Сообщение от Newbie_MTF Посмотреть сообщение
Не понимаю как мне сравнивать между собой элементы списка.
"Сортировка списка" может подразумевать два принципиально/фундаментально различных действия:

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

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

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

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

Добавлено через 5 минут
Это локальная переменная, и если ты пытаешься обратиться к ней из вне функции в которой она объявлена то не получится , объяви её как глобальную.
0
 Аватар для Геомеханик
838 / 641 / 940
Регистрация: 26.06.2015
Сообщений: 1,409
19.06.2018, 18:01
Лучший ответ Сообщение было отмечено 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
Цитата Сообщение от axela002 Посмотреть сообщение
Если речь пойдет о производительности ПП , то твой вариант затратит много времени на лишние действия
Разумеется. Поэтому я знатно прифигел, когда увидел этот код в исходниках Java 8.
0
0 / 1 / 0
Регистрация: 26.04.2018
Сообщений: 20
20.06.2018, 23:33
Может я чего то не понимаю ? Но что мешает отсортировать список обычным пузырьком. Например я пару дней назад писал курсовую и там отсортировал список по определенному параметру именно старым добрым пузырьком.

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

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  [ТС]
Цитата Сообщение от _falcon_9 Посмотреть сообщение
Но что мешает отсортировать список обычным пузырьком.
То что для работы с блоками, по типу списка, нужно менять их адреса при сортировке, а не доставать данные из них и менять их местами.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.06.2018, 11:56
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru