雙向連結串列list.h升序排序
阿新 • • 發佈:2019-02-11
前一篇文章《整理一個雙向連結串列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 週四 中午休息 前