- 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++的时候 大家一定会对 链表 很难弄明白所以就给大家一个例子重点的说明了链表的用法 还加了很详细的注释例子:#include iostreamusing namespace std;struct Node? ? ? ? //很多同学对这个名字很模糊,节点的英文就是Node{? ? ? ? ? ? ? ? ? //不一定非要用Node的。? int data;? ? ? ? ? //节点中的数据? 结构体Node的成员变量? Node* next;? ? ? ? //指向下一节点的指针,习惯用next命名 结构体Node的成员变量? Node( const int d=int() )? //结构体也可以有构造函数 ,d=T()来指定默认值? :data(d),next(NULL)? //用构造函数来初始化成员变量data和指针? {} //所有数据类型,默认初始化都为0,这里data默认初始化为0};//老师是把Node作为封装类的内包结构体,这里我给分开写一下class Chain? ? //封装链表{private:? ? ? ? ? //数据成员通常都是private的? Node* head;? //首先,我们要一个Node型的指针来保存链表的第一个节点;? int length; //再用一个整型变量来记录当前链表内的节点数public:? Chain()? ? ? ? ? //在构造函数里建立一个空链表,即head指向NULL? :head(NULL),length(0){}? //节点数为0;//这里小小插句嘴:当我们在类中定义函数时(不是声明),相当于在前面加上一个inline修饰? void delall()? ? //见名知意,这个函数用来删除链表中的所有节点? {? ? ? Node* pdel;? ? ? //定义一个Node型指针用来保存要删除的节点? ? ? while( head != NULL ) //当head的指向不为NULL时,就是链表中还存在节点? ? ? {? ? ? ? ? pdel = head; //这里备份head的当前指向节点? ? ? ? ? head = head-next; //把head的指向改变为下一节点? ? ? ? ? delete pdel;? //把head的原指向给删除掉? ? ? }? ? //如此一直下去,尾节点的next肯定是指向NULL的,那删除最后一个的时候? ? //head就被赋值为NULL,不满足循环条件,退出循环? ? ? length = 0;? ? //把节点数归零? }? ~Chain(){ delall(); } //在析构函数中调用delall函数,来完成对象销毁时清理工作? //这样一个链表必须具备的功能就实现了。下面我们来实现他的增、删、查、改功能? Node* getpoint( int position )? //相信大家已经发现,对链表的操作,其实全部? {? //通过指针来实现的,那就需要定义一个函数来返回当前节点的指针(引用)? ? ? if( position0 || positionlength )? //对节点编号进行合法检查? ? ? ? ? position = length;//如果是非法节点编号,那么就把他修改为最后一个节点编号? ? ? if( position==0 ) //如果编号为0,那就是第一个节点了,? ? ? ? ? return head;? //直接返回head就是指向第一个节点的,注意返回的是head本身? ? ? Node* head_bak = head; //如果编号合法并且不是第一个节点,就开始遍历链表? ? ? for( int i=1; i position; i++ ) //有人从QQ上问我,为什么不直接用head? ? ? {//非要定义一个head_bak,注意这里修改的是成员变量。你把head改了,以后到哪找链表? ? ? //我们都是通过head一个一个的往下找节点的。head被修改了。后果显而易见? ? ? ? ? ? ? head_bak = head_bak-next; //同过备份的指针来遍历到指定编号前一个节点? ? ? }? //关于为什么i不从0开始,老师已经说过了,减少运算,提高效率? ? ? return head_bak-next;? //这里如果返回head_bak的话。那就是需要的前一个节点了? }? void insert( const int data, int position )
文档评论(0)