列表C++移动到前面;
List C++ Move to front;
您好,我需要在单向列表中找到最早的音符 不幸的是,我无法使用列表容器。 这里有一些代码
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;
}
现场演示
相关文章:
- 将对象移动到std::shared_ptr
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- C / C++ 移位/偏移/向左或向右移动位图?
- MSVC将仅移动结构参数解释为指针
- 自定义先决条件对移动分配运算符有效吗
- 返回值优化:显式移动还是隐式
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 为什么复制而不是移动数据元素?
- 如何在C++向量中奇数元素前面加上值-1,我在使用insert函数时遇到了问题
- 可以使用移动语义更改或改进此C++代码吗?
- 使lambda不可复制/不可移动
- c++在使用指针时移动语义
- 将QGraphicsItem的移动区域限制在多边形区域内
- 移除前面有空格的前2个字符串
- SendInput()鼠标移动计算
- 列表C++移动到前面;
- 如何在不删除任何字符的情况下将字符从字符串中的某个位置移动到其最前面
- memmove会移动元素(就像前面的方式相同),还是一次抓住整个内存块