1. 程式人生 > >用迴圈連結串列來獲取完整幀資料

用迴圈連結串列來獲取完整幀資料

現在slam車的主控板和上位機一般都是通過串列埠來通訊,接收到的資料直接進入ringbuffer佇列裡,主控需要從佇列裡提取每幀資料然後轉發給執行部件,我這裡採用單幀長度的迴圈連結串列來篩選指定幀資料再轉發。

class ChainNode {
    
    public:
        ChainNode* m_next;
        ChainNode* m_prev;
        int data;
};

class ChainList {
    public:
        ChainList(int list_size);
        ~ChainList();
        
    public:
        
        ChainNode *ChainHead;
        
        void ChainSetData(int mValue);
        void ChainPrevious();
        void ChainNext();
        int ChainGetData();
};

ChainList::ChainList(int list_size)
{
    ChainNode* ChainNodeHead = NULL;
    ChainNode* ChainNodeTmp = NULL;
    
    if(list_size > 0)
    {
        ChainNodeHead = new ChainNode;
        ChainNodeHead->m_next = ChainNodeHead;
        ChainNodeHead->m_prev = ChainNodeHead;
        ChainNodeHead->data = 0;
        
        for(int i=0; i < list_size - 1; i++)
        {
            ChainNodeTmp = new ChainNode;
            ChainNodeTmp->m_next = ChainNodeHead->m_next;
            ChainNodeTmp->m_prev = ChainNodeHead;
            ChainNodeTmp->data   = 0;
            ChainNodeHead->m_next = ChainNodeTmp;
            ChainNodeTmp->m_next->m_prev = ChainNodeHead->m_next;
            ChainNodeTmp = NULL;
        }
        
        ChainHead = ChainNodeHead;
    }
}

int ChainList::ChainGetData()
{
    return ChainHead->data;
}

void ChainList::ChainNext()
{
    ChainHead = ChainHead->m_next;
}

void ChainList::ChainPrevious()
{
    ChainHead = ChainHead->m_prev;
}

void ChainList::ChainSetData(int mValue)
{
    ChainHead->data = mValue;
}


ChainList::~ChainList()
{
    ChainNode* q = ChainHead;
    ChainNode* p = ChainHead->m_next;
    ChainNode* t = NULL;
    
    while(q != p)
    {
        t = p;
        p = p->m_next;
        delete t;
    }
    
    delete q;
}