Поэтому я пытаюсь отсортировать узлы в соответствии с их местоположением (целое число), а затем по дате (год и месяц). Когда я использую мой перегруженный оператор для печати своего связанного списка, он показывает, что в список вставляется только один из нужных узлов, что означает, что моя функция вставки неверна. Это не дает никаких ошибок, это просто не работает, как ожидалось. Моя функция вставки ниже. У кого-нибудь есть идеи относительно того, что не так?
void LinkedList::insert(int location, int year, int month, double temperature) {
// Implement this function
Node* newNode = new Node();
newNode->loc = location;
newNode->yr = year;
newNode->mo = month;
newNode->temp = temperature;
Node* tempNode = head;
Node* previousNode = nullptr;
if(tail == nullptr & head == nullptr){
head = newNode;
}
while(tempNode != nullptr){
if((tempNode->loc == newNode->loc) && (tempNode->yr == newNode->yr)){
if(tempNode->mo > newNode->mo){
newNode->next = tempNode->next;
tempNode->next = newNode;
}
if(tempNode->mo < newNode->mo){
newNode->next = tempNode;
}
}
if(tempNode->loc > newNode->loc){
newNode->next = tempNode->next;
tempNode->next = newNode;
}
if(tempNode->loc < newNode->loc){
newNode->next = tempNode->next;
tempNode->next = newNode;
}
tempNode = tempNode->next;
}
}
Причина, по которой вы не получаете должным образом связанный список, состоит в том, что вы делаете ошибку в манипулировании указателем. Когда вы назначаете cur->next=data->next;
вы в основном разбиваете список, так как data->next
не указать на следующий узел в списке.
Также обратите внимание, что, поскольку это один связанный список (то есть он имеет только один указатель вперед), вы можете вставлять только узлы перед текущим узлом.
Попробуйте что-то вроде этого:
if (cur->loc > data->loc) {
data->next = cur->next; // This will insert data in middle of
cur->next = data; // cur and cur->next
}
Есть несколько проверок, которые вам нужно сделать, если вы хотите вставить в возрастающем или убывающем порядке.
Сделайте разные случаи, когда вы вставляете первый элемент списка, вставляете в начало, вставляете в хвост и вставляете в середину связного списка.
Кроме того, в хвостовом узле убедитесь, что его следующий всегда равен нулю.
Других решений пока нет …