Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 20.09.2019
Сообщений: 86

Сортировка шаблонного дека

07.04.2020, 00:55. Показов 4459. Ответов 49
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер. Начал изучать шаблонные типы данных, поэтому немного трудно ориентироваться в них. Нужно сделать сортировку шаблона класса дек, но понятия не имею как это сделать. Был бы благодарен, если бы кто-то наглядно показал как.
Код:
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
#ifndef  DEQUE_H
#define DEQUE_H
 
#include <iostream>
#include "abiturient.h"
 
using namespace std;
 
template <class T> struct Node
{
    T Data;
    Node<T>* Next;
    Node<T>* Prev;
    Node(const T &data)
    {
        this->Data = data;
        Next = nullptr;
        Prev = nullptr;
    }
};
 
template <class T> 
class Deque
{
    Node<T>* head;
public:
    int size;
    Deque();
    Deque(const Deque&);
    ~Deque();
    void push_front(const T&);
    T pop_front();
    void push_back(const T&);
    T pop_back();
    const T peek();
    const bool isEmpty();
    Deque<T>& operator= (const Deque&);
    template <class U>
    friend ostream& operator<< (ostream& os, const Deque<U>& obj);
    template <class T>
    friend class Iterator;
};
 
template <class T>
Deque<T>::Deque() {
    head = NULL;
    size = 0;
}
// Конструктор копирования
template <class T>
Deque<T>::Deque(const Deque& obj)
{
    if (!obj.head)
    {
        head = new Node<T>(NULL);
    }
    head = new Node<T>(obj.head->Data);
    Node<T>* temp = obj.head->Next;
    Node<T>* pnew = 0;
    Node<T>* pold = head;
    while (temp)
    {
        pnew = new Node<T>(temp->Data);
        pnew->Prev = pold;
        pold->Next = pnew;
        pold = pnew;
        temp = temp->Next;
    }
}
template <class T>
// Деструктор
Deque<T>::~Deque()
{
    while (!isEmpty())
        pop_front();
}
 
 
template <class T>
class Iterator
{
    Deque<T>* D;
    Node<T>* current;
public:
    // Конструктор преобразования
    Iterator(Deque<T>& obj)
    {
        D = &obj;
        current = obj.head;
    }
    // Возвращает текущий объект дека без его удаления
    int peek() {
        return current->Data;
    }
    // Переходит к следующему объекту дека
    void next() {
        current = current->Next;
    }
    // Переходит к предыдущему объекту дека
    void prev() {
        current = current->Prev;
    }
    // Переходит в начало дека
    void reset() {
        current = D->head;
    }
    // Проверяет существует ли элемент
    const bool isEmptyElement() {
        if (!current)
            return true;
        else
            return false;
    }
    // Доступ к элементу по адресу
    void set(Node<T>* p = 0) {
        current = p;
    }
};
 
