[英]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;
執行后, h
和head
不再是同一個指針, *h
不再是鏈表的第一個節點。 然后, h
成為下一次迭代中將由p1
引用的節點之前的節點的next
指針的地址。
據我所知,頭指針應該始終與節點一起移動(如果節點 a 和 b 交換,並且 head 指向 a,那么即使在交換之后,head 也會繼續指向 a),
是的,這就是執行*h = p2
的原因,因此*h
保證指向具有較小值的節點,並且不會堅持交換之前的狀態。 這成為if
塊之后的不變量:無論該塊是否被執行, *h
指的是在比較中使用的另一個節點后面的節點,並且它們的順序正確。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.