0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

可pop任意字節(jié)的隊(duì)列

冬至子 ? 來源:技術(shù)鋪?zhàn)?/span> ? 作者:chasen ? 2023-01-18 15:02 ? 次閱讀

前言

在一般的鏈表中,數(shù)據(jù)是存儲(chǔ)在node節(jié)點(diǎn)中的,每次pop出來的數(shù)據(jù)是以node為單位的。這篇文章,我們對(duì)一般的鏈表進(jìn)行改進(jìn),可以pop任意字節(jié)的數(shù)據(jù),也就是說,每次pop的數(shù)據(jù)數(shù)據(jù)是以任意字節(jié)為單位的,可以pop 10Byte,也可以500Byte,這種方法比較靈活。

原理

針對(duì)一般的鏈表,我們做的改進(jìn)主要是在每個(gè)node中加了一個(gè)字段pos,用來標(biāo)記這個(gè)node的data的下標(biāo)。比如說這個(gè)node打data數(shù)據(jù)大小為10,它的pos就為0,這時(shí)候就表示這10個(gè)字節(jié)都可以用。然后可以pop 2個(gè)字節(jié),這時(shí)候pos就成了2,表示還有8個(gè)字節(jié)可以用。

實(shí)現(xiàn)的話,我們可以定義這樣的結(jié)構(gòu)體:

typedef struct Node
{
    int id;             //每個(gè)link的標(biāo)識(shí)符
    int pos;            //記錄node數(shù)據(jù)的下標(biāo)
    int size;           //記錄node數(shù)據(jù)的總大小
    int num;            //記錄link的node個(gè)數(shù),僅頭結(jié)點(diǎn)使用
    char *addr;         //數(shù)據(jù)data
    struct Node *next;  //next node
} Node;

對(duì)于具體的原理實(shí)現(xiàn),我們可以用一張圖片來清楚地說明一下:

2.jpg

例子

下面是一個(gè)完整的的代碼例子供參考,可以直接運(yùn)行:

#include 
#include 
#include 
#include 
#include 


class PkgLink
{
public:
    PkgLink() {m_link_header.clear();}
    ~PkgLink() {}


    typedef struct Node
    {
        int id;
        int pos;
        int size;
        int num; //for head;
        char *addr;
        struct Node *next;
    } Node;


    std::vector

審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    SIMPLIS POP仿真分析

    要說POP (Periodic operating Point )仿真在Simplis里面算比較特殊的功能了,只有在Simplis模式下才可以使用POP 仿真。所以啟動(dòng)POP仿真必須在Simplis模式下。
    的頭像 發(fā)表于 11-10 15:11 ?2783次閱讀
    SIMPLIS <b class='flag-5'>POP</b>仿真分析

    Freertos隊(duì)列項(xiàng)里的字節(jié)長(zhǎng)度是否可以獲取?

    最近剛學(xué)Freertos, 看到可以獲取Freertos隊(duì)列長(zhǎng)度,但是隊(duì)列項(xiàng)里的字節(jié)長(zhǎng)度是否可以獲取? 因?yàn)轫?xiàng)目中隊(duì)列中會(huì)存放不定長(zhǎng)字節(jié),
    發(fā)表于 04-29 07:17

    【MiCOKit試用體驗(yàn)】慶科MiCO系統(tǒng)篇(4)MiCO RTOS消息隊(duì)列

    , uint32_tnumber_of_messages );該函數(shù)為初始化一個(gè)消息隊(duì)列,參數(shù)1為指向要初始化的消息隊(duì)列的句柄指針;參數(shù)2為消息隊(duì)列的名稱,由用戶定義;參數(shù)3為將要進(jìn)入隊(duì)列
    發(fā)表于 10-24 17:03

    keystoneII arm示例程序網(wǎng)卡中斷,請(qǐng)問隊(duì)列收到包后,如果暫時(shí)不從隊(duì)列pop包,是否可以在隊(duì)列這個(gè)級(jí)別清除中斷信號(hào)?

    描述:目前開發(fā)板示例程序網(wǎng)卡驅(qū)動(dòng)中,接收用了queue-658,這個(gè)隊(duì)列的中斷信號(hào)直接給了中斷控制器,請(qǐng)問,如果隊(duì)列收到包后,如果暫時(shí)不從隊(duì)列pop包的話,是否可以在
    發(fā)表于 08-03 07:43

    利用變體隊(duì)列實(shí)現(xiàn)任意復(fù)雜數(shù)據(jù)集合傳遞(很方便)

    利用變體隊(duì)列實(shí)現(xiàn)任意復(fù)雜數(shù)據(jù)集合傳遞(很方便),大家可以看看。原創(chuàng)是來自@zhihuizhou 【labview我來告訴你】實(shí)現(xiàn)任何LabVIEW數(shù)據(jù)類型集合的簡(jiǎn)潔方式。我在此基礎(chǔ)上加了一些,方便大家理解這樣的好處。
    發(fā)表于 02-11 15:39

    FreeRTOS消息隊(duì)列和RT-Thread消息隊(duì)列的使用注意事項(xiàng)介紹

    個(gè)數(shù)unsigned portBASE_TYPE uxItemSize ); // 單個(gè)消息最大字節(jié)uxQueueLength隊(duì)列能夠存儲(chǔ)的最大單元數(shù)目,即隊(duì)列深度。 uxItemSize隊(duì)列
    發(fā)表于 05-25 15:32

    簡(jiǎn)單羅列幾種隊(duì)列管理邏輯電路

    的范圍比buffer深度大,則不需要額外的標(biāo)號(hào)記錄空滿狀態(tài)。存在的問題,若buffer深度較大或隊(duì)列數(shù)量較多,隊(duì)列號(hào)和指針匹配邏輯會(huì)占用較多的資源。3 重力FIFO類似于排隊(duì),從隊(duì)頭開始尋找輸出
    發(fā)表于 08-29 14:23

    什么是PoP

    什么是PoP  英文縮寫: PoP 中文譯名: 接入點(diǎn) 分  類: IP與多媒體
    發(fā)表于 02-23 09:41 ?1748次閱讀

    POP3協(xié)議和Base 64編碼原理

    POP3適用于C/S結(jié)構(gòu)的脫機(jī)模型,是因特網(wǎng)電子郵件的第一個(gè)離線協(xié)議標(biāo)準(zhǔn),Base 64是一種很常見的編碼規(guī)范,被設(shè)計(jì)用來將任意序列的8字節(jié)描述為一種不易被人直接識(shí)別的形式
    發(fā)表于 01-12 19:08 ?2141次閱讀
    <b class='flag-5'>POP</b>3協(xié)議和Base 64編碼原理

    AWorks軟件設(shè)計(jì),郵箱、消息隊(duì)列和自旋鎖使用方法

    本文介紹了郵箱、消息隊(duì)列和自旋鎖的使用方法。信號(hào)量只能用于任務(wù)間的同步,不能傳遞更多的信息,為此,AWorks提供了郵箱和消息隊(duì)列服務(wù),它們的主要區(qū)別在于支持的消息長(zhǎng)度不同,在郵箱中,每條消息的長(zhǎng)度固定為4字節(jié),而在消息
    的頭像 發(fā)表于 06-13 09:13 ?1.2w次閱讀
    AWorks軟件設(shè)計(jì),郵箱、消息<b class='flag-5'>隊(duì)列</b>和自旋鎖使用方法

    什么是消息隊(duì)列?消息隊(duì)列中間件重要嗎?

    應(yīng)用解耦:消息隊(duì)列減少了服務(wù)之間的耦合性,不同的服務(wù)可以通過消息隊(duì)列進(jìn)行通信,而不用關(guān)心彼此的實(shí)現(xiàn)細(xì)節(jié)。
    的頭像 發(fā)表于 11-07 14:55 ?1339次閱讀

    pop任意字節(jié)隊(duì)列代碼的優(yōu)化

    因?yàn)檫@個(gè)功能是通過頭結(jié)點(diǎn)的鏈表的實(shí)現(xiàn)的,而在上分代碼中,使用者可以通過調(diào)用的到頭結(jié)點(diǎn)信息,然后使用者就可以對(duì)這個(gè)鏈表進(jìn)行任意操作,這樣就很危險(xiǎn)。
    的頭像 發(fā)表于 01-18 14:56 ?548次閱讀

    RTOS消息隊(duì)列的應(yīng)用

    基于RTOS的應(yīng)用中,通常使用隊(duì)列機(jī)制實(shí)現(xiàn)任務(wù)間的數(shù)據(jù)交互,一個(gè)應(yīng)用程序可以有任意數(shù)量的消息隊(duì)列,每個(gè)消息隊(duì)列都有自己的用途。
    發(fā)表于 05-29 10:49 ?581次閱讀
    RTOS消息<b class='flag-5'>隊(duì)列</b>的應(yīng)用

    FreeRTOS消息隊(duì)列介紹

    隊(duì)列是為了任務(wù)與任務(wù)、任務(wù)與中斷之間的通信而準(zhǔn)備的,可以在任務(wù)與任務(wù)、任務(wù)與中斷之間傳遞消息,隊(duì)列中可以存儲(chǔ)有限的、大小固定的數(shù)據(jù)項(xiàng)目。任務(wù)與任務(wù)、任務(wù)與中斷之間要交流的數(shù)據(jù)保存在隊(duì)列中,叫做
    的頭像 發(fā)表于 07-06 16:58 ?746次閱讀
    FreeRTOS消息<b class='flag-5'>隊(duì)列</b>介紹

    MCU專屬隊(duì)列功能模塊之QueueForMcu應(yīng)用

    當(dāng)需要從隊(duì)列頭部獲取多個(gè)數(shù)據(jù),但又不希望數(shù)據(jù)從隊(duì)列中刪除時(shí),可以使用 Queue_Peek_Array 函數(shù)來實(shí)現(xiàn),該函數(shù)的參數(shù)與返回值與 Queue_Pop_Array 完全相同。
    發(fā)表于 03-20 11:44 ?368次閱讀
    MCU專屬<b class='flag-5'>隊(duì)列</b>功能模塊之QueueForMcu應(yīng)用