一个简化的问题示例
文章整理:西部数码--专业提供域名注册、虚拟主机服务
链表的难点在于必须复制链表处理函数来处理不同的对象,即便逻辑是完全相同的。例如两个结构类似的链表:
struct Struct_Object_A
{
int a;
int b;
Struct_Object_A *next;
}OBJECT_A;
typedef struct Struct_Object_B
{
int a;
int b;
int c;
Struct_Object_B *next;
}OBJECT_B;
上面定义的两个结构只有很小的一点差别。OBJECT_B 和 OBJECT_A 之间只差一个整型变量。但是,在编译器看来,他们仍然是很不同的。必须为存储在链表中的每个对象复制用来添加、删除和搜索链表的函数。为了解决这个问题,能够使用具备全部三个变量的一个联合或结构,其中整数 c 并不是在任何的情况下都要使用。这可能变得很复杂,并会形成不良的编程风格。
C 代码解决方案:虚拟链表
此问题更好的解决方案之一是虚拟链表。虚拟链表是只包含链表指针的链表。对象存储在链表结构背后。这一点是这样实现的,首先为链表节点分配内存,接着为对象分配内存,然后将这块内存分配给链表节点指针,如下所示:
虚拟链表结构的一种实现
typedef struct liststruct
{
liststruct *next;
}LIST, *pLIST;
pLIST Head = NULL;
pLIST AddToList(pLIST Head, void * data, size_t datasize)
{
pLIST newlist = NULL;
void *p;
// 分配节点内存和数据内存
newlist = (pLIST) malloc(datasize sizeof(LIST));
// 为这块数据缓冲区指定一个指针
p = (void *)(newlist 1);
// 复制数据
memcpy(p, data, datasize);
// 将这个节点指定给链表的表头
if(Head)
newlist->next = Head;
else
newlist->next = NULL;
Head = newlist;
return Head;
}
链表节点现在建立在数据值副本的基本之上。这个版本能很好地处理标量值,但不能处理带有用 malloc 或 new 分配的元素的对象。要处理这些对象,LIST 结构需要包含一个一般的解除函数指针,这个指针可用来在将节点从链表中删除并解除他之前释放内存(或关闭文档,或调用关闭方法)。
一个带有解除函数的链表
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;
// 本文转自 C Builder 研究 - http://www.ccrun.com/article.asp?i=622&d=m74omi
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
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
在C/C 中如何构造通用的对象链表
来源:互联网
作者:west263.com
时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
热点关注
- C 的面试题哦~
- hd7279键盘显示芯片c51代
- C语言的常用库函数使用方
- 什么是迭代跟递归算法?
- c#中父窗口和子窗口之间
- c#结合串口通信类实现串
- c#利用正则表达式实现字
- 用visual c#中轻松浏览
- C语言的常用库函数使用方
- C语言面试题大汇总之华为
- c#.net网络程式研发-sock
- c#实现smtp服务器,使用t
- C语言图像处理
- 如何自画ListView的Item(
- Linux下C语言编程基础知
- C 中对浮点数的格式化显
- 用c#实现由15位身份证号
- Windows Mobile 研发常见
- 在Visual C 中使用fopen
- Linux on POWER 中的 GNU
- uC/OS-II在ARM系统上的移
- C 嵌入式系统中应用
- C/C 中动态链接库的创建
- 关于c#中的datetime类型
- 用c#实现智能设备上的not
- C 中的指针(三) 智能指
- ASP.NET中使用TreeView控
- 使用c#创建sql server的
- C 中的动态多维数组
- c# enum设计和使用的相关
- Visual C /MFC入门教程
- 获取WinNT/Win2k当前用户
- 实现ComboBox输入文字的
- excel 2007单元格及内容
- C语言经典100例(一)
IDC资讯
虚拟主机
域名注册
托管租用
vps主机
智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD



