首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
Linux资讯 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>编程开发>cc++>正文

教您在C/C 中如何构造通用的对象链表

一个简化的问题示例

链表的难点在于必须复制链表处理函数来处理不同的对象,即便逻辑是完全相同的。例如两个结构类似的链表:










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 结构需要包含一个一般的解除函数指针,这个指针可用来在将节点从链表中删除并解除它之前释放内存(或者关闭文件,或者调用关闭方法)。

一个带有解除函数的链表

共3页: 上一页 1 [2] [3] 下一页
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 );
  }   

上一篇:C 编程中的四个调试小技巧   下一篇:Windows下C语言网络编程快速入门


相关文档
·C 编程中的四个调试小技巧
·Windows下C语言网络编程快速入门
·详细解析C 编写的ATM自动取款机模拟程序
·如何在Linux桌面上搭建C/C IDE开发环境
·编程初级班:C语言程序设计入门系列之一
·与C/C 指针相似的C#代表元及事件触发
·编程初级班:C语言程序设计入门系列之二
·初学者必备:教你理解复杂的C/C 声明
·专家教您如何在C语言中巧用正则表达式
·编程秘籍篇:C语言高效编程的四大绝招
·细述C/C 字符指针数组及指向指针的含义
·浅议C语言中数组和指针的互操作
·移形幻影大法 C 程序员快速学习C#之二
·初学者编程入门:学习C 的最大难度
·移形幻影大法 C 程序员快速学习C#之一
·初学者编程入门:C 实用技巧讲解
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·用Eclipse平台进行C/C 开发
·在 Linux 中使用共享对象
·VS:针对Java开发人员的C#编程语言
·使用智能设备扩展在C#中开发自定义控件
·Visual C# 常见问题
·二级C语言实例解答
·一种被忽视的构造和整数溢出重现
·轻轻松松C to C
·与用于 C 的ISO标准保持一致
·用C 的托管扩展针对Windows编程
·运行时和编译时的安全性检查
·轻轻松松C to C (二)
  阅读排行
·c/c++ 学习-read 函数和 write 函数
·程序员眼中的qmail(qmail源代码分析)
·Awk 基础入门:Awk 实例编程
·autoconf 和automake生成Makefile文件
·Linux下的多进程编程
·入门文章:教你学会编写Linux设备驱动
·C++自动化(模板元)编程基础与应用
·使用 GDB 调试多进程程序
·Qt 不规则窗体的实现
·嵌入式程序员应知道的几个基本问题
·Linux操作系统中GCC的应用介绍
·C语言中的指针和内存泄漏
·用GNU profiler提高代码运行速度
·vi 中的正则表达式 (Regular Expressio
·Linux 套接字编程中的 5 个隐患
网摘收藏: