内容字号:默认大号超大号

段落设置:段首缩进取消段首缩进

字体设置:切换到微软雅黑切换到宋体

ATOS比例换向阀DKZOR系列压力控制范围葡京赌城网址

新澳门葡京赌城网址周立功阐释高效的双向链表如何用

2018-02-07 16:15 出处:葡京赌城网址 人气:   评论(0

  近日周立功教授公开了数年的心血之作《程序设计与数据结构》,电子版已无偿性分享到电子工程师与高校群体下载,经周立功教授授权,特对本书内容进行连载。

  其中,p_head为指向链表头结点的指针,p_node为指向待添加结点的指针,的双向链表如何用其使用范例详见程序清单3.38。

  实际上循环链表,无论是头结点、尾结点还是普通结点,其本质上都是一样的,均为p_next指向下一个结点,p_prev指向其上一个结点。因此,对于添加结点而言,无论将结点添加到链表头、链表尾还是其它任意,其操作方法完全相同。为此,需要提供一个更加通用的函数,可以将结点添加到任意结点之后,其函数原型为:

  其中,p_head为指向链表头结点的指针,p_pos指定了添加的,新结点即添加在该指针指向的结点之后;p_node为指向待添加结点的指针。比如,同样将结点添加到链表尾部,其使用范例详见程序清单3.40。

  由此可见,将尾结点作为结点添加的,同样可以将结点添加至尾结点之后,即添加到链表尾部。显然,也就没有必要再编写dlist_add_tail()实现代码了,使用dlisd_add()即可,修改dlist_add_tail()函数的实现,详见程序清单3.41。

  为了实现dlist_add()函数,可以先查看添加一个结点到任意结点之后的情况,详见图3.19。图中展示的是一种通用的情况,由于结点的添加(头、尾或其它任意)与添加结点的方法没有关系,因此没有特别标明头结点和尾结点。

  其实,对比图3.18和图3.19可以发现,图3.18展示的只是图3.19的一个特例,即恰好图3.19中的新结点之前的结点就是尾结点,添加结点的过程同样需要修改4个指针的值。为便于描述,将新结点前的结点称之为前结点,新结点之后的结点称之为后结点。显然,在添加新结点之前,前结点的下一个结点即为后结点。对设置4个指针值的描述如下:

  对比将结点添加到链表尾部的描述,只要将描述中的“前结点”换为“尾结点”,“后结点”换为“头结点”,它们的含义则完全一样,显然将结点添加到链表尾部只是这里的一个特例,添加结点的函数实现详见程序清单3.42。

  尽管的函数在实现时并没有用到参数p_head,但还是将p_head参数传进来了,因为实现其它的功能时将会用到p_head参数,比如,判断p_pos是否在链表中。

  有了该函数,添加结点到任意就非常灵活了,周立功阐释高效比如,提供一个添加结点到链表的头部,使其作为链表的第一个结点的函数,其函数原型为:

  此时,头结点即为新添加结点的前结点,直接调用dlist_add()即可实现,其实现范例详见程序清单3.43。

  其中,p_head为指向链表头结点的指针, p_node为指向待删除结点的指针,使用范例详见程序清单3.44。

  为了实现dlisd_del()函数,可以先查看删除任意结点的示意图,图 3.20(1)为删除节点前的示意图,图 3.20(2)为删除节点后的示意图。

  为了防止删除头结点,程序中对p_head与p_node进行了比较,当p_node为头结点时,则直接返回错误。

  其中,p_head指向链表头结点,pfn_node_process为结点处理回调函数,每遍历到一个结点时,均会调用该函数,便于用户处理结点。dlist_node_process_t类型定义如下:

  dlist_node_process_t类型参数为一个p_arg指针和一个结点指针,返回值为int类型的函数指针。每遍历到一个结点均会调用pfn_node_process指向的函数,便于用户根据需要自行处理结点数据。当调用该回调函数时,传递给p_arg的值即为用户参数,其值与dlist_traverse()函数的第3个参数一样,即该参数的值完全是由用户决定的;传递给p_node 的值即为指向当前遍历到的结点的指针。当遍历到某个结点时,如果用户希望终止遍历,此时,只要在回调函数中返回负值即可终止继续遍历。一般地,若要继续遍历,则函数执行结束后返回0即可。dlist_foreach()函数的实现详见程序清单3.46。

  同样以int类型数据为例,来展示这些接口的使用方法。为了使用链表,首先应该定义一个结构体,将链表结点作为其一个,此外,再添加一些应用相关的数据,如定义如下包含链表结点和int型数据的结构体:

  与单向链表的综合范例程序比较可以发现,程序主体是完全一样的,仅仅是各个结点的类型发生了改变。对于实际的应用,如果由使用单向链表升级为双向链表,虽然程序主体没有发生改变,但由于类型的变化,则不得不修改所有程序代码。这是由于应用与具体数据结构没有分离造成的,因此可以进一步将实际应用与具体的数据结构分离,将链表等数据结构抽象为“容器”的概念。

  在号后台回复关键字“程序设计”,即可在线阅读《程序设计与数据结构》;回复关键字“编程”,即可在线阅读《面向AMetal框架与接口的编程(上)》。

  文章出处:【微信号:Zlgmcu7890,微信号:周立功单片机】欢迎添加关注!文章转载请注明出处。

  C语言的精髓点在哪? 学到多少东西才能够达到做项目的标准?学习的时候需要注意哪些细节点?疑问太多以至....

  虽然该程序的逻辑与程序清单6.70 所示的应用程序基本一致,但由于使用的接口是特殊功能控制接口,与具....

  当矩阵扩大到一定数目时,逐行扫描的方显得费时,如果需要对2 个以上的按键“同时”操作时,则处理起....

  面向通用接口的编程,虽然面向接口的编程简单易懂,但无法做到最大程度上地重用应用程序,这是导致软件开发....

  对AMetal框架进行了详细介绍,通过阅读这本书,你可以学到高度复用的软件设计原则和面向接口编程的开....

  AMetal 提供了数码管和矩阵键盘联合使用的驱动,其本质上就是数码管驱动和矩阵键盘驱动的简单整合,....

  在接口实现中,没有与硬件相关的实现代码,仅仅是简单的调用了抽象方法。抽象方法需要由具体的温度采集设备....

  由于涉及编程,学习ARM单片机系统对于从事电子电的设计者来说是有些困难的,学习知识不难,难的是理清....

  本文主要介绍了调试Python程序代码的几种方法总结。第一种方法简单直接有效,就是用print把....

  AT24C512是Atmel公司生产的64KB串行电可擦的可编程存储器,内部有512页,每一页为12....

  一个通用的24C01-24C256共9种EEPROM的字节读写操作程序,此程序有五个入口条件,分别为....

  算法+数据结构=应用程序。算法是解决问题的步骤;程序是算法的代码实现算法要依靠程序来完成功能;程序....

  相关链接:伟德betvictor 伟德国际2018 伟德betvictor2018 2018betvictor.com betvictor 2018

欢迎进入澳门博总汇,这里都是大型信誉好的娱乐品牌,葡京赌城网址
分享给小伙伴们:
本文标签: 循环链表

相关文章

评论

发表评论愿您的每句评论,都能给大家的生活添色彩,带来共鸣,带来思索,带来快乐。

签名: 验证码: 点击我更换图片

评论列表

    Copyright © 2015-2017 葡京赌城网址 版权所有 网站地图