学C语言链表.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
学C语言链表

学C语言链表学C语言再谈链表学习: ??相信学习过C语言和数据结构的人,都会学习链表。N多的同学都会做链表练习。不过都是基于现成数据结构一书提示的代码,不过它们并不通用,表现在一个程序中你不能使用包含多数固定格式结构的链表。现在,让我们百尺竽头,更进一步学习C中的链表,让我们一起来看看C中的通用链表的一种做法: ??一、用面象对象的思想重新设计我们的链表: ??试想想链表中哪些成为我们的设计要素呢?观察一下链表,链表的元素个数是链表的一个组成部分,链表的节点指针也是链表的一个组成部分,链表中的节点数据中包含我们的真实数据,从这些现象,我们上升到一个层次来看刚才所说有这三点,元素个数、节点指针、节点数据成了我们关注的对象,抽象的提炼就是这么来的,所以根据这些抽象的结果,我们可以这样用C来定义节点,放入list.h中: /** *??链表结点定义 */ typedef struct tag_node { ??? void *data;???????????? //结点数据指针 ??? struct tag_node *next;??//结点指针 }node, *Node; ??二、void指针在链表中的应用: ??我们学习过C语言指针的同学都知道,在C指针中有一个特殊的东西,void*,这个东西可以保存任意类型数据的地址,所以它就是我们通用链表的核心部件,void指针在没有附值初始化前,是指向没有意义的数据的,另外我们也要注意的是,使用void*做为我们的结点数据指针所带来的一个问题,如何保证客户添加进链表中的元素是同一类元素?这个问题我先提在这里,大家思考一下。 ??三、数据隐藏与封装: ??链表中的一些元素,我们不希望用户进行修改,怎么办?把它们隐藏进来!如元素个数,这是表示链表元素的属性,不能让用户随意修改,节点指针,我们也不希望用户直接访问,所以我们用一个如下的结构来进行数据隐藏,本例中我们把它放入一个叫list_impl.h的头文件中,并不提供给最终的用户,所以用户其实不知道我们的链表有些什么属性,我们只提供公用接口函数用于访问链表的各种功能。 ------------------------ /** *??链表私有数据,对用户隐藏 */ typedef struct list_private { ??? Node head;????????????????????? //头节点 ??? Node tail;????????????????????? //尾节点 ??? unsigned int size;??????????????//元素个数 ??? unsigned int data_size;?????????//元素数据大小 } lpri, *Lpri; ---------------------------- 为了让我们的链表知道结点指针所指向的数据,它的大小是多少,需要一个新的成员来描述,也就是上面的data_size。 ??四、将上面两个部分集合进来,型成我们的通用链表,放入list.h中: 请看下面的结构定义: typedef struct tag_list { ??? void *lprivate;????????? //私有数据 }clist, *List; 看起来是不是怪怪的?呵呵,对于用户来说,只需要使用这个自定义类型List既可。它可以做什么?可以让你的程序使用多个带数据的结构体,所有的链表操作如创建、添加、删除、排序这些过程在代码中都是相用的,但你没有写重复代码就实现了,这就是程序设计的思考所带来的 效果。下面让我们看一看链表是如何创建和销毁的。 #include list.h #include list_impl.h /** *??功能:链表创建 *??参数:data_size -- 元素数据大小,必须大于0 *????????destructor -- 元素析构函数指针,用于释放动态元素分配. *??返回:已初始化链表指针 *??备注:链表本身动态分配,由list_destroy函数管理释放, 在元素 *????????内数据为非动态分配情况下,destructor 可为空指针, */ List list_create(unsigned int data_size, list_destructor destructor) { ??? List list = NULL; ??? assert(data_size 0); ??? list = NEWC(1, clist); ??? if(list != NULL) ??? { ????????Lpri lp;????????????????????????????????//链表私有数据 ????????No

文档评论(0)

qwd513620855 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档