嵌入式C語言二級指針在鏈表中的應(yīng)用
重讀了兩本書:Stephen A.Maguire的《編程精粹:Microsoft編寫優(yōu)質(zhì)無錯C程序秘訣》和David R. Hanson的《C語言接口與實(shí)現(xiàn):創(chuàng)建可重用軟件的技術(shù)》。兩本書都有對鏈表的操作。
假設(shè)有如圖所示的鏈表,鏈表節(jié)點(diǎn)的pb
成員指向一個(gè)緩沖塊,刪除節(jié)點(diǎn)函數(shù)根據(jù)緩沖塊的首地址,找到節(jié)點(diǎn)并刪除節(jié)點(diǎn):
《編程精粹》使用一個(gè)變量pbiPrev
來保存前一個(gè)節(jié)點(diǎn)位置,并且要處理刪除的是第一個(gè)節(jié)點(diǎn)A這種邊界條件:
void FreeBlockInfo(byte *pbToFree) { blockinfo *pbi, *pbiPrev; pbiPrev = NULL; for(pbi = pbiHead; pbi != NULL; pbi = pbi->pbiNext) { if(fPtrEqual(pbi->pb, pbToFree) { if(pbiPrev == NULL) pbiHead = pbi->pbiHead; else pbiPrev->pbiNext = pbi->pbiNext; break; } pbiPrev = pbi; } /*如果pbi是NULL, 說明參數(shù)pbToFree非法*/ ASSERT(pbi != NULL); /*在釋放前破壞掉要釋放內(nèi)存中的內(nèi)容*/ memset(pbi, bGarbage, sizeof(blockinfo)); free(pbi); }
《C語言接口與實(shí)現(xiàn)》使用了二級指針,可以很巧妙的省掉變量pbiPrev
以及邊界判斷:
void FreeBlockInfo(byte *pbToFree) { blockinfo **ppbi, *pbiFind; pbiFind = NULL; for(ppbi = &pbiHead; *ppbi != NULL; ppbi = &(*ppbi)->pbiNext) { if(fPtrEqual((*ppbi)->pb, pbToFree) { pbiFind = *ppbi; *ppbi = (*ppbi)->pbiNext; break; } } /*如果pbiFind是NULL, 說明參數(shù)pbToFree非法*/ ASSERT(pbiFind != NULL); /*在釋放前破壞掉要釋放內(nèi)存中的內(nèi)容*/ memset(pbiFind, bGarbage, sizeof(blockinfo)); free(pbiFind); }
以上就是嵌入式C語言二級指針在鏈表中的應(yīng)用的詳細(xì)內(nèi)容,更多關(guān)于嵌入式C語言二級指針鏈表的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解c++ atomic原子編程中的Memory Order
在多核編程中,我們使用內(nèi)核對象【如:事件對象(Event)、互斥量對象(Mutex,或互斥體對象)、信號量對象(Semaphore)等】來避免多個(gè)線程修改同一個(gè)數(shù)據(jù)時(shí)產(chǎn)生的競爭條件。本文將詳細(xì)介紹c++ atomic原子編程中的Memory Order。2021-06-06使用C語言實(shí)現(xiàn)vector動態(tài)數(shù)組的實(shí)例分享
vector是指能夠存放任意類型的動態(tài)數(shù)組,而C語言中并沒有面向?qū)ο蟮腃++那樣內(nèi)置vector類,所以我們接下來就來看一下使用C語言實(shí)現(xiàn)vector動態(tài)數(shù)組的實(shí)例,需要的朋友可以參考下2016-05-05