列表C++移动到前面;

List C++ Move to front;

本文关键字:前面 移动 C++ 列表      更新时间:2023-10-16

您好,我需要在单向列表中找到最早的音符 不幸的是,我无法使用列表容器。 这里有一些代码

Struct
struct Sterminarz
{
Sterminarz *next=NULL;
int year;
int month;
int day;
int hour;
string note;
};

查找最早音符的功能

void findEarliest(Sterminarz *head)
{
Sterminarz *p, *min;
min = head;
int counter = 0;

for(p=head->next;p;p=p->next)
{
if (p->hour < min->hour)
{
min = p;
counter++;  
printNote(min, counter);
}           
}

}

而且我不知道如何在没有列表容器的情况下将最早的元素移动到列表的开头。

若要将节点移动到列表的前面,可以先从列表中删除该节点,然后将其添加到列表的头部。这些都是常规列表操作。如果您尚未为列表编写remove()函数,那么现在应该这样做。同样,您应该编写add_to_head()函数或通用add()函数。

尝试这样的事情:

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;
}

现场演示