1. 程式人生 > >雙向連結串列list.h升序排序

雙向連結串列list.h升序排序

前一篇文章《整理一個雙向連結串列list.h》介紹了自實現的雙向連結串列list.h,在Linux核心中,常見的是維護全域性連結串列(如i2c板級有一個全域性連結串列),基本上都是在尾部插入、模組退出時刪除,不會涉及到連結串列中間插入、刪除,——這也讓我一度認為該連結串列的實現只具備這些“少許”功能。當然,如果拋開核心場合,其它場合可能會需要到更多的功能,所以前文中做了介紹。這裡就說一下如何將連結串列做成升序(或降序)排列的。

程式碼片段如下:

// 按順序新增到連結串列中
LIST_HEAD(list_misc3_head);
void list_misc3_add(struct i2c_devinfo* devinfo)
{
    struct i2c_devinfo* tdev;

    list_for_each(tdev, &list_misc3_head, struct i2c_devinfo, list)
    {
        if (devinfo->busnum < tdev->busnum) // 升序  如果為“>”則是降序
        {
            // 使用的是prev,因為遍歷到tdev節點時,比其小的,要插到前面,而不是後面,同理,降序亦是prev
            list_add_prev(&devinfo->list, &tdev->list); 
            return;
        }
    }

    // 如果不符合條件,或連結串列為空,則達到此處
    list_add_tail(&devinfo->list, &list_misc3_head);
}

#include <time.h>
#include <unistd.h>
void list_misc3(void)
{
    struct i2c_devinfo* devinfo;

    for (int i = 0; i < 5; i++)
    {
        // 分配空間
        devinfo = (struct i2c_devinfo*)malloc(sizeof(struct i2c_devinfo));
        if (devinfo == NULL) return;

        srand(time(NULL));
        sleep(1); // 為了讓隨機數變化,延時1秒,否則得到的隨機數都是一樣的
        // 賦值
        devinfo->busnum = rand() % 100;
        devinfo->slave = i+100;
        
        // 新增到連結中
        list_misc3_add(devinfo);
        //list_add_tail(&devinfo->list, &list_misc3_head);
    }
    
    // 顯示
    show(&list_misc3_head);
    
    delete_list(&list_misc3_head);
}

程式碼簡單並有解釋,就不多說了。

2016.10.20 週四 中午休息 前