Форум программистов, компьютерный форум CyberForum.ru

Как сделать сортировку по узлам в односвязном списке? - C++

Восстановить пароль Регистрация
 
DenKG
0 / 0 / 0
Регистрация: 23.12.2015
Сообщений: 138
23.11.2016, 20:44     Как сделать сортировку по узлам в односвязном списке? #1
Есть задача: отсортировать узлы по возрастанию в односвязном списке. Есть код, но при его выполнении вылетает ошибка:
Вызвано исключение по адресу 0x00BC29C1 в ConsoleApplication6.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x00000000.

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

Сам код:
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
if (head != NULL) {
        Node *cur = new Node;
        Node *g;
        Node *pred;
        Node *b;
 
        for (int i = 0; i < valcount; i++) {
            pred = head;
            cur = head->next;
            if (pred->item < cur->item) {
                g = pred;
                b = cur->next;
                pred = pred->next;
                g->next = b;
                pred->next = g;
                head = pred;
            }
            pred = head;
            cur = head->next;
            for (int j = 0; j < valcount - 2; j++) {
                if (cur->next->item > cur->item) {
                    g = cur;
                    b = cur->next->next;
                    pred->next = cur->next;
                    cur = pred->next;
                    g->next = b;
                    cur->next = g;
                }
                pred = pred->next;
                cur = cur->next;
            }
        }
        cur->next = NULL;
    }
Думаю, еще понадобится код заполнения списка:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for (int i = 0; i < size; i++)
        {
            Node *pv = new Node;
                if (head == NULL) {
                pv->next = NULL;
                head = pv;
                pred = pv; valcount++;
                }
                else {
                pv->next = head->next;
                pv->next = head;
                head = pv;
                valcount++;
                }
            cin >> pv->item;
            valcount++;
        }
Добавлено через 1 час 0 минут
Неужели никто не знает, как сделать?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nimazzzy
 Аватар для nimazzzy
370 / 326 / 92
Регистрация: 29.03.2016
Сообщений: 1,077
Завершенные тесты: 1
23.11.2016, 20:49     Как сделать сортировку по узлам в односвязном списке? #2
Цитата Сообщение от DenKG Посмотреть сообщение
Неужели никто не знает, как сделать?
Никто не хочет анализировать твой код. Его даже скомпилировать и прогнать нельзя, потому что он не полный. Неужели так сложно воспользоваться дебаггером?
DenKG
0 / 0 / 0
Регистрация: 23.12.2015
Сообщений: 138
23.11.2016, 20:56  [ТС]     Как сделать сортировку по узлам в односвязном списке? #3
Цитата Сообщение от nimazzzy Посмотреть сообщение
Никто не хочет анализировать твой код. Его даже скомпилировать и прогнать нельзя, потому что он не полный. Неужели так сложно воспользоваться дебаггером?
Если бы я мог так исправить ошибку, то я бы сюда не обращался.
nimazzzy
 Аватар для nimazzzy
370 / 326 / 92
Регистрация: 29.03.2016
Сообщений: 1,077
Завершенные тесты: 1
23.11.2016, 21:06     Как сделать сортировку по узлам в односвязном списке? #4
Сделай сначала так, чтобы твой код заработал, когда у тебя в списке хотя бы один элемент. В твоем коде cur при сортировке станет указывать на NULL после
cur = head->next;

Зачем выделять память под ноду для cur, если ты потом его на другой объект меняешь?
Что делают две подряд такие строчки?
Цитата Сообщение от DenKG Посмотреть сообщение
pv->next = head->next;
pv->next = head;
zer0mail
24.11.2016, 08:50
  #5

Не по теме:

Цитата Сообщение от DenKG Посмотреть сообщение
Если бы я мог так исправить ошибку, то я бы сюда не обращался.
Если не можешь освоить дебаггер, забудь С++, как страшный сон.

Bretbas
22 / 17 / 1
Регистрация: 05.08.2013
Сообщений: 468
Завершенные тесты: 1
24.11.2016, 09:14     Как сделать сортировку по узлам в односвязном списке? #6
DenKG, STL нельзя использовать? Зачем велосипед делать?
Или это задача из школы/колледжа/института?
DenKG
0 / 0 / 0
Регистрация: 23.12.2015
Сообщений: 138
24.11.2016, 09:20  [ТС]     Как сделать сортировку по узлам в односвязном списке? #7
Институт
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2016, 09:58     Как сделать сортировку по узлам в односвязном списке?
Еще ссылки по теме:

Ошибка в односвязном списке C++
Удаление по ключу в односвязном списке C++
Удаление повторяющихся элементов в односвязном списке C++

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

Или воспользуйтесь поиском по форуму:
_Scorpius_
46 / 46 / 23
Регистрация: 01.04.2015
Сообщений: 102
24.11.2016, 09:58     Как сделать сортировку по узлам в односвязном списке? #8
Функции работы со списком:
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
struct node
{
    int   value;
    node* next;
};
 
// добавить элемент в список
node* AddNode(node *lst, int val)
{
    node* newHead = new node;
    newHead->value = val;
    newHead->next = lst;
    return newHead;
}
 
// удалить элемент из списка
node* DeleteNode(node *lst)
{
    if (lst && lst->next)
    {
        node* tail = lst;
        while(tail->next->next != NULL)
            tail = tail->next;
        delete tail->next;
        tail->next = NULL;
    }
    else
    {
        delete lst;
        lst = NULL;
    }
    return lst;
}
 
// сортировать список
void SortList(node *lst)
{
    int tmpValue = 0;
    node *tmpList_0 = lst;
    node *tmpList_1;
    while(tmpList_0)
    {
        tmpList_1 = tmpList_0->next;
        while(tmpList_1)
        {
            if(tmpList_1->value > tmpList_0->value)
            {
                tmpValue = tmpList_0->value;
                tmpList_0->value = tmpList_1->value;
                tmpList_1->value = tmpValue;
            }
            tmpList_1 = tmpList_1->next;
        }
        tmpList_0 = tmpList_0->next;
    }
}
 
// просмотр списка
void ViewList(const node *lst)
{
    while(lst)
    {
        std::cout << lst->value << ' ';
        lst = lst->next;
    }
}
Yandex
Объявления
24.11.2016, 09:58     Как сделать сортировку по узлам в односвязном списке?
Ответ Создать тему
Опции темы

Текущее время: 07:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru