2015-10-04 173 views
1

我一直在尝试使用交换函数对双向链表进行冒泡排序。我的问题是交换功能交换指针,而不仅仅是数据?我的代码告诉我它只交换数据而不是指针。有什么办法有效地交换链接列表上的指针?请向我展示代码,因为我在编码方面很缺乏经验,并且在其他答案中我不了解其他代码。用C++中的冒泡排序排序链接列表

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终端上的回应。 Result for input a = xy+5-2x^6+7x^4y^2+5x^2-y^2, b= y-x+5

+0

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

回答

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

btw,你必须移动迭代if。

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

部分必须是出于if

+0

感谢您的答复。快速提问,为什么条件if(prev)和if(next)? –

+0

上一个和下一个对象可能不在数组中。我假设,你设置NULL第一个对象的prev,最后一个对象的下一个 – Adem