2015-10-04 6 views
1

Я пытаюсь создать пузырь, сортировать дважды связанный список, используя функцию swap. Мой вопрос заключается в том, что функция swap меняет указатель, а не только данные? Мой код показывает мне, что он меняет только данные, а не указатели. Есть ли способ эффективно менять указатели в связанном списке? Пожалуйста, покажите мне код, поскольку я очень неопытен в кодировании, и я не понимаю других кодов в другом ответе.Сортировка связанного списка с сортировкой пузыря в 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: данными или указателями из-за эффекта кеша, вероятно, это более эффективная свопинг данных, но вы можете решить эту деталь), конечным результатом будет список, в котором итерация предоставит отсортированные элементы. пока вы не уверены, что у вас есть правильный «SWAP», и правильный «COMPARE» даже не пытается сделать вид – GameDeveloper

ответ

1

Возможно, у вас, вероятно, проблемы с функцией свопинга. Я не думаю, что std :: swap может также заменить предыдущую и следующую ссылку. конечно, вы можете реализовать свой собственный своп. Я бы сделал это с помощью этой функции.

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

+0

Спасибо за ответ. Быстрый вопрос, почему условие if (prev) и if (next)? –

+0

prev и следующий объект может быть вне массива. Я предполагаю, что вы устанавливаете превью предыдущего объекта NULL и последний объект – Adem

Смежные вопросы