gpt4 book ai didi

c - 冒泡排序双向链表

转载 作者:太空宇宙 更新时间:2023-11-04 07:08:13 25 4
gpt4 key购买 nike

大家好,我正在尝试使用冒泡排序算法对 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你想交换 BC :您需要更新 rightA , B , 和 C , 还有 leftB , C , 和 D .

您的代码仅在此处更新 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 - 冒泡排序双向链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30615735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com