冒泡排序双向链表
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
为什么我的第三个节点不见了?问题出在哪里?
您还需要替换前一个节点(tmp
在您的代码中,但我建议使用更明确的名称...)right
指针,以及下一个节点的左指针:
tmp <-> node1 <-> node2 <-> nextnext
您在 node1
上,检测到您需要将其与 node2
交换:
- 您需要将
tmp
-> node1
更改为 tmp
-> node2
- 您还需要将
node2
<- nextnext
更改为 node1
<- nextnext
这是一个双链表。要交换两个节点,通常需要更新 6 个指针。假设我们有 A <-> B <-> C <-> D
,而您想交换 B
和 C
:您需要更新 A
、B
和 right
,以及C
,以及 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;
}
大家好,我正在尝试使用冒泡排序算法对 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
为什么我的第三个节点不见了?问题出在哪里?
您还需要替换前一个节点(tmp
在您的代码中,但我建议使用更明确的名称...)right
指针,以及下一个节点的左指针:
tmp <-> node1 <-> node2 <-> nextnext
您在 node1
上,检测到您需要将其与 node2
交换:
- 您需要将
tmp
->node1
更改为tmp
->node2
- 您还需要将
node2
<-nextnext
更改为node1
<-nextnext
这是一个双链表。要交换两个节点,通常需要更新 6 个指针。假设我们有 A <-> B <-> C <-> D
,而您想交换 B
和 C
:您需要更新 A
、B
和 right
,以及C
,以及 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;
}