簡體   English   中英

當我使用quicksort對雙向鏈接列表進行排序時,用戶會消失

[英]Users dissapear when I sort a doubly-linked list using quicksort

我有一個雙向鏈接的列表,我想按用戶的ELO對其排序。

問題在於,當調用函數swap()時,某些用戶會消失

這是我在控制台中得到的: https : //imgur.com/a/pJSPSnW

如您所見,第一次交換(玩家1和2之間)正確完成。 但是,當它交換玩家3和4時,user1消失了。

我認為問題出在函數swap()內,但我無法弄清楚確切的位置

代碼:用戶/節點聲明

struct user {
public:
    string username;
    float ELO = NULL; //Score of the user       
    user* next = nullptr;
    user* previous = nullptr;
};

QuickSortRecursive函數

 void ELOManager::_quickSortRecursive(user* low, user* high) {
    if (high != nullptr && low != high && low != nullptr) {
        user* p = partition(low, high);
        _quickSortRecursive(low, p->previous);
        _quickSortRecursive(p->next, high);
    }
}

快速排序功能

void ELOManager::quickSort(){
    _quickSortRecursive(first, last);
}

分區功能

    user* ELOManager::partition(user* low, user* high) {
    float pivot = high->ELO;

    user* i = low->previous;

    for (user* j = low; j != high && j!=nullptr; j = j->next) {
        if (j->ELO <= pivot){
            i = (i == NULL) ? low : i->next;

            swap(i, j);
        }
    }
    //i = (i == NULL) ? low : i->next;
    swap(i->next, high);
    cout << endl << "Loop finished -----------------------" << endl;
    printUsers();
    return i;
}

交換功能

    void ELOManager::swap(user* A, user* B) {
    user* tmp = new user();
    user* swapperVector[4];

    cout << endl << "swap1[" << A->username << "]" << endl;
    cout << "swap2[" << B->username << "]" << endl;

    if (A == B) {
        cout << "Same Users: Continue" << endl;
        return;
    }   

    swapperVector[0] = A->previous;
    swapperVector[1] = B->previous;
    swapperVector[2] = A->next;
    swapperVector[3] = B->next; 

    if (areTheyNeighbours(A, B)) {
        A->previous->next = B;
        A->next->previous = B;
        B->previous->next = A;
        B->next->previous = A;


        A->previous = B;
        B->previous = swapperVector[1];
        A->next = swapperVector[3];
        B->next = A;    
        cout << endl << "Option 1" << endl;
    }
    else {
        A->previous = swapperVector[1];
        B->previous = swapperVector[0];
        A->next = swapperVector[3];
        B->next = swapperVector[2];

        A->previous->next = B;
        A->next->previous = B;
        B->previous->next = A;
        B->next->previous = A;
        cout << endl << "Option 2" << endl;
    }

    cout <<"Print list after swap" << endl << "-----" << endl;
    printUsers();
}

隨意進入我項目的github https://github.com/pablogalve/ELO-System

謝謝您的幫助:)

在您的if (areTheyNeighbors(A, B))塊中,鏈接列表指針最終看起來像這樣: 指針 注意:

  • B的兩個指針都指向A
  • A和A->next認為B是他們先前的列表元素

這會導致列表遍歷中出現多個問題,並且可能是導致列表中第一個元素丟失的原因。

如果A和B是鄰居,則應正確交換它們。

A->previous = B;
B->previous = swapperVector[0];
A->next = swapperVector[3];
B->next = A;

Amanda的答案顯示了一種處理相鄰節點的方法,但是並不需要特殊情況來處理相鄰節點與非相鄰節點,如果先通過交換指向兩個目標節點的內容來完成交換,然后再進行交換兩個目標節點中的指針。

    AP = A->previous;
    BP = B->previous;
    AN = A->next;
    BN = B->next;
    std::swap(AN->previous, BN->previous);
    std::swap(AP->next, BP->next);
    std::swap(A->previous, B->previous);
    std::swap(A->next, B->next);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM