【发布时间】:2022-01-09 09:23:04
【问题描述】:
我的项目是一个双向链表的冒泡排序系统。 我正在尝试按日期对双向链表(即对象)的元素进行排序。 我使用基于指针的排序,因为我不想更改指针的数据。 问题是我的代码可以(我认为有效)对链表进行排序。但是最后,当我尝试打印链表的对象时,我的头不在它应该在的位置。你能帮帮我吗?
struct DoubleNode *DoubleDynamic::swap( DoubleNode *pointer1, DoubleNode *pointer2) {
DoubleNode* temp=pointer2->next;
pointer2->next=pointer1;
pointer2->prev=pointer1->prev;
pointer1->next=temp;
pointer1->prev=pointer2;
return pointer2;
}
void DoubleDynamic::sort(int size)
{
DoubleNode* temp;
DoubleNode* current;
bool sorting;
if (head==NULL)
{
return;
}else
{
for (int i = 0; i <= size; ++i)
{
sorting= false;
temp=head;
for (int j = 0; j < size-1-i; ++j)
{
DoubleNode *employee1=temp;
DoubleNode *employee2=employee1->next;
if (employee2!=NULL)
{
if (employee1->data->getAppointment().operator>(employee2->data->getAppointment()))
{
temp = swap(employee1,employee2);
sorting= true;
}
temp= temp->next;
}
}
if (!sorting)
{
break;
}
}
}
current=head;
while (current->prev!=NULL)
{
current=current->prev;
}
head=current;
}
void DoubleDynamic::display()
{
struct DoubleNode *trav;
trav=head;
if (trav==NULL)
{
cout<<"Liste boş yaa"<<endl;
}
while (trav != NULL)
{
cout<<*(trav->data)<<endl;
trav=trav->next;
}
cout<<endl;
}
【问题讨论】:
-
如果您在问题中提供minimal reproducible example (MRE),您会发现答案来得更快。 MRE 描述了几种强大的调试技术的提炼,因此,如果您认真对待 MRE 的构建,您可能会自己找到答案,甚至不必提出问题。
-
for 循环的退出条件中的
<=通常是一个单独的错误。确保for (int i = 0; i <= size; ++i)没有超出列表的末尾。 -
if (employee1->data->getAppointment().operator>(employee2->data->getAppointment()))看起来很笨重。值得调查if (employee1->data->getAppointment() > employee2->data->getAppointment())。 -
首先,感谢您的 cmets 和建议。我使用了重载运算符,因为 Date 实际上是一个类,并且具有 int 日、月和年。但是我在另一部分检查了它。它正在有效地工作。
-
这不是你有运营商,而是你如何使用它。看到
A.operator>(B)被调用是不寻常的。运算符重载的全部意义在于您可以编写A > B。
标签: c++ sorting linked-list bubble-sort doubly-linked-list