| 一个带有解除函数的链表
typedef void (*ListNodeDestructor)( void * );
typedef struct liststruct { ListNodeDestructor DestructFunc; liststruct *next;
} LIST, *pLIST;
pLIST AddToList( pLIST Head, void * data, size_t datasize, ListNodeDestructor Destructor ) { pLIST newlist=NULL; void *p;
// 分配节点内存和数据内存 newlist = (pLIST) malloc( datasize + sizeof( LIST ) );
// 为这块数据缓冲区指定一个指针 p = (void *)( newlist + 1 );
// 复制数据 memcpy( p, data, datasize );
newlist->DestructFunc = Destructor;
// 将这个节点指定给链表的表头 if( Head ) { newlist->next = Head; } else newlist->next = NULL;
Head = newlist;
return Head; }
void DeleteList( pLIST Head ) { pLIST Next; while( Head ) { Next = Head->next; Head->DestructFunc( (void *) Head ); free( Head ); Head = Next; } }
typedef struct ListDataStruct { LPSTR p;
} LIST_DATA, *pLIST_DATA;
void ListDataDestructor( void *p ) { // 对节点指针进行类型转换 pLIST pl = (pLIST)p;
// 对数据指针进行类型转换 pLIST_DATA pLD = (pLIST_DATA) ( pl + 1 );
delete pLD->p; } pLIST Head = NULL;
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 ); } |