Я пытаюсь создать отсортированный связанный список = сортировка его при его создании. Идея проста, вставьте узел - и проверьте, если предыдущий меньше, если это так, проверьте предыдущий и т. Д., Пока он не найдет свое место. Я создал этот кусок кода.Сортировка связанного списка при вставке узла
struct Node{
Node *prev;
Node *next;
int value;
};
struct List{
Node *head = nullptr;
Node *tail = nullptr;
};
Здесь я создал узел и «держатель» для списка = ссылка на первый и последний элемент списка.
void insertNode(Node *&head,Node *&tail, int value){
Node *tmp = new Node;
tmp -> prev = nullptr;
tmp -> next = nullptr;
tmp -> value = value;
head = tmp;
tail = tmp;
}
эта функция проверяет список пуст, если да, то он вставляет узел голову и хвост (например голова = хвост = есть только один узел в списке);
Что меня беспокоит это функция для вставки узла
void insertIt(Node *&head , Node *&tail , int value){
if(head == nullptr){
insertNode(head,tail,value);
}
else{
Node *tmp = new Node;
tmp -> value = value;
if(value < tail -> value){
while(value < tail -> prev -> value){
tail = tail -> prev;
if(tail -> prev == nullptr){
tmp -> next = head;
tmp -> prev = nullptr;
head -> prev = tmp;
head = tmp;
return;
}
}
tail -> prev -> next = tmp;
tmp -> prev = tail -> prev;
tmp -> next = tail;
tail -> prev = tmp;
}else{
tmp -> next = nullptr;
tmp ->prev = tail;
tail -> next = tmp;
tail = tmp;
}
}
}
Если список пуст, он вызывает insertNode()
, если значение узла меньше, чем значение предыдущего узла, он сканирует список, чтобы найти свое место ,
Этот кусочный код работает, только если вставленный первый узел также является самым маленьким узлом. например
insertIt(list.head , list.tail , -1);
insertIt(list.head , list.tail , 0);
insertIt(list.head , list.tail , 7);
insertIt(list.head , list.tail , 1);
insertIt(list.head , list.tail , 2);
insertIt(list head , list.tail , 2);
работает, и если я распечатаю список, он будет отсортирован правильно. но
insertIt(list.head , list.tail , -2);
insertIt(list.head , list.tail , -1);
insertIt(list.head , list.tail , 7);
insertIt(list.head , list.tail , 1);
insertIt(list.head , list.tail , 2);
insertIt(list.head , list.tail , 2);
Первый узел не самый маленький узел, он вылетает из программы. Я думал, что я сравнивал значение для nullptr так я добавил кусок кода, который вы можете увидеть в insertIt()
функции и что
if(tail -> prev == nullptr){
tmp -> next = head;
tmp -> prev = nullptr;
head -> prev = tmp;
head = tmp;
return;
}
Это проверяет, является ли узел головки и замены головки с новым узлом , создавая новую голову нового узла.
Зачем возникает сбой кода? Мне не удалось найти разумный ответ на этот вопрос. Кроме того, как я мог улучшить свой «алгоритм», чтобы сделать его более эффективным?
Прежде всего, вы должны запустить в отладчике, чтобы поймать аварии в действии и посмотреть, где и что значения всех вовлеченных переменных. Если это не поможет, используйте отладчик, чтобы выполнить код по очереди, чтобы увидеть, что он делает и как все переменные изменяются. –
«Если список пуст, он вызывает insertNode(), если значение узла меньше, чем значение предыдущего узла.» ?? Но список пуст. –
Я использую блоки кода, и отладчик указал на строку кода, которую я добавил (последний код, который я написал), я новичок в мире c/C++, havent использовал отладчик так много, Я думаю, что отладчик блоков кода не лучший. Не могли бы вы порекомендовать хороший? – Darlyn