簡體   English   中英

鏈表冒泡排序的問題

[英]trouble with linked list bubble sort

我是一名初學者,正在學習使用鏈表進行冒泡排序。 我看到一個 geeksforgeeks 頁面談論這個( https://www.geeksforgeeks.org/bubble-sort-for-linked-list-by-swapping-nodes/ ),並適應了我的情況。 我已經讓代碼正常工作,但我無法理解邏輯在這種排序中是如何工作的。 據我了解,“頭”充當基點,它始終表示第一個節點。 但是據我所知,head 指針應該始終與節點一起移動(如果節點 a 和 b 交換,並且 head 指向 a,那么即使在交換之后,head 也會繼續指向 a),這似乎與第一條語句相矛盾。

這是我的代碼:

typedef struct Node{
    int Nid;
    char Nname[9];
    int Ngrades;
    struct Node *next;
}NODE;

int bubbleSortID(NODE** head, int count){
    NODE** h;
    NODE* temp;
    for (int i = 0; i <= count; i++) {
        h = head;
        for (int j = 0; j < count-1; j++) {
            NODE* p1 = *h;
            NODE* p2 = p1->next;
            if (p1->Nid > p2->Nid) {
                temp = p2->next;
                p2->next = p1;
                p1->next = temp;
                *h = p2;
            }
            h = &(*h) -> next;
        }
    }
}

void getID(NODE *head){ //used to print result
    while (head != NULL){
        printf("%d %s %d \n", head->Nid, head->Nname, head->Ngrades);
        head = head->next;
    }
}

given input:
10355112 jack 80
10311103 tom 85
10355107 zenry 70
10355014 tim 95
10355123 mary 85
11355123 helloo 1000

expected output:
10311103 tom 85
10355014 tim 95
10355107 zenry 70
10355112 jack 80
10355123 mary 85
11355123 helloo 1000

有人可以幫我理解這段代碼發生了什么嗎?

據我了解,“頭”充當基點,它始終表示第一個節點。

是的,但不要將此head變量與另一個變量h混淆,它並不總是(間接)指向第一個節點。

另請注意,當h = &(*h) -> next; 執行后, hhead不再是同一個指針, *h不再是鏈表的第一個節點。 然后, h成為下一次迭代中將由p1引用的節點之前的節點的next指針的地址。

據我所知,頭指針應該始終與節點一起移動(如果節點 a 和 b 交換,並且 head 指向 a,那么即使在交換之后,head 也會繼續指向 a),

是的,這就是執行*h = p2的原因,因此*h保證指向具有較小值的節點,並且不會堅持交換之前的狀態。 這成為if塊之后的不變量:無論該塊是否被執行, *h指的是在比較中使用的另一個節點后面的節點,並且它們的順序正確。

暫無
暫無

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

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