说明
  本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。
  QQ 群 号:513683159 【相互学习】
内容来源
  《系统程序员成长计划》

上一篇:读书笔记 ——《系统程序员成长计划》篇3:双链表
下一篇:读书笔记 ——《系统程序员成长计划》篇5:数据放在哪?

目录:

  • 一、需求描述
  • 二、解决方案
    • 1、实现多个函数,需要哪个调用哪个
    • 2、传入附加参数决定打印的数据类型
    • 3、回调函数法
      • ①定义函数指针类型
      • ②声明dlist_print函数
      • ③实现dlist_print函数
      • ④调用方法
  • 注意点
    • 1、不要写重复代码
    • 2、任何回调函数都要有上下文

一、需求描述

  为通用链表编写一个通用的打印函数,即:链表结点的数据类型可能千变万化,这就导致进行输出时不同数据类型都需要实现一个print函数

二、解决方案

1、实现多个函数,需要哪个调用哪个

  为每种数据类型编写对应的print函数,由于效果类似故会带来大量重复代码。

2、传入附加参数决定打印的数据类型

  需有穷的将可能情况都实现,较为复杂。

3、回调函数法

  将具体打印输出的函数由调用者自己编写,可准确适配数据类型。
  具体实现步骤:

①定义函数指针类型

typedef DListRet (*DListDataPrintFunc)(void *data);

②声明dlist_print函数

DlistRet dlist_print(DList *thiz,DListDataPrintFunc print);

③实现dlist_print函数

DlistRet dlist_print(DList *thiz,DListDataPrintFunc print)
{DListRet ret = DLIST_RET_OK;DListNode* iter = thiz->first;while(iter != NULL){print (iter->data);iter = iter->next;}return ret;
}

④调用方法

static DListRet print_int(void* data)
{printf ("%d",(int)data) ;return DLIST_RET_OK;
}
...
dlist_print(dlist, print_int);

注意点

1、不要写重复代码

  若有几个类似功能的函数,则要注意去除重复代码。
  重复代码的缺点:
    1.重复代码更容易出错。
    2.重复代码经不起变化。

2、任何回调函数都要有上下文

  上下文(context = ctx):回调函数的额外参数。(避免使用全局变量)
  为保证能保存任何数据类型,选择void*数据结构。
  通常将其置于第一个形参,上面的print函数中thiz == ctx

读书笔记 ——《系统程序员成长计划》篇4:拥抱变化相关推荐

  1. 读书笔记 ——《系统程序员成长计划》篇3:双链表

    说明:   本文章旨在总结备份.方便以后查询,由于是个人总结,如有不对,欢迎指正:另外,内容大部分来自网络.书籍.和各类手册,如若侵权请告知,马上删帖致歉.   QQ 群 号:513683159 [相 ...

  2. 读书笔记 ——《系统程序员成长计划》篇5:数据放在哪?

    说明:   本文章旨在总结备份.方便以后查询,由于是个人总结,如有不对,欢迎指正:另外,内容大部分来自网络.书籍.和各类手册,如若侵权请告知,马上删帖致歉.   QQ 群 号:513683159 [相 ...

  3. 读书笔记 ——《系统程序员成长计划》篇2:封装

    说明:   本文章旨在总结备份.方便以后查询,由于是个人总结,如有不对,欢迎指正:另外,内容大部分来自网络.书籍.和各类手册,如若侵权请告知,马上删帖致歉.   QQ 群 号:513683159 [相 ...

  4. 读书笔记 ——《系统程序员成长计划》篇7:动态数组

    说明:   本文章旨在总结备份.方便以后查询,由于是个人总结,如有不对,欢迎指正:另外,内容大部分来自网络.书籍.和各类手册,如若侵权请告知,马上删帖致歉.   QQ 群 号:513683159 [相 ...

  5. 读书笔记 ——《系统程序员成长计划》篇1:代码风格

    说明:   本文章旨在总结备份.方便以后查询,由于是个人总结,如有不对,欢迎指正:另外,内容大部分来自网络.书籍.和各类手册,如若侵权请告知,马上删帖致歉.   QQ 群 号:513683159 [相 ...

  6. 读书笔记 ——《系统程序员成长计划》篇6:写的又快又好的秘诀

    说明:   本文章旨在总结备份.方便以后查询,由于是个人总结,如有不对,欢迎指正:另外,内容大部分来自网络.书籍.和各类手册,如若侵权请告知,马上删帖致歉.   QQ 群 号:513683159 [相 ...

  7. 啊哈c语言读后感500字,《麦田里的守望者》读后感读书笔记500字五篇

    <<麦田里的守望者>读后感读书笔记500字五篇>由会员分享,可在线阅读,更多相关<<麦田里的守望者>读后感读书笔记500字五篇(5页珍藏版)>请在人人文 ...

  8. 系统程序员成长计划-管道过滤器(Pipe-And-Filter)模式

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 系统程序 ...

  9. 《系统程序员成长计划》成长过程

    转载时请注明出处和作者联系方式 文章出处:http://www.limodev.cn/blog 作者联系方式:李先静 <xianjimli@gmail.com> <系统程序员成长计划 ...

  10. 《Android群英传》读书笔记---10.2(终篇)

    <Android群英传>读书笔记-10.2 标签(): android中级 读书笔记 Activity过渡动画 曾经的 Android在Activity之间进行跳转的时候,只是非常生硬的切 ...

最新文章

  1. java方块排序_[代码全屏查看]-NxN方块排序,可自动运行
  2. Android Volley完全解析2:使用Volley加载网络图片
  3. 卷积神经网络Convolutional Neural Network (CNN)
  4. ftp协议是一种用于_______的协议_网工知识角|快速理解FTP和TFTP的区别,实用收藏...
  5. 下载安装oracle旧版本oracle 12c的详细步骤
  6. Python操作Excel表格
  7. C# WinForm中获取当前程序运行目录的方法
  8. matlab解六元一次方程,如何用MATLAB编写六元一次方程组
  9. 【FPGA入门一】一个简单的LED流水灯
  10. 前端自学之HTML(02)
  11. linux的层次结构模型,linux 设备模型(1)
  12. 逆天了word 90后:情人节巧用小小技术就俘获了女神
  13. 算法学习之Trie树
  14. 源码解析-深刻理解Hash HashTable HashMap原理及数据hash碰撞问题
  15. 人的一生,到底在追求甚麼
  16. 实物图鉴TMS320F2812PGFA代理销售现货价格
  17. 完美解决 bash: /dev/fd/63: No such file or directory
  18. BZOJ2535: [Noi2010]Plane 航空管制2
  19. Inno Setup 语法
  20. 【Qt】条形码制作器(Code39编码)

热门文章

  1. 云计算中的Server Consolidation
  2. Consolidation Mappings
  3. 图的表示(Adjacency List + Adjacency Matrix)
  4. python——自动化报告word(1)
  5. 使用 dfuse 无缝过渡到 EOSIO 1.8
  6. 多个订单待付款半小时倒计时功能
  7. flea-jersey使用之Flea RESTful接口客户端接入
  8. 带sex的net域名_域名劫持的几种方法、域名劫持有什么方式
  9. 滴滴出行,我看行!裁员光明正大,补偿给足
  10. 以太网协议------802.1q,802.1d,802.1x