Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/35: Рейтинг темы: голосов - 35, средняя оценка - 4.94
29 / 29 / 5
Регистрация: 21.04.2012
Сообщений: 282

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

24.11.2012, 21:25. Показов 7387. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется список двусвязный кольцевой:
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
class List
{
    class Entry
    {
        public int m_value;
        public Entry m_next;
        public Entry m_prev;
    }
 
    int m_count;
    Entry m_head;
 
    public bool IsEmpty()
    {
        return (m_count == 0);
    }
 
    public void PushHead(int v)             //Add the item to the head
    {
        Entry t = new Entry();
        t.m_value = v;
 
        if (IsEmpty())
        {
            m_head = t;
            m_head.m_prev = m_head.m_next = t;
        }
        else
        {
            var tail = m_head.m_next;
            t.m_next = m_head;
            t.m_prev = tail;
 
            tail.m_next = t;
            m_head.m_prev = t;
            m_head = t;
        }
        m_count++;
    }
public int PopTail()                       //Extract the item from the tail
    {
        if (IsEmpty())
            return 0;
 
        var tail = m_head.m_prev;
        var tail2 = tail.m_prev;
 
        tail2.m_next = m_head;
        m_head.m_prev = tail.m_prev;
 
        m_count--;
 
        return tail.m_value;
    }
public void PrintUpDown()                       //Print from Up to Down
    {
        if (IsEmpty()) 
            return;
 
        Entry t = m_head;
        do
        {
            Console.WriteLine(t.m_value + " ");
            t = t.m_next;
        } while (t != m_head);
    }
}
нужно реализовать его сортировку. На Википедии написано что надо пройтись как по односвязному, используя только next, а потом расставить prev. Но там странный кусок кода какой-то. Разъсните пожалуйста как сделать-то грамотно
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.11.2012, 21:25
Ответы с готовыми решениями:

Сортировка двусвязного списка структур
доброго времени суток:) столкнулся со следующей проблемой: не знаю, как сортировать двусвязный список структур(LinkedList<str> link =...

Как удалить из двусвязного списка?
Создал двусвязный список объектов класса. Добавил 10 объектов и нужно реализовать удаление из списка. Например, у меня есть 10 наименований...

Вопросы по реализации двусвязного списка
class DoubleList<T>:IEnumerable<T>, IEnumerator<T> { class ListItem<T> { public ListItem<T> Previous { get;...

4
0 / 0 / 0
Регистрация: 24.11.2012
Сообщений: 11
25.11.2012, 00:32
Как вариант - сначала сделать обычный массив из содержимого списка, отсортировать, а потом из полученного сортированного массива сделать двусвязный список.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
25.11.2012, 00:42
Rabbit13245, у меня есть код на дельфи, он правда сложный ( на 50 строк используется 13 указателей, то есть ссылочных типов), зато сортировка довольно быстрая (дело в том, что по условию нельзя было использовать других мест для хранения, кроме самого списка).
Насчет пройтись по отсортированному, чтобы восстановить обратную связь - это легко
C#
1
2
for(var p = head; p != tail; p = p.Next)
   p.Next.Prev = p;
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
26.11.2012, 10: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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public void Sort()
{
    if (m_head == null) return;
 
    int sublistSize = 1;
    int mergeCount;
 
    Entry head = m_head;
    do {
        var firstList = head;
        var origin = head;
        head = null;
        Entry tail = null;
 
        mergeCount = 0;
        while (firstList != null) {
            mergeCount++;
            var secondList = firstList;
            int firstListSize = 0;
            for (int i = 0; i < sublistSize && secondList != null; i++) {
                firstListSize++;
                secondList = secondList.m_next == origin ? null : secondList.m_next;
            }
 
            var secondListSize = sublistSize;
            while (firstListSize > 0 || (secondListSize > 0 && secondList != null)) {
                Entry current;
                if (firstListSize != 0 && ((secondListSize == 0 || secondList == null) || firstList.m_value < secondList.m_value)) {
                    current = firstList; firstList = firstList.m_next; firstListSize--;
                    if (firstList == origin) firstList = null;
                }
                else {
                    current = secondList; secondList = secondList.m_next; secondListSize--;
                    if (secondList == origin) secondList = null;
                }
 
                if (tail != null)
                    tail.m_next = current;
                else
                    head = current;
 
                current.m_prev = tail;
                tail = current;
            }
            firstList = secondList;
        }
        tail.m_next = head;
        head.m_prev = tail;
        sublistSize *= 2;
    } while (mergeCount > 1);
    m_head = head;
}
И у вас ошибка на 31-й строке: вместо var tail = m_head.m_next должно быть var tail = m_head.m_prev
1
29 / 29 / 5
Регистрация: 21.04.2012
Сообщений: 282
26.11.2012, 21:06  [ТС]
Да. Спасибо. Ошибку уже потом сам нашел. Я написал сортировку пузырем. Вашу сейчас разберу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.11.2012, 21:06
Помогаю со студенческими работами здесь

Enumerator для элемента двусвязного списка
Вроде ничего сложного или заработался уже. Ну в общем. Есть элемент public class Node&lt;T&gt; //where T : class { ...

IComparable для сортировки двусвязного списка
Как отсортировать с помощью IComparable? using System; using System.Collections.Generic; using System.Linq; using...

Метод для вывода двусвязного списка с конца
Подскажите, пожалуйста, как в двусвязном списке написать метод(через Reverse) для вывода списка с конца? Буду очень благодарна за помощь.

Добавление узла в начало двусвязного кольцевого списка
public AddFirst(T value) { Node2&lt;T&gt; node = new Node2&lt;T&gt;(value); if (Count == 0) { Tail = node; node.Next =...

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru