【问题标题】:Sorting linked list with bubble sort in c++在 C++ 中使用冒泡排序对链表进行排序
【发布时间】:2016-01-01 05:37:35
【问题描述】:

我一直在尝试使用交换函数对双向链表进行冒泡排序。我的问题是交换函数是否交换指针,而不仅仅是数据?我的代码显示它只交换数据而不交换指针。有没有办法有效地交换链表上的指针?请给我看代码,因为我在编码方面非常缺乏经验,而且我不理解其他答案中的其他代码。

void sortPoly(PolyNode* a)
{
  PolyNode* head =a;
  PolyNode* current = head;
  PolyNode* current_next = current->next;


  int len =Polylength(current);

  if(len ==1 || len ==0)
   {
      return;
   }

for(int i =0; i < len; i++)
{
    for (int j =0; j< len -i; j++)
    {
        int sum = current->expx + current->expy;
        cout << "sum=" << sum << endl;
        int next_sum = current_next->expx + current_next->expy;
         cout << "\t nextsum=" << next_sum << endl;

        if( sum < next_sum)
        {
            cout << "current=" << current->coef << "expx = " << current->expx << "expy=" << current->expy << endl;
            cout << "current_next=" << current_next->coef << "expx = " << current_next->expx << "expy=" << current_next->expy << endl;

            std:: swap(current, current_next);
            cout << endl;
            cout << "swapped" << endl;

            cout << "current=" << current->coef << "expx = " <<    current->expx << "expy=" << current->expy << endl;
            cout << "current_next=" << current_next->coef << "expx = " << current_next->expx << "expy=" << current_next->expy << endl;

           cout << "current=" << current->coef << "expx = " << current->expx << "expy=" << current->expy << endl;
           cout << "current_next=" << current_next->coef << "expx = " << current_next->expx << "expy=" << current_next->expy << endl;

        current = current->next;

        current_next = current->next->next;
        cout << "current=" << current->coef << "expx = " << current->expx << "expy=" << current->expy << endl;
        cout << "current_next=" << current_next->coef << "expx = " << current_next->expx << "expy=" << current_next->expy << endl;
    }
   }

 }

这是我的结构:

    struct PolyNode
    {
      int coef;
      int expx;
      int expy;
      PolyNode* prev;
      PolyNode* next;
     };

请在 Mac 终端上查看我的回复。

【问题讨论】:

  • 所以你有自己的列表实现?尝试以更小的步骤解决问题,您需要以某种方式比较 2 个节点并实现一个函数以正确交换 2 个节点(您可以决定交换什么:数据或指针,由于缓存效应,它可能更有效地交换数据,但你可以决定那个细节)最终结果将是一个迭代给出排序元素的列表。直到你不确定你有一个正确的“SWAP”和一个正确的“COMPARE”,甚至不要尝试进行排序

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


【解决方案1】:

我认为您可能在交换功能方面遇到了问题。我不认为 std::swap 也可以交换 prev 和 next 参考。可以肯定的是,您可以实现自己的交换。我会用这个函数来做这个。

void swap(PolyNode* node1, PolyNode* node2){
PolyNode* prev = node1->prev;
PolyNode* next = node2->next;
if (prev)
    prev->next = node2;
if (next)
    next->prev = node1;

node1->next = next;
node1->prev = node2;

node2->prev = prev;
node2->next = node1;
}

顺便说一句,您必须将迭代移出 if。

current = current->next;
current_next = current->next->next;

部分必须在if之外

【讨论】:

  • 感谢您的回复。快速提问,为什么条件 if(prev) 和 if(next)?
  • 上一个和下一个对象可以超出数组。我假设,你设置 NULL 第一个对象的上一个,最后一个对象的下一个
猜你喜欢
  • 2017-09-27
  • 1970-01-01
  • 1970-01-01
  • 2013-10-31
  • 2012-07-19
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
相关资源
最近更新 更多