template <class T>
void Deque<T>::push_front(const T& data)
{
    size++;
    if (head != NULL)
    {
        Node<T>* temp = new Node<T>(data);
        temp->Next = head;
        head->Prev = temp;
        head = temp;
    }
    else
    {
        head = new Node<T>(data);
    }
}
// Удаляет и возвращает объект, находящийся в начале дека
template <class T>
T Deque<T>::pop_front()
{
    if (head)
    {
        T temp = head->Data;
        Node<T>* p = head;
        head = p->Next;
        delete[] p;
        size--;
        return temp;
    }
    else
        return NULL;
}
// Вставляет объект как нижний элемент дека
template <class T>
void Deque<T>::push_back(const T& data)
{
    size++;
    if (head != NULL)
    {
        Node<T>* tail = new Node<T>(NULL);
        for (Node<T>* i = head; i != NULL; i = i->Next) {
            if (i->Next == NULL)
                tail = i;
        }
        Node<T>* temp = new Node<T>(data);
        tail->Next = temp;
        temp->Prev = tail;
        tail = temp;
    }
    else
    {
        head = new Node<T>(data);
    }
}
// Удаляет и возвращает объект, находящийся в конце дека
template <class T>
T Deque<T>::pop_back()
{
    if (head)
    {
        Node<T>* tail = new Node<T>(NULL);
        for (Node<T>* i = head; i != NULL; i = i->Next) {
            if (i->Next == NULL)
                tail = i;
        }
        T temp = tail->Data;
        Node<T>* p = tail;
        tail = p->Prev;
        tail->Next = NULL;
        size--;
        return temp;
    }
    else
        return NULL;
}
// Возвращает объект в верхней части дека без его удаления
template <class T>
const T Deque<T>::peek()
{
    if (head)
        return head->Data;
    else
        return 0;
}
// Проверяет пуст ли дек
template <class T>
const bool Deque<T>::isEmpty() {
    return size == 0;
}
// Перегрузка оператора присваивания
template <class T>
Deque<T>& Deque<T>::operator= (const Deque& obj)
{
    if (this == &obj)
        return *this;
    if (!obj.head)
        return *this;
    head = new Node<T>(obj.head->Data);
    Node<T>* temp = obj.head->Next;
    Node<T>* pnew = 0;
    Node<T>* pold = head;
    while (temp)
    {
        pnew = new Node<T>(temp->Data);
        pnew->Prev = pold;
        pold->Next = pnew;
        pold = pnew;
        temp = temp->Next;
    }
    return *this;
}
// Перегрузка потокового оператора вывода
template <class U>
ostream& operator<<(ostream& os, const Deque<U>& obj)
{
    for (Node<U>* i = obj.head; i != NULL; i = i->Next)
        os << i->Data << " " << endl;
    return os;
}
#endif
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.04.2020, 00:55
Ответы с готовыми решениями:

