- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
学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。所以从一个全新的观点上来看,结构中的成员变量,就是类的属性,另一个需要注意的是,typedef struct list_private{。。。}lpri, *Lpri;这句只是定义了一个同一类型数据结构的模版,和C++中的类是一个概念,类只是描述同一类对象的模版,而对象是根据这个模版里“印”出来的,对象具有模版所有相同的属性,和模版不同的是,它有自己的实际的属性值,打个最简单的比方就是,你我都是人,但你只所以和我不同,是因为虽然我们都是人,都有名字,体重,但你的名字和我不一样,你叫张三,而我叫李四,你重90公斤,而我重100公斤,这就是对象和类的基本概念,面象对象程序具有抽象、封装、多态、继承等重要的特性。 四、将上面两个部分集合进来,型成我们的通用链表,放入list.h中:请看下面的结构定义:typedef struct tag_list{ void *lprivate; //私有数据}clist, *List;看起来是不是怪怪的?呵呵,对于用户来说,只需要使用这个自定义类型List既可。它可以做什么?可以让你的程序使用多个带数据的结构体,所有的链表操作如创建、添加、删除、排序这些过程在代码中都是相用的,但你没有写重复代码就实现了,这就是程序设计的思考所带来的效果。下面让我们看一看链表是如何创建和销毁的。#include list.h#include list_impl.h/*** 功能:链表创建* 参数:data_size -- 元素数据大小,必须大于0* destructor -- 元素析构函数指针,用于释放动态元素分配
文档评论(0)