- 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语言再谈链表学习:??相信学习过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)