Я пытаюсь создать контейнер с двусвязным списком для проекта. Я не могу использовать стандартные контейнеры. Двусвязный список необходимо отсортировать. Вот мой код:
#include <iostream>
using namespace std;
template <typename T>
class dll {
private:
struct Node {
Node* prev;
Node* next;
T data;
};
Node* head;
Node* tail;
public:
dll();
~dll();
void insert(T value);
bool empty() const { return head == tail; };
};
template <typename T> dll<T>::dll() {
head = nullptr;
tail = head;
}
template <typename T> dll<T>::~dll() {
delete[] head;
}
template <typename T> void dll<T>::insert(T value) {
Node *node = new Node;
node->data = value;
// Case 1: There are no nodes yet
if (head == nullptr) {
node->prev = nullptr;
node->next = nullptr;
head = node;
tail = head;
}
else {
// Case 2: There is more than one node
Node *curr = head;
if (curr->next != nullptr)
{
while (curr->next) {
// If the value is less than the current value
if (value < curr->data) {
Node *temp = new Node;
temp->data = curr->data;
temp->next = curr->next;
temp->prev = curr->prev;
node->next = temp;
node->prev = temp->prev;
curr->prev = node;
}
curr = curr->next;
}
}
// Case 3: There is only one node
else {
node->prev = head;
node->next = nullptr;
tail = node;
}
}
}
int main() {
dll<int> list;
list.insert(10);
list.insert(20);
list.insert(15);
}
Проблема, с которой я столкнулся, заключается в моей функции вставки. Я использую отладчик и вхожу в код в строке: list.insert (10) ;.
Он правильно переходит в первый случай, когда head == nullptr и создает Node. Когда я перехожу к следующей строке кода (list.insert (20)), он создает узел с этой строкой: Node * node = new Node; Но он создает узел с адресом памяти, на который указывает голова.
Я обратил внимание на переменную head, переменную узла и адреса памяти были одинаковыми. По сути, он создает тот же узел, что и при последней вставке.
Я не знаю, как получить строку: Node * code = new Node; создать что-то новое. Я неправильно использую ключевое слово new?
temp
? Почему бы не использоватьcurr
? И тогда зачем устанавливатьnode->next
как временный? Вы фактически проделываете дыру в своем списке. Кроме того, вы забыли обновить узел заnode
. - person scohe001   schedule 09.08.2014