冒泡排序双链表

时间:2015-06-03 09:15:09

标签: c sorting linked-list bubble-sort

大家好我正在尝试使用冒泡排序算法在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

为什么我的第三个节点消失了?问题在哪里?

2 个答案:

答案 0 :(得分:2)

这是一个双重链表。要交换两个节点,通常需要更新6个指针。假设我们有A <-> B <-> C <-> D,您想要交换BC:您需要更新right ABC,以及leftBC的{​​{1}}。

您的代码只更新了4个指针:

D

这将解决您的问题:

        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;
        }

答案 1 :(得分:1)

您还需要替换代码中的上一个节点tmp,但我建议使用更明确的名称...)right指针,以及下一个下一个节点&#39 ; s左指针:

tmp <-> node1 <-> node2 <-> nextnext

您正在node1并检测到您需要将其与node2交换:

  • 您需要tmp - &gt; node1已更改为tmp - &gt; node2
  • 您需要将node2&lt; - nextnext更改为node1&lt; - nextnext以及