Попробуйте что-то вроде этого:
struct Sterminarz
{
Sterminarz *next = NULL;
int year;
int month;
int day;
int hour;
string note;
bool operator<(const Sterminarz &rhs) const {
if (year < rhs.year) return true;
if (year > rhs.year) return false;
if (month < rhs.month) return true;
if (month > rhs.month) return false;
if (day < rhs.day) return true;
if (day > rhs.day) return false;
return (hour < rhs.hour);
/* alternatively:
return std::tie(year, month, day, hour) < std::tie(rhs.year, rhs.month, rhs.day, rhs.hour);
*/
}
/* or, if you just want to compare hours by themselves
bool operator<(const Sterminarz &rhs) const {
return (hour < rhs.hour);
}
*/
};
Sterminarz* findEarliest(Sterminarz *head, Sterminarz** beforeEarliest)
{
if (beforeEarliest)
*beforeEarliest = NULL;
if (!head)
return NULL;
Sterminarz *p, *previous = head, *earliest = head;
int counter = 0;
for(p = head->next; p; p = p->next)
{
if (*p < *earliest)
{
earliest = p;
if (beforeEarliest) *beforeEarliest = previous;
counter++;
printNote(earliest, counter);
}
previous = p;
}
return earliest;
}
И затем вы можете сделать это, чтобы переместить самый ранний узел в начало списка:
Sterminarz *head;
...
Sterminarz *beforeEarliest;
Sterminarz *earliest = findEarliest(head, &beforeEarliest);
if (earliest != head)
{
beforeEarliest->next = earliest->next;
earliest->next = head;
head = earliest;
}
Live Demo