void TestList() { pLIST_DATA d = new LIST_DATA; d->p = new char[24]; strcpy( d->p, "Hello" ); Head = AddToList( Head, (void *) d, sizeof( pLIST_DATA ), ListDataDestructor ); // 該對象已被復制,現在刪除原來的對象 delete d;
d = new LIST_DATA; d->p = new char[24]; strcpy( d->p, "World" ); Head = AddToList( Head, (void *) d, sizeof( pLIST_DATA ), ListDataDestructor ); delete d;
// 釋放鏈表 DeleteList( Head ); }
在每個鏈表節點中包含同一個解除函數的同一個指針似乎是浪費內存空間。確實如此,但只有鏈表始終包含相同的對象才屬于這種情況。按這種方式編寫鏈表答應您將任何對象放在鏈表中的任何位置。大多數鏈表函數要求對象總是相同的類型或類。虛擬鏈表則無此要求。它所需要的只是將對象彼此區分開的一種方法。要實現這一點,您既可以檢測解除函數指針的值,也可以在鏈表中所用的全部結構前添加一個類型值并對它進行檢測。當然,假如要將鏈表編寫為一個 C++ 類,則對指向解除函數的指針的設置和存儲只能進行一次。
C++ 解決方案:類鏈表 本解決方案將 CList 類定義為從 LIST 結構導出的一個類,它通過存儲解除函數的單個值來處理單個存儲類型。請注重添加的 GetCurrentData() 函數,該函數完成從鏈表節點指針到數據偏移指針的數學轉換。
一個虛擬鏈表對象
// 定義解除函數指針
typedef void (*ListNodeDestructor)( void * );
// 未添加解除函數指針的鏈表
typedef struct ndliststruct { ndliststruct *next;
} ND_LIST, *pND_LIST;
// 定義處理一種數據類型的鏈表類
class CList : public ND_LIST { public: CList(ListNodeDestructor); ~CList(); pND_LIST AddToList( void * data, size_t datasize ); void *GetCurrentData(); void DeleteList( pND_LIST Head );
void CList::DeleteList( pND_LIST Head ) { pND_LIST Next; while( Head ) { Next = Head->next; m_DestructFunc( (void *) Head ); free( Head ); Head = Next; } }
// 確認它已被存儲 char * p = ((pND_LIST_DATA) pA_List_of_Data->GetCurrentData())->p;
d = new LIST_DATA; d->p = new char[24]; strcpy( d->p, "World" ); Head = pA_List_of_Data->AddToList( (void *) d, sizeof( pND_LIST_DATA ) ); // 該對象已被復制,現在刪除原來的對象 delete d;
// 確認它已被存儲 p = ((pND_LIST_DATA) pA_List_of_Data->GetCurrentData())->p;
// 刪除鏈表類,析構函數將刪除鏈表 delete pA_List_of_Data; }
小結 從前面的討論來看,似乎僅編寫一個簡單的鏈表就要做大量的工作,但這只須進行一次。很輕易將這段代碼擴充為一個處理排序、搜索以及各種其他任務的 C++ 類,并且這個類可以處理任何數據對象或類(在一個項目中,它處理大約二十個不同的對象)。您永遠不必重新編寫這段代碼。
參考資源
* The linux C Programming Lists 旨在幫助人們用 C 語言進行 Linux 編程,其中包括許多到郵件列表、常見問題解答、教程以及其他內容的鏈接。 * Microsoft Foundation Class 在其 CList 類中提供了類似的功能。MFC 中的 CList 以及別的類要求類型或類只能是一種類型,程序員對代碼沒有控制權,這一點與從零開始構建鏈表不同。
作者簡介 Thomas Wolfgang Burger 是 Thomas Wolfgang Burger Consulting 公司的老板。自 1978 年以來,他做過咨詢人員、教師、分析員和應用程序開發員??梢酝ㄟ^ twburger@bigfoot.com 與他聯系。
您對這篇文章的看法如何?
真棒! 好文章 一般,尚可 需提高 太差!
意見
(c) Copyright IBM Corp. 2001, (c) Copyright IBM China 2001, All Right Reserved 隱私 法律 聯系