日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

嵌入式C語(yǔ)言二級(jí)指針在鏈表中的應(yīng)用_C 語(yǔ)言

作者:zhzht19861011 ? 更新時(shí)間: 2022-06-11 編程語(yǔ)言

重讀了兩本書:Stephen A.Maguire的《編程精粹:Microsoft編寫優(yōu)質(zhì)無(wú)錯(cuò)C程序秘訣》和David R. Hanson的《C語(yǔ)言接口與實(shí)現(xiàn):創(chuàng)建可重用軟件的技術(shù)》。兩本書都有對(duì)鏈表的操作。

假設(shè)有如圖所示的鏈表,鏈表節(jié)點(diǎn)的pb成員指向一個(gè)緩沖塊,刪除節(jié)點(diǎn)函數(shù)根據(jù)緩沖塊的首地址,找到節(jié)點(diǎn)并刪除節(jié)點(diǎn):

鏈表舉例

《編程精粹》使用一個(gè)變量pbiPrev來(lái)保存前一個(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語(yǔ)言接口與實(shí)現(xiàn)》使用了二級(jí)指針,可以很巧妙的省掉變量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);
}

原文鏈接:https://freertos.blog.csdn.net/article/details/113274393

欄目分類
最近更新