[英]Bubble sort double linked list
大家好,我正在嘗試使用冒泡排序算法對C中的雙鏈表進行排序。 這是我的代碼:
struct node {
unsigned char key;
unsigned char num;
struct node *left;
struct node *right;
};
這是我的排序功能:
void sort(int count, struct node *t_node)
{
struct node *tmp,*nextnode, *node1, *node2;
for(node1 = t_node;node1->right != NULL ;node1 = node1->right) {
for(node2 = node1->right; node2->right != NULL; node2 = node2->right) {
if(node2->key > node2->right->key)
{
nextnode = node2->right;
tmp = node2->left;
node2->right = nextnode->right;
node2->left = nextnode->left;
nextnode->right = node2;
nextnode->left = tmp;
}
}
}
}
它之所以可以工作在80%,是因為例如數據:
node1 key=3
node2 key=144
node3 key=49
node4 key=207
排序后的結果是:
node1 key=3
node2 key=144
node4 key=207
為什么我的第三個節點消失了? 問題出在哪兒?
這是一個雙向鏈接的列表。 要交換兩個節點,通常需要更新6個指針。 假設我們有A <-> B <-> C <-> D
並且您想交換B
和C
:您需要更新A
, B
和C
right
,也需要更新B
, C
和D
left
。
您的代碼僅在此處更新4個指針:
if(node2->key > node2->right->key)
{
nextnode = node2->right;
tmp = node2->left;
node2->right = nextnode->right;
node2->left = nextnode->left;
nextnode->right = node2;
nextnode->left = tmp;
}
這將解決您的問題:
if(node2->key > node2->right->key)
{
nextnode = node2->right;
tmp = node2->left;
if (tmp)
tmp->right = nextnode;
if (nextnode->right)
nextnode->right->left = node2;
node2->right = nextnode->right;
node2->left = nextnode->left;
nextnode->right = node2;
nextnode->left = tmp;
}
您還需要替換上一個節點(代碼中的tmp
,但我建議使用更明確的名稱...) right
指針,以及下一個下一個節點的左指針:
tmp <-> node1 <-> node2 <-> nextnext
您在node1
,檢測到需要與node2
交換它:
tmp
> node1
更改為tmp
> node2
node2
< nextnext
更改為node1
< nextnext
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.