【问题标题】:Doubly Linked List Bubble Sort双向链表冒泡排序
【发布时间】: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 循环的退出条件中的&lt;= 通常是一个单独的错误。确保 for (int i = 0; i &lt;= size; ++i) 没有超出列表的末尾。
  • if (employee1-&gt;data-&gt;getAppointment().operator&gt;(employee2-&gt;data-&gt;getAppointment())) 看起来很笨重。值得调查if (employee1-&gt;data-&gt;getAppointment() &gt; employee2-&gt;data-&gt;getAppointment())
  • 首先,感谢您的 cmets 和建议。我使用了重载运算符,因为 Date 实际上是一个类,并且具有 int 日、月和年。但是我在另一部分检查了它。它正在有效地工作。
  • 这不是你有运营商,而是你如何使用它。看到A.operator&gt;(B) 被调用是不寻常的。运算符重载的全部意义在于您可以编写A &gt; B

标签: c++ sorting linked-list bubble-sort doubly-linked-list


【解决方案1】:

问题是当你交换头指针时,你没有更新head来引用新的头节点。

解决此问题的一种方法是在进行交换后,应检查是否应更新头指针。

temp = swap(employee1,employee2);
if (employee1 == head)
    head = temp;

或者,在swap 中,如果在pointer2-&gt;prev=pointer1-&gt;prev; 中分配的新prev 指针为NULL,则更新头(因为头节点没有前一个节点)。

if ((pointer2->prev=pointer1->prev) == nullptr)
    head = pointer2;

【讨论】:

    猜你喜欢
    • 2014-02-04
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    相关资源
    最近更新 更多