Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/25: Рейтинг темы: голосов - 25, средняя оценка - 4.56
 Аватар для WilFred
31 / 26 / 17
Регистрация: 11.03.2012
Сообщений: 71

Сортировка односвязного циклического списка (Прямым включением)

24.01.2014, 11:46. Показов 4691. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем
Мне требуется отсортировать односвязный циклический список, методом: прямое включение.
Суть сортировки я понимаю, массив отсортирую, но вот с односвязным списком не выходит...
Может кто знает как решить данную задачу?)
Заранее спасибо)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.01.2014, 11:46
Ответы с готовыми решениями:

Создание односвязного циклического списка
Структура есть: struct Node { int item; Node*next; }; Как создать вершину и как потом в цикле создавать...

Сортировка односвязного списка
Доброго времени суток. Третий день пытаюсь понять как мне отсортировать сведения структуры, упорядоченные по какому-либо критерию. ...

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

6
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
24.01.2014, 12:08
Если цикличность списка не принципиальна, что вполне допустимо:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <algorithm>
#include <iostream>
#include <functional>
#include <list>
#include <iterator>
typedef std::list<int>::iterator lst_iterator;
int main()
{
    const int N = 10;
    int array[N] = {15, 17, 9, 6, 10, 2, 5, 11, 35, 21};
    std::list<int> lst(&array[0], &array[N]);
    std::copy(lst.begin(), lst.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
    lst_iterator iter = lst.begin();
    while(++iter != lst.end()) {
        lst_iterator iter_temp = std::find_if(lst.begin(), iter, std::bind2nd(std::greater<int>(), *iter));
        if (iter_temp != iter)
            lst.splice(iter_temp, lst, iter);
    }
    std::copy(lst.begin(), lst.end(), std::ostream_iterator<int>(std::cout, " "));
    return 0;
}
0
 Аватар для WilFred
31 / 26 / 17
Регистрация: 11.03.2012
Сообщений: 71
24.01.2014, 12:13  [ТС]
Цикличность принципиальна, в этом то вся проблема
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
24.01.2014, 12:18
Цитата Сообщение от WilFred Посмотреть сообщение
Цикличность принципиальна, в этом то вся проблема
Да нет никакой проблемы. Граничные элементы простого списка указывают в NULL. У циклического друг на друга. Алгоритм от этого не измениться. Всего лишь нужно использовать адаптер для списка и перегрузить некоторые методы связанные с вставкой и удалением элементов, а лучше написать свой вариант цикличекского списка. Он у вас есть?
0
 Аватар для WilFred
31 / 26 / 17
Регистрация: 11.03.2012
Сообщений: 71
24.01.2014, 12:30  [ТС]
Да, список я писал сам...
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
24.01.2014, 12:46
Ну так в чем проблема? Либо адаптируйте алгоритм сами, либо выкладывайте свои наработки. Впрочем с этого и стоило начать...

Добавлено через 12 минут
Изучаю заголовочники. Наткнулся на вот этот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
      /**
       *  Returns a read/write iterator that points to the first element in the
       *  %list.  Iteration is done in ordinary element order.
       */
     iterator
      begin()
      { return this->_M_impl._M_node._M_next; }
 
 
      /**
       *  Returns a read/write iterator that points one past the last
       *  element in the %list.  Iteration is done in ordinary element
       *  order.
       */
      iterator
      end() { return &this->_M_impl._M_node; }
Другими словами контейнер list циклический. Действительно если инкрементировать указтель на end то придем к первому элементу списка:
C++
1
2
3
4
5
     iter = lst.end();
    ++iter;
    std::cout << std::endl;
    std::cout << *lst.begin() << std::endl;
    std::cout << *iter << std::endl;
Результат для массива выше:
2
2

Не по теме:

Что день грядущий нам готовит узнать поможет гороскоп:scratch:.

0
 Аватар для WilFred
31 / 26 / 17
Регистрация: 11.03.2012
Сообщений: 71
24.01.2014, 13:51  [ТС]
Список должен быть реализован свой.
Вот класс
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
class CXD
{
public:
    String numb;     // номер
    String datzak;   // дата заключения
    String datzav;   // дата завершения
    String temadog;  // тема
    String namorg;   // наименование организации
    String priznak;  // признак
    String stoimost; // стоимость в тыс руб.
    CXD* next;      // следующий элемент списка
 
    // Конструктор
    CXD(String n, String dzk, String dzv, String td,
        String no, String pr, String st, CXD* t)
    {
        numb = n;
        datzak = dzk;
        datzav = dzv;
        temadog = td;
        namorg = no;
        priznak = pr;
        stoimost = st;
        next = t;
    }
    // Конструктор
    CXD()
    {
        numb = 0;
        datzak = 0;
        datzav = 0;
        temadog = 0;
        namorg = 0;
        priznak = 0;
        stoimost = 0;
        next = NULL;
    }
};
Сортирую так(через чур мудрёно, пытаюсь как-то проще сделать):
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
XD b = x;
    for(int i=0; i<n; i++)
    {
        if(StrToInt(b->numb) >= StrToInt(b->next->numb))
        {
            int j=0;
            XD a = b->next;
            b->next = b->next->next;
            b=x;
            for(; StrToInt(a->numb) >= StrToInt(b->numb) && StrToInt(a->numb) >= StrToInt(b->next->numb); j++)
                b=b->next;
            if(j==0)
            {   for(int q=0; q<n-j-1; q++)
                    b=b->next;
                a->next = b->next;
                b->next = a;
                for(int q=0; q<=i; q++)
                    b=b->next;
                for(int q=0; q<n; q++)
                    x=x->next;
            }
            else
            {
                a->next = b->next;
                b->next = a;
                for(int q=0; q < j-2; q++)
                    b=b->next;
            }
        }
        b = b->next;
    }
n - кол-во элементов в списке, x - сам список, объявлен глобально...
P.S. не всегда сортирует правильно...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.01.2014, 13:51
Помогаю со студенческими работами здесь

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

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

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

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

Сортировка односвязного списка символов
я понимаю как создавать, как заполнять, но как его сортировать я хз :(


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru