0 / 0 / 0
Регистрация: 16.10.2019
Сообщений: 80
1

Сортировка в классе List по добавлению элемента

13.12.2019, 16:22. Показов 2259. Ответов 4

Мне нужно в методе push класса List добавлять элемент и сортировать список методом простых вставок, но если в массиве я понимаю, как это сделать, то в списке осознать не получается. При реализации метода push таким образом, как сделал я, программа крашится и выводит 1 3 6 6 6.
метод push - строка 88
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
#include <iostream>
using namespace std;
template<typename T>
class List
{
public:
    List();
    ~List();
    //удаление первого элемента в списке
    void pop_front();
    //добавление элемента в конец списка
    void push_back(T data_);
    //добавление с сортировкой
    void push( T data_);
    // очистить список
    void clear();
    // получить количество елементов в списке
    int GetSize() { return Size; }
    // перегруженный оператор [] 
    T& operator[](const int index);
    //добавление элемента в начало списка
    void push_front(T data_);
    //добавление элемента в список по указанному индексу
    void insert(T data_, int index);
    //удаление элемента в списке по указанному индексу
    void removeAt(int index);
    //удаление последнего элемента в списке
    void pop_back();
    //нахождение следующего элемента
    //int findNext(List l, T data_);
    //void findingQuantity();
private:
    template<typename T>
    class Node
    {
    public:
        Node* pNext;
        T data_;
        Node(T data_ = T(),  Node* pNext = nullptr)
        {
            this->data_ = data_;
            this->pNext = pNext;
        }
    };
    int Size;
    Node<T>* head;
};
template<typename T>
List<T>::List()
{
    Size = 0;
    head = nullptr;
}
template<typename T>
List<T>::~List()
{
    clear();
}
template<typename T>
void List<T>::pop_front()
{
    Node<T>* temp = head;
    head = head->pNext;
    delete temp;
    Size--;
}
template<typename T>
void List<T>::push_back(T data_)
{
    if (head == nullptr)
    {
        head = new Node<T>(data_);
    }
    else
    {
        Node<T>* current = this->head;
 
        while (current->pNext != nullptr)
        {
            current = current->pNext;
        }
        current->pNext = new Node<T>(data_);
    }
    Size++;
}
//////////////////////////////////////PUSH_START
template<typename T>
void List<T>::push( T data_)
{
    if (head == nullptr)
    {
        head = new Node<T>(data_);
    }
    else
    {
        //Node<T>* buf;
        Node<T>* current = this->head;
        while (current->pNext != nullptr)
        {
            if (/*current->data_ <= current->pNext->data_*/pNext->data_ >= data_.)
                current = current->pNext;
            else
            {
                swap(current, current->pNext)
                    //  buf = current->pNext;
                    //current->pNext = current;
                    //current = buf;
            }
        }
        current->pNext = new Node<T>(data_);
        /*Node<T>* current = this->head;
        while (current->pNext != nullptr)
        {
            current = current->pNext;
        }
        current->pNext = new Node<T>(data_);*/
    }
    Size++;
}
//////////////////////////////////////PUSH_END
template<typename T>
void List<T>::clear()
{
    while (Size)
    {
        pop_front();
    }
}
template<typename T>
T& List<T>::operator[](const int index)
{
    int counter = 0;
 
    Node<T>* current = this->head;
 
    while (current != nullptr)
    {
        if (counter == index)
        {
            return current->data_;
        }
        current = current->pNext;
        counter++;
    }
}
template<typename T>
void List<T>::push_front(T data_)
{
    head = new Node<T>(data_, head);
    Size++;
}
template<typename T>
void List<T>::insert(T data_, int index)
{
 
    if (index == 0)
    {
        push_front(data_);
    }
    else
    {
        Node<T>* previous = this->head;
 
        for (int i = 0; i < index - 1; i++)
        {
            previous = previous->pNext;
        }
 
        Node<T>* newNode = new Node<T>(data_, previous->pNext);
 
        previous->pNext = newNode;
 
        Size++;
    }
 
 
 
 
 
}
template<typename T>
void List<T>::removeAt(int index)
{
    if (index == 0)
    {
        pop_front();
    }
    else
    {
        Node<T>* previous = this->head;
        for (int i = 0; i < index - 1; i++)
        {
            previous = previous->pNext;
        }
 
 
        Node<T>* toDelete = previous->pNext;
 
        previous->pNext = toDelete->pNext;
 
        delete toDelete;
 
        Size--;
    }
 
}
template<typename T>
void List<T>::pop_back()
{
    removeAt(Size - 1);
}
//template<typename T>
//int List<T>::findNext(List l,T data_)
//{
//  for (int i = 1; i < l.GetSize(); i++)
//  {
//      if (l[i - 1] > l[i])
//          return i;
//      else
//          return i - 1;
//  }
//}
//template<typename T>
//void List<T>::findingQuantity()
//{
//
//}
 
 
int main()
{
 
    setlocale(LC_ALL, "ru");
    List<int> lst;
    //lst.push_back(5);
    //lst.push_back(3);
    //lst.push_back(10);
    lst.push(1);
    lst.push(3);
    lst.push(6);
    lst.push(4);
    lst.push(5);
    //cout << "5>3?: " << (lst[0] > lst[1]) << endl;
    for (int i = 0; i < lst.GetSize(); i++)
    {
        cout << lst[i] << endl;
    }
 
 
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.12.2019, 16:22
Ответы с готовыми решениями:

В пользовательском классе List (список) реализовать вставку элемента после заданного элемента
Помогите пожалуйста, мне надо сделать вставку элемента после найденного, а у меня элемент...

Отображение в listBox поля элемента из коллекции коллекций List<List<>>
Есть карта в pictureBox-е. На ней мышкой ставяться флажки(маркеры). Нужно хранить их в БД с...

Сортировка двумерного List<List<string>>, по 1-ой строке, чтобы элементы 2-ой строки передвинулись в соответствии с 1-ой
Дан двумерный массив List&lt;List&lt;string&gt;&gt; , состоящий из двух строк, как его отсортировать по первой...

Инициализация элементов списка списков (List<List>) происходит одинаково для каждого элемента
Доброго времени суток. Не знаю как лучше озаглавить эту тему, но у меня проблема со следующим...

4
6571 / 4556 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
13.12.2019, 16:33 2
Лучший ответ Сообщение было отмечено eogenio777 как решение

Решение

Цитата Сообщение от eogenio777 Посмотреть сообщение
Мне нужно в методе push класса List добавлять элемент и сортировать список методом простых вставок, но если в массиве я понимаю, как это сделать, то в списке осознать не получается. При реализации метода push таким образом, как сделал я, программа крашится и выводит 1 3 6 6 6.
метод push - строка 88
C++
1
2
3
4
5
6
7
Node<T>* current = this->head;
while (current->pNext != nullptr && current->pNext->data_ < data_)
    current = current->pNext;
 
auto *node = new Node<T>(data_);
node->pNext = current->pNext;
current->pNext = node;
1
0 / 0 / 0
Регистрация: 16.10.2019
Сообщений: 80
13.12.2019, 17:22  [ТС] 3
Можете пояснить, как работает auto* конкретно здесь?
0
6571 / 4556 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
13.12.2019, 17:22 4
Лучший ответ Сообщение было отмечено eogenio777 как решение

Решение

Цитата Сообщение от eogenio777 Посмотреть сообщение
Можете пояснить, как работает auto*?
Подставляет вместо него тип, котоый возвращает выражение справа
C++
1
Node<T> *node = new Node<T>(data_);
1
0 / 0 / 0
Регистрация: 16.10.2019
Сообщений: 80
13.12.2019, 17:25  [ТС] 5
Спасибо!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.12.2019, 17:25
Помогаю со студенческими работами здесь

Как изменить свойство элемента в list? List<MyClass>
В list содержится класс MyClass у которого есть свойства, как изменить у элемента в list требуемое...

Сортировка List<List<String>> в JTable
Доброго времени суток. Есть модель: private List&lt;String&gt; columnNames; private...

Заполнить List<T> в классе
Доброго времени суток, опишу кратко задачку. Есть класс EntryModel: public class...

Заполнить List в классе
Всем привет! Хочу сделать вывод заказов в таком виде: Имя клиента Список товаров Общая сумма...

Список List в классе
Как в класс1. добавить список List который использует класс2.?

Реализация деструктора в классе list
Добрый день всем! Вопрос по деструктору. Настал момент когда я решил все сделать правильно. И...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru