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

學無先后,達者為師

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

嵌入式C語言二級指針在鏈表中的應用_C 語言

作者:zhzht19861011 ? 更新時間: 2022-06-11 編程語言

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

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

鏈表舉例

《編程精粹》使用一個變量pbiPrev來保存前一個節(jié)點位置,并且要處理刪除的是第一個節(jié)點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語言接口與實現(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);
}

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

欄目分類
最近更新