Считывание элементов дека с файла и запись дека в файл
Доброго времени суток. Я написал код программы про дек с ограниченным входом слева (то есть с него можно удалять элементы как с начала,...

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

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

49
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
07.04.2020, 14:32
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от _Beginner_ Посмотреть сообщение
Компилятор не определяет Prev(идентификатор не найден), пытался через head указать, но
if (head->Data <= data)
while (p->Next && p->Next->Data < data)
0
0 / 0 / 0
Регистрация: 20.09.2019
Сообщений: 86
07.04.2020, 17:21  [ТС]
Запустилось, но вернуло ошибку, запустил в отладчике и остановило на строке:
C++
1
if (head->Data <= data)
А ошибка: Вызвано исключение: нарушение доступа для чтения.
this->head было nullptr.
В конструкторе по умолчанию head = nullptr

Добавлено через 2 часа 33 минуты
Я так понимаю, что
C++
1
head->Data
содержит мусор и поэтому выдаёт ошибку, хотя head был инициализирован.
Ошибка в методе:
C++
1
2
3
4
5
6
7
8
9
10
11
12
template <class T>
 Node<T>*Deque <T>::upper_bound(T data)
{
    if (head->Data <= data)
        return nullptr;
 
    auto p = head;
    while (p->Next && p->Next->Data < data)
        p = p->Next;
 
    return p;
}
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
07.04.2020, 17:31
_Beginner_, перед этим
Цитата Сообщение от _Beginner_ Посмотреть сообщение
if (head->Data <= data)
еще должна быть проверка, что head не равен nullptr. head равен nullptr, когда у нас нет элементов в деке, поэтому разумно не пытаться доставать дату в этом случае.
0
0 / 0 / 0
Регистрация: 20.09.2019
Сообщений: 86
07.04.2020, 17:56  [ТС]
Спасибо за проверку, вставил её в метод upper_bound и insert_after, всё компилится, однако если я вызываю
C++
1
abiturient.sort();
то ничего не выводится (даже те объекты, которые я добавил изначально, если сортировку убрать, то они выводятся)
C++
1
2
3
4
5
6
7
Abiturient* abit = new Abiturient(5, "dsf", "sdf", 2.5, 5, 1, 2);
    Abiturient* abit1 = new Abiturient(198, "dsf", "sdf", 2.5, 5, 1, 2);
 
    abiturient.push_front(abit);
    abiturient.push_back(abit1);
    abiturient.sort();
    cout << abiturient;
То, что я изменил(и ещё сортировку вставил на всякий случай):
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
template <class T>
Node<T>* Deque<T>::insert_after(Node<T>* pos, Node<T>* node)
{
    if (head == nullptr)
    {
        return nullptr;
    }
    if (pos == nullptr)
    {
        node->Prev = nullptr;
        node->Next = head;
        head = head->Next = node;
    }
    else
    {
        node->Prev = pos;
        node->Next = pos->Next;
        node->Next->Prev = pos->Next = node;
    }
    ++size;
}
 
 
template <class T>
 Node<T>*Deque <T>::upper_bound(T data)
{
    if(head == nullptr)
    {
        return nullptr;
    }
    if (head->Data <= data)
        return nullptr;
 
    auto p = head;
    while (p->Next && p->Next->Data < data)
        p = p->Next;
 
    return p;
}
 
 
template <class T>
void Deque <T>::sort()
{
    Node<T>* head2 = this->head;
    this->head = nullptr;
    this->size = 0;
    while (head2)
    {
        Node<T>* node = head2;
        head2 = head2->Next;
        Node<T>* pos = this->upper_bound(node->Data);
        this->insert_after(pos, node);
    }
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
07.04.2020, 18:25
Цитата Сообщение от _Beginner_ Посмотреть сообщение
То, что я изменил(и ещё сортировку вставил на всякий случай):
Цитата Сообщение от _Beginner_ Посмотреть сообщение
Node<T>* Deque<T>::insert_after(Node<T>* pos, Node<T>* node)
{
    if (head == nullptr)
    {
        return nullptr;
    }
Это что означает - если список пустой, то в него ничего добавлять не надо?
0
0 / 0 / 0
Регистрация: 20.09.2019
Сообщений: 86
07.04.2020, 20:05  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Это что означает - если список пустой, то в него ничего добавлять не надо?
Так и думал, что не так нужно, но я не знаю, что возвращать, если ничего, то компилятор ругается (ошибка выше)
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
07.04.2020, 20:09
_Beginner_, возвращайте node. В конце функции, естественно.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
07.04.2020, 20:10
Цитата Сообщение от _Beginner_ Посмотреть сообщение
Так и думал, что не так нужно, но я не знаю, что возвращать, если ничего, то компилятор ругается (ошибка выше)
insert_after вроде ничего не должен возвращать void insert_after(...................)
0
0 / 0 / 0
Регистрация: 20.09.2019
Сообщений: 86
07.04.2020, 20:20  [ТС]
Окей, insert_after не должна ничего возвращать, вернул на void
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template <class T>
void Deque<T>::insert_after(Node<T>* pos, Node<T>* node)
{
    if (pos == nullptr)
    {
        node->Prev = nullptr;
        node->Next = head;
        head = head->Next = node;
    }
    else
    {
        node->Prev = pos;
        node->Next = pos->Next;
        node->Next->Prev = pos->Next = node;
    }
    ++size;
}
Но ошибка та же (в upper_bound и insert_after), что: Вызвано исключение: нарушение доступа для чтения.
this->head было nullptr.
Пытался сделать так, что если дек не пуст, тогда можно продолжать идти по телу дальше:
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
template <class T>
void Deque<T>::insert_after(Node<T>* pos, Node<T>* node)
{
    if (head != nullptr)
    {
        if (pos == nullptr)
        {
            node->Prev = nullptr;
            node->Next = head;
            head = head->Next = node;
        }
        else
        {
            node->Prev = pos;
            node->Next = pos->Next;
            node->Next->Prev = pos->Next = node;
        }
        ++size;
    }
}
 
 
template <class T>
Node<T>* Deque <T>::upper_bound(T data)
{
    if (head != nullptr)
    {
        if (head->Data <= data)
            return nullptr;
 
        auto p = head;
        while (p->Next && p->Next->Data < data)
            p = p->Next;
 
        return p;
    }
}
Комплируется, но возвращает ошибку в окне консоли.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
07.04.2020, 20:26
Цитата Сообщение от _Beginner_ Посмотреть сообщение
Но ошибка та же (в upper_bound и insert_after), что: Вызвано исключение: нарушение доступа для чтения.
this->head было nullptr.
Цитата Сообщение от _Beginner_ Посмотреть сообщение
head = head->Next = node;
head = node

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template <class T>
Node<T>* Deque <T>::upper_bound(T data)
{
    if (head == nullptr)
       return nullptr;
 
        if (head->Data <= data)
            return nullptr;
 
        auto p = head;
        while (p->Next && p->Next->Data < data)
            p = p->Next;
 
        return p;
}
0
0 / 0 / 0
Регистрация: 20.09.2019
Сообщений: 86
07.04.2020, 20:29  [ТС]
Ошибка уже исправилась(я просто не до конца проверил), но суть в том, что теперь просто ничего не выводится, после вызова метода sort(). Если sort() убрать, то объекты abit и abit1 выведутся, возможно, что я не так вызываю метод? Но вроде бы логично: сначала заполняем дек элементами, потом вызываем метод сортировки и выводим на экран
Вот так в main выглядит
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    Deque <Abiturient*> abiturient;
 
    Abiturient* abit = new Abiturient(5, "dsf", "sdf", 2.5, 5, 1, 2);
    Abiturient* abit1 = new Abiturient(198, "dsf", "sdf", 2.5, 5, 1, 2);
 
    abiturient.push_front(abit);
    abiturient.push_back(abit1);
    abiturient.sort();
    cout << abiturient;
    return 0;
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
07.04.2020, 20:32
Цитата Сообщение от _Beginner_ Посмотреть сообщение
Ошибка уже исправилась(я просто не до конца проверил), но суть в том, что теперь просто ничего не выводится, после вызова метода sort(). Если sort() убрать, то объекты abit и abit1 выведутся, возможно, что я не так вызываю метод? Но вроде бы логично: сначала заполняем дек элементами, потом вызываем метод сортировки и выводим на экра
Покажи код
0
0 / 0 / 0
Регистрация: 20.09.2019
Сообщений: 86
07.04.2020, 20:35  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
C++

template <class T>
Node<T>* Deque <T>::upper_bound(T data)
{
    if (head == nullptr)
       return nullptr;
if (head->Data <= data)
            return nullptr;
auto p = head;
        while (p->Next && p->Next->Data < data)
            p = p->Next;
return p;
}
Так я же это сам кидал, там неправильно, где
C++
1
2
if(head == nullptr) 
return nullptr;
Или я что-то не заметил?

Добавлено через 1 минуту
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Покажи код
Весь код:
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
#ifndef  DEQUE_H
#define DEQUE_H
 
#include <iostream>
#include "abiturient.h"
 
using namespace std;
 
template <class T> struct Node
{
    T Data;
    Node<T>* Next;
    Node<T>* Prev;
    Node(const T &data)
    {
        this->Data = data;
        Next = nullptr;
        Prev = nullptr;
    }
};
 
template <class T> 
class Deque
{
    Node<T>* head;
public:
    int size;
    Deque();
    Deque(const Deque&);
    ~Deque();
    void push_front(const T&);
    T pop_front();
    void push_back(const T&);
    T pop_back();
    const T peek();
    const bool isEmpty();
    Deque<T>& operator= (const Deque&);
    template <class U>
    friend ostream& operator<< (ostream& os, const Deque<U>& obj);
    void insert_after(Node<T>* pos, Node<T>* node);
    Node<T>* upper_bound(T data);
    void sort();
    template <typename > friend class Iterator;
};
 
template <class T>
Deque<T>::Deque() {
    head = nullptr;
    size = 0;
}
// Конструктор копирования
template <class T>
Deque<T>::Deque(const Deque& obj)
{
    if (!obj.head)
    {
        head = new Node<T>(NULL);
    }
    head = new Node<T>(obj.head->Data);
    Node<T>* temp = obj.head->Next;
    Node<T>* pnew = 0;
    Node<T>* pold = head;
    while (temp)
    {
        pnew = new Node<T>(temp->Data);
        pnew->Prev = pold;
        pold->Next = pnew;
        pold = pnew;
        temp = temp->Next;
    }
}
template <class T>
// Деструктор
Deque<T>::~Deque()
{
    while (!isEmpty())
        pop_front();
}
 
 
template <class T>
class Iterator
{
    Deque<T>* D;
    Node<T>* current;
public:
    // Конструктор преобразования
    Iterator(Deque<T>& obj)
    {
        D = &obj;
        current = obj.head;
    }
    // Возвращает текущий объект дека без его удаления
    int peek() {
        return current->Data;
    }
    // Переходит к следующему объекту дека
    void next() {
        current = current->Next;
    }
    // Переходит к предыдущему объекту дека
    void prev() {
        current = current->Prev;
    }
    // Переходит в начало дека
    void reset() {
        current = D->head;
    }
    // Проверяет существует ли элемент
    const bool isEmptyElement() {
        if (!current)
            return true;
        else
            return false;
    }
    // Доступ к элементу по адресу
    void set(Node<T>* p = 0) {
        current = p;
    }
};
 
 
template <class T>
void Deque<T>::push_front(const T& data)
{
    size++;
    if (head != NULL)
    {
        Node<T>* temp = new Node<T>(data);
        temp->Next = head;
        head->Prev = temp;
        head = temp;
    }
    else
    {
        head = new Node<T>(data);
    }
}
// Удаляет и возвращает объект, находящийся в начале дека
template <class T>
T Deque<T>::pop_front()
{
    if (head)
    {
        T temp = head->Data;
        Node<T>* p = head;
        head = p->Next;
        delete[] p;
        size--;
        return temp;
    }
    else
        return NULL;
}
// Вставляет объект как нижний элемент дека
template <class T>
void Deque<T>::push_back(const T& data)
{
    size++;
    if (head != NULL)
    {
        Node<T>* tail = new Node<T>(NULL);
        for (Node<T>* i = head; i != NULL; i = i->Next) {
            if (i->Next == NULL)
                tail = i;
        }
        Node<T>* temp = new Node<T>(data);
        tail->Next = temp;
        temp->Prev = tail;
        tail = temp;
    }
    else
    {
        head = new Node<T>(data);
    }
}
// Удаляет и возвращает объект, находящийся в конце дека
template <class T>
T Deque<T>::pop_back()
{
    if (head)
    {
        Node<T>* tail = new Node<T>(NULL);
        for (Node<T>* i = head; i != NULL; i = i->Next) {
            if (i->Next == NULL)
                tail = i;
        }
        T temp = tail->Data;
        Node<T>* p = tail;
        tail = p->Prev;
        tail->Next = NULL;
        size--;
        return temp;
    }
    else
        return NULL;
}
// Возвращает объект в верхней части дека без его удаления
template <class T>
const T Deque<T>::peek()
{
    if (head)
        return head->Data;
    else
        return 0;
}
// Проверяет пуст ли дек
template <class T>
const bool Deque<T>::isEmpty() {
    return size == 0;
}
// Перегрузка оператора присваивания
template <class T>
Deque<T>& Deque<T>::operator= (const Deque& obj)
{
    if (this == &obj)
        return *this;
    if (!obj.head)
        return *this;
    head = new Node<T>(obj.head->Data);
    Node<T>* temp = obj.head->Next;
    Node<T>* pnew = 0;
    Node<T>* pold = head;
    while (temp)
    {
        pnew = new Node<T>(temp->Data);
        pnew->Prev = pold;
        pold->Next = pnew;
        pold = pnew;
        temp = temp->Next;
    }
    return *this;
}
// Перегрузка потокового поератора вывода
template <class U>
ostream& operator<<(ostream& os, const Deque<U>& obj)
{
    for (Node<U>* i = obj.head; i != NULL; i = i->Next)
        os << i->Data << " " << endl;
    return os;
}
 
template <class T>
void Deque<T>::insert_after(Node<T>* pos, Node<T>* node)
{
    if (head != nullptr)
    {
        if (pos == nullptr)
        {
            node->Prev = nullptr;
            node->Next = head;
            head = node;
        }
        else
        {
            node->Prev = pos;
            node->Next = pos->Next;
            node->Next->Prev = pos->Next = node;
        }
        ++size;
    }
}
 
 
template <class T>
Node<T>* Deque <T>::upper_bound(T data)
{
    if (head = nullptr)
    {
        if (head->Data <= data)
            return nullptr;
 
        auto p = head;
        while (p->Next && p->Next->Data < data)
            p = p->Next;
 
        return p;
    }
}
 
 
template <class T>
void Deque <T>::sort()
{
    Node<T>* head2 = this->head;
    this->head = nullptr;
    this->size = 0;
    while (head2)
    {
        Node<T>* node = head2;
        head2 = head2->Next;
        Node<T>* pos = this->upper_bound(node->Data);
        this->insert_after(pos, node);
    }
}
 
#endif
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
#ifndef ABITURIENT_H
#define ABITURIENT_H
 
#include <iostream>
#include <string>
 
using namespace std;
 
class Abiturient
{
private:
    int number;
    string fio;
    string address;
    float average;
    int markMath;
    int markRus;
    int markPhys;
public:
    Abiturient();
    Abiturient(const Abiturient& cop);
    Abiturient(int number, string fio, string adress, float average, int markmath, int markrus, int markphys);
    void setNumber(int abiturientNumber);
    int getNumber();
    void setFio(string abiturientName);
    string getFio();
    void setAddress(string abiturientAddress);
    string getAddress();
    void setAverage(float abiturientAverage);
    float getAverage();
    void setMarkMath(int abiturientMarkMath);
    int getMarkMath();
    void setMarkRus(int abiturientMarkRus);
    int getMarkRus();
    void setMarkPhys(int abiturientMarkPhys);
    int getmarkPhys();
    friend ostream& operator<<(ostream& Cout, Abiturient* test);
};
#endif
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
#include "abiturient.h"
 
Abiturient::Abiturient()
{
    this->number = 0;
    this->fio = "";
    this->address = "";
    this->average = 0.0;
    this->markMath = 0;
    this->markRus = 0;
    this->markPhys = 0;
}
 
Abiturient::Abiturient(const Abiturient& cop)
{
    this->number = cop.number;
    this->fio = cop.fio;
    this->address = cop.address;
    this->average = cop.average;
    this->markMath = cop.markMath;
    this->markRus = cop.markRus;
    this->markPhys = cop.markPhys;
}
 
Abiturient::Abiturient(int number, string fio, string adress, float average, int markmath, int markrus, int markphys)
{
    this->number = number;
    this->fio = fio;
    this->address = adress;
    this->average = average;
    this->markMath = markmath;
    this->markRus = markrus;
    this->markPhys = markphys;
}
 
void Abiturient::setNumber(int abiturientNumber)
{
    number = abiturientNumber;
}
 
int Abiturient::getNumber()
{
    return number;
}
 
void Abiturient::setFio(string abiturientName)
{
    fio = abiturientName;
}
 
string Abiturient::getFio()
{
    return fio;
}
 
void Abiturient::setAddress(string abiturientAddress)
{
    address = abiturientAddress;
}
 
string Abiturient::getAddress()
{
    return address;
}
 
void Abiturient::setAverage(float abiturientAverage)
{
    average = abiturientAverage;
}
 
float Abiturient::getAverage()
{
    return average;
}
 
void Abiturient::setMarkMath(int abiturientMarkMath)
{
    markMath = abiturientMarkMath;
}
 
int Abiturient::getMarkMath()
{
    return markMath;
}
void Abiturient::setMarkRus(int abiturientMarkRus)
{
    markRus = abiturientMarkRus;
}
 
int Abiturient::getMarkRus()
{
    return markRus;
}
 
void Abiturient::setMarkPhys(int abiturientMarkPhys)
{
    markPhys = abiturientMarkPhys;
}
 
int Abiturient:: getmarkPhys()
{
    return markPhys;
}
 
ostream& operator<<(ostream& Cout, Abiturient* test)
{
    string temp = "Номер: ";
    temp += to_string(test->getNumber());
    temp += ", ФИО: ";
    temp += test->getFio();
    temp += ", Адрес: ";
    temp += test->getAddress();
    temp += " , Средний балл абитуриента: ";
    temp += to_string(test->getAverage());
    temp += ", Оценка по математике: ";
    temp += to_string(test->getMarkMath());
    temp += ", Оценка по русскому: ";
    temp += to_string(test->getMarkRus());
    temp += ", Оценка по физике: ";
    temp += to_string(test->getmarkPhys());
    Cout << temp;
    return Cout;
}
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
#include <iostream>
#include <string>
#include <Windows.h>
#include "abiturient.h"
#include "deque.h"
 
using namespace std;
 
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    
    Deque <Abiturient*> abiturient;
 
    Abiturient* abit = new Abiturient(5, "dsf", "sdf", 2.5, 5, 1, 2);
    Abiturient* abit1 = new Abiturient(198, "dsf", "sdf", 2.5, 5, 1, 2);
 
    abiturient.push_front(abit);
    abiturient.push_back(abit1);
    abiturient.sort();
    cout << abiturient;
    return 0;
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
07.04.2020, 20:35
Цитата Сообщение от _Beginner_ Посмотреть сообщение
Так я же это сам кидал, там неправильно, где
Ты это делал в insert_after
0
0 / 0 / 0
Регистрация: 20.09.2019
Сообщений: 86
07.04.2020, 20:39  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Ты это делал в insert_after
Хорошо, спасибо, добавил это в upper_bound
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
07.04.2020, 20:44
Цитата Сообщение от _Beginner_ Посмотреть сообщение
Хорошо, спасибо, добавил это в upper_bound
А в insert_after нахрена оставил if (head != nullptr)?

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template <class T>
void Deque<T>::insert_after(Node<T>* pos, Node<T>* node)
{
    if (pos == nullptr)
    {
        node->Prev = nullptr;
        node->Next = head;
if (head)
    head->Prev = node;
 
        head = node;
    }
    else
    {
        node->Prev = pos;
        node->Next = pos->Next;
        node->Next->Prev = pos->Next = node;
    }
    ++size;
}
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
07.04.2020, 20:46
Цитата Сообщение от _Beginner_ Посмотреть сообщение
Так я же это сам кидал
Ага, только:
C++
1
2
3
4
5
6
7
8
9
10
11
   if (head != nullptr)
    {
        if (head->Data <= data)
            return nullptr;
 
        auto p = head;
        while (p->Next && p->Next->Data < data)
            p = p->Next;
 
        return p;
    }
Возвращаете значение не на всех путях исполнения. В случае, если head == nullptr у вас отсутствует return. Включите предупреждения компилятора, если вам трудно пока за этим следить.
0
0 / 0 / 0
Регистрация: 20.09.2019
Сообщений: 86
07.04.2020, 20:51  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
А в insert_after нахрена оставил if (head != nullptr)?
Забыл убрать, сразу отправил, а после того, как я убрал в insert_after, возвращает ошибку при компилировании(-107374...), в отладчике указывает(15-ая строка): Вызвано исключение: нарушение доступа для записи.
node->Next было nullptr.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template <class T>
void Deque<T>::insert_after(Node<T>* pos, Node<T>* node)
{
   
        if (pos == nullptr)
        {
            node->Prev = nullptr;
            node->Next = head;
            head = node;
        }
        else
        {
            node->Prev = pos;
            node->Next = pos->Next;
            node->Next->Prev = pos->Next = node;
        }
        ++size;
   
}
Добавлено через 3 минуты
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
template <class T>
void Deque<T>::insert_after(Node<T>* pos, Node<T>* node)
{
    if (pos == nullptr)
    {
        node->Prev = nullptr;
        node->Next = head;
if (head)
    head->Prev = node;
head = node;
    }
    else
    {
        node->Prev = pos;
        node->Next = pos->Next;
        node->Next->Prev = pos->Next = node;
    }
    ++size;
}
Сделал так, сейчас попробую
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
07.04.2020, 20:52
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template <class T>
void Deque<T>::insert_after(Node<T>* pos, Node<T>* node)
{
    if (pos == nullptr)
    {
        node->Prev = nullptr;
        node->Next = head;
if (head)
    head->Prev = node;
head = node;
    }
    else
    {
        node->Prev = pos;
        node->Next = pos->Next;
 
if (node->Next)
      node->Next->Prev = pos->Next = node;
 
    }
    ++size;
}
0
0 / 0 / 0
Регистрация: 20.09.2019
Сообщений: 86
07.04.2020, 20:57  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
template <class T>
void Deque<T>::insert_after(Node<T>* pos, Node<T>* node)
{
    if (pos == nullptr)
    {
        node->Prev = nullptr;
        node->Next = head;
if (head)
    head->Prev = node;
head = node;
    }
    else
    {
        node->Prev = pos;
        node->Next = pos->Next;
if (node->Next)
      node->Next->Prev = pos->Next = node;
}
    ++size;
}
Сделал так, но я не понимаю как оно сортирует, если я записываю через конструктор с параметрами три разные записи, а оно их также(в том же порядке) и выводит(извиняюсь за глупые вопросы)

C++
1
2
3
4
5
6
7
8
9
10
Deque <Abiturient*> abiturient;
 
    Abiturient* abit = new Abiturient(5, "dsf", "sdf", 2.5, 5, 1, 2);
    Abiturient* abit1 = new Abiturient(198, "dsf", "sdf", 2.5, 5, 1, 2);
    Abiturient* abit2 = new Abiturient(197, "zsf", "zdf", 2.3, 4, 0, 1);
    abiturient.push_front(abit);
    abiturient.push_front(abit1);
    abiturient.push_front(abit2);
    abiturient.sort();
    cout << abiturient;
Я понял, что он всё же сортирует, когда я сделал так:
C++
1
2
3
4
5
6
7
8
Abiturient* abit = new Abiturient(5, "dsf", "sdf", 2.5, 5, 1, 2);
    Abiturient* abit1 = new Abiturient(198, "dsf", "sdf", 2.5, 5, 1, 2);
    Abiturient* abit2 = new Abiturient(197, "zsf", "zdf", 2.3, 4, 0, 1);
    abiturient.push_front(abit);
    abiturient.push_back(abit1);
    abiturient.push_front(abit2);
    abiturient.sort();
    cout << abiturient;
То вывело сначала abit, потом abit1 и abit2, т.е если бы не работало, то abit1 просто в конец записало, но почему он выводит, например, не abit, потом abit2, а затем abit1, т.к abit имеет первое поле 5, abit1 198 и abit2 197
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.04.2020, 20:57

Как корректно передать в метод шаблонного класса объект шаблонного класса в качестве параметра?
header.h template &lt;class T&gt; class MyVector { public: void swap(MyVector&lt;T&gt;Vector); } template &lt;class T&gt; void...

Используя модуль для реализации дека целых чисел, реализовать очередь на базе дека
Уважаемые программисты!Очень нужна Ваша помощь: (помогите решить, разобраться или хотябы просто объяснить алгоритм, с чего начинать, как...

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

Создание дека
Здравствуйте. Изучаю STL и считаю, что в изучении программирования нет ничего лучше, чем создание велосипедов. От чего вы**ал свой...

Реализация дека в компьютере
Задание: 1. инициализация дека: создание циклического двунаправленного списка заданной длины и присвоение указателям дека ссылок на...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru