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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
kalina18
1 / 1 / 0
Регистрация: 06.05.2012
Сообщений: 11
#1

Двусвязный список, сортировка путём включения минимальных в новый список - C++

06.11.2013, 01:49. Просмотров 270. Ответов 0
Метки нет (Все метки)

Здравствуйте.
Задача формируется так:

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


Написал следующий код, который правилен "орфографически", но выкидывает при выполнении. ВЫкидывает во время выолнения именно удаления, то есть этой строки:
C++
1
node_delete ( head_old, tail_old, point );
, которая ссылается на соответствующую функцию.


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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include<iostream>
using namespace std;
 
struct NODE 
{
    int value;
    NODE *next, *prev;
};
typedef NODE *PNODE;
 
 
PNODE create_node (int value)
{
    PNODE node_new = new NODE; 
    node_new->prev = NULL;
    node_new->next = NULL;
    node_new->value = value; 
    
    return node_new;
}
 
 
void add_first(PNODE &head, PNODE &tail, PNODE node_new)
{
    node_new->next = head;
    node_new->prev = NULL;
    if ( head ) 
        head->prev = node_new;
    head = node_new;
    if ( ! tail ) 
        tail = head; 
}
 
 
void add_last(PNODE &head, PNODE &tail, PNODE node_new)
{
    node_new->prev = tail;
    node_new->next = NULL;
    if ( tail ) 
        tail->next = node_new;
    tail = node_new;
    if ( ! head )
        head = tail; 
}
 
 
void add_after (PNODE &head, PNODE &tail, PNODE p, PNODE node_new)
{
    if ( ! p->next )
        add_last (head, tail, node_new); 
    else 
    {
    node_new->next = p->next;
    node_new->prev = p;
    p->next->prev = node_new; 
    p->next = node_new;
    }
}
 
 
void add_before (PNODE &head, PNODE &tail, PNODE p, PNODE node_new)
{
    if ( ! p->prev )
        add_first (head, tail, node_new); 
    else 
    {
        node_new->prev = p->prev; 
        node_new->next = p;
        p->prev->next = node_new; 
        p->prev = node_new;
    }
}
 
void node_delete(PNODE &head, PNODE &tail, PNODE node_delete)
{
    if (head == node_delete)
    {
        head = node_delete->next; 
        if ( head )
            head->prev = NULL;
        else 
            tail = NULL; 
    }
    else 
    {
        node_delete->prev->next = node_delete->next;
        if ( node_delete->next )
            node_delete->next->prev = node_delete->prev;
        else 
            tail = NULL; 
    }
    delete node_delete;
}
 
PNODE find_min (PNODE head)
{
    PNODE q = head, m = head;
    while ( q )
    {
        if (q->value < m->value)
            m = q;
        q = q->next;
    }
    return m;
}
 
 
 
int main()
{
    int i {}, value {}, n{};
    PNODE head_old = NULL, tail_old = NULL, point = NULL;
    PNODE head_new = NULL, tail_new = NULL;
    for (i = 0; i < 5; i++)
    {
        cin >> value;
        point = create_node ( value );
        add_first ( head_old, tail_old, point);
        ++n;
    }
 
    for ( i = 0; i < n; i++)
    {
 
        point = find_min ( head_old );
        add_first ( head_new, tail_new, point );
        node_delete ( head_old, tail_old, point );
    }
    point = head_new;
    while ( point )
    {
        cout << point->value;
        point = point->next;
    }
    return 0;
}
Спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.11.2013, 01:49     Двусвязный список, сортировка путём включения минимальных в новый список
Посмотрите здесь:

C++ двусвязный динамический список
Двусвязный кольцевой список C++
C++ Двусвязный список из структур
Циклический двусвязный список C++
Переделать на Двусвязный список C++
Кольцевой двусвязный список C++
Линейный Двусвязный список! C++
C++ Циклический двусвязный список
C++ Создать двусвязный список
C++ Двусвязный список. Загрузка, сохранение в файл, сортировка по вводимому параметру
C++ Двусвязный линейный список
Двусвязный список с методами C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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