簡體   English   中英

冒泡排序雙鏈表

[英]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並且您想交換BC :您需要更新ABC right ,也需要更新BCD 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM