tbox鏈表list和list_entry的使用方法

本篇內(nèi)容介紹了“tbox鏈表list和list_entry的使用方法”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)服務(wù)項目包括織金網(wǎng)站建設(shè)、織金網(wǎng)站制作、織金網(wǎng)頁制作以及織金網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,織金網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到織金省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

TBOX中提供了各種列表操作:

  1. list: 元素在內(nèi)部維護的雙向鏈表

  2. list_entry: 元素在外部維護的雙向鏈表

  3. single_list: 元素在內(nèi)部維護的單向鏈表

  4. single_list_entry: 元素在外部維護的單向鏈表

由于雙鏈和單鏈的接口使用類似,這里主要就講解雙鏈的具體使用。

那什么是內(nèi)部維護和外部維護呢? 簡單地說:

  • 外部維護:就是鏈表容器本身不存儲元素,不開辟內(nèi)存空間,僅僅是一個節(jié)點頭,這樣比較節(jié)省內(nèi)存,更加靈活。(尤其是在多個鏈表間元素遷移的時候,或者多個鏈表需要統(tǒng)一內(nèi)存池維護的時候)。

  • 內(nèi)部維護:就是鏈表容器本身回去開辟一塊空間,去單獨存儲元素內(nèi)容,這種方式對接口的操作比較簡單,但是靈活性和性能不如前一種,如果不需要多個鏈表維護同一種元素,那么使用這種模式簡單操作下,更為妥當(dāng)。(而且內(nèi)部元素的存儲也是用內(nèi)存池優(yōu)化過的)。

list的使用

list的使用很簡單,接口用起來也很方便,這里給個簡單的例子:

// 創(chuàng)建一個long類型的雙鏈,參數(shù)0表示采用默認(rèn)的自動元素增長大小,也可以手動設(shè)置更適合的大小
tb_list_ref_t list = tb_list_init(0, tb_element_long());
if (list)
{
    // 在鏈表頭部插入元素:1,并返回這個新元素的迭代器索引
    tb_size_t itor = tb_list_insert_head(list, (tb_pointer_t)1);

    // 在之前新的元素后面插入一個新元素:2
    tb_list_insert_next(list, itor, (tb_pointer_t)2);

    // 在鏈表尾部插入元素:3
    tb_list_insert_tail(list, (tb_pointer_t)3);

    // 移除指定的元素
    tb_list_remove(list, itor);

    // 遍歷所有鏈表元素,
    tb_for_all(tb_long_t, item, list)
    {
        // 打印元素值
        tb_trace_i("%ld", item);
    }

    // 銷毀list
    tb_list_exit(list);
}

list_entry的使用

list_entry由于是外置式的容器,需要在外面自己定義的結(jié)構(gòu)體上進行操作,例如定義:

// 鏈表元素結(jié)構(gòu)體
typedef struct __tb_demo_entry_t 
{
    // 外置雙鏈的節(jié)點,用于鏈表維護
    tb_list_entry_t     entry;

    // 元素的實際數(shù)據(jù)
    tb_size_t           data;

}tb_demo_entry_t;

對鏈表的具體操作如下:

// 定義一些靜態(tài)元素,用于插入鏈表(實際使用可能需要自己動態(tài)創(chuàng)建他們)
tb_demo_entry_t entries[12] = 
{
    { {0}, 0 }
,   { {0}, 1 }
,   { {0}, 2 }
,   { {0}, 3 }
,   { {0}, 4 }
,   { {0}, 5 }
,   { {0}, 6 }
,   { {0}, 7 }
,   { {0}, 8 }
,   { {0}, 9 }
,   { {0}, 10}
,   { {0}, 11}
};

// 初始化鏈表,需要指定外置元素的結(jié)構(gòu)體類型,鏈表的節(jié)點名字
tb_list_entry_head_t list;
tb_list_entry_init(&list, tb_demo_entry_t, entry, tb_null);

// 插入一些元素,注意:所有操作都是在外置結(jié)構(gòu)體中的list_entry節(jié)點上操作
tb_list_entry_insert_tail(&list, &entries[5].entry);
tb_list_entry_insert_tail(&list, &entries[6].entry);
tb_list_entry_insert_tail(&list, &entries[7].entry);
tb_list_entry_insert_tail(&list, &entries[8].entry);
tb_list_entry_insert_tail(&list, &entries[9].entry);
tb_list_entry_insert_head(&list, &entries[4].entry);
tb_list_entry_insert_head(&list, &entries[3].entry);
tb_list_entry_insert_head(&list, &entries[2].entry);
tb_list_entry_insert_head(&list, &entries[1].entry);
tb_list_entry_insert_head(&list, &entries[0].entry);

// 訪問具體某個節(jié)點的元素數(shù)據(jù)
tb_demo_entry_t* entry = (tb_demo_entry_t*)tb_list_entry(&list, &entries[5].entry);
tb_trace_i("entry: %lu", entry->data);

// 遍歷所有元素
tb_trace_i("insert: %lu", tb_list_entry_size(&list));
tb_for_all_if(tb_demo_entry_t*, item0, tb_list_entry_itor(&list), item0)
{
    tb_trace_i("%lu", item0->data);
}

// 替換頭尾的元素
tb_list_entry_replace_head(&list, &entries[10].entry);
tb_list_entry_replace_last(&list, &entries[11].entry);

// 移除頭尾的元素
tb_list_entry_remove_head(&list);
tb_list_entry_remove_last(&list);

// 移動元素位置,這里吧頭尾的元素對調(diào)了下
tb_list_entry_ref_t head = tb_list_entry_head(&list);
tb_list_entry_moveto_head(&list, tb_list_entry_last(&list));
tb_list_entry_moveto_tail(&list, head);

// 退出列表
tb_list_entry_exit(&list);

怎么樣,也不是很復(fù)雜吧,由于元素的內(nèi)存都在外面自己維護,所以靈活性提升了不少,并且可以多個鏈表同時維護,然后共用一個內(nèi)存池進行優(yōu)化,效率和內(nèi)存都能得到最大的提升,這種模式在linux內(nèi)核里面很常見。

如果要做比喻的話,list就是傻瓜式操作,list_entry就是定制化操作。。。

“tbox鏈表list和list_entry的使用方法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

網(wǎng)頁名稱:tbox鏈表list和list_entry的使用方法
文章轉(zhuǎn)載:http://bm7419.com/article22/pceojc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)、企業(yè)建站、網(wǎng)站維護、微信小程序網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)