1.4 拥抱变化
在写双向链表时,都会编写一个list_print函数,它的功能是在屏幕上打印出整个双向链表的数据。当我们将 专用链表 修改为 通用链表后,使用list_print函数打印数据就会很困难。
因为:
在专用链表中,如果链表存放的是整形,用 %d 打印,存放字符串,用%s打印
在通用链表中,我们不知道链表要存放的是 整形 还是 字符串等等,那么我们就比较困难去实现打印数据函数了。
怎么解决呢??
在代码实现中,因为调用使用者知道链表中的数据类型。那么,就让调用者来实现。
通过函数指针来实现,具体做法如下:1. 定义函数指针类型 ,
在头文件中- typedef int (*print_data)(void *data);
typedef特殊功能:定义一系列相关的类型,我们这里定义了返回值是 int 型的函数指针2.声明list_print 函数 ,头文件中- int print_list(LIST *l,print_data print);
3.实现list_print 函数,C文件中- int print_list(LIST *l,print_data print)
-
{
-
LIST *list=l->next;//指向第一个 结点
-
printf("the length is %d\n",l->length);
-
while(list!=NULL)
-
{
-
print(list->data);//这里的print地址我们将在main中声明定义,
- //使用 函数指针
-
list=list->next;
-
}
-
return 0;
-
}
4.调用方法 ,在main中
实现print函数,static指明只能在当前C文件中有效使用
- static int print_char(void *data)
-
{
-
printf("%c\n",*(char*)data);
-
return 0;
-
}
int main()
{
...... print_list(list,print_char); //显示链表数据
......
}
这次修改为v4-0 : v4-0.rar
李先静写的代码也上传:写的好漂亮啊: 拥抱变化代码1.4.rar -----------------------------------------------------------------------------------
2011.5.16 又看了 回调函数 的实现- #include <stdio.h>
-
-
typedef int (*fun)(void *data); 定义函数类型
-
-
int print_fun(void *a, fun print) 其实应该在 封装库 C文件中
-
{
-
print(a); 还不知道,打印哪种类型 的数据。。只有调用者 自己知道
-
return 0;
-
}
-
*******************************************
-
int print_int(void *data) 主函数中 调用者实现 打印 int型 数据
-
{
-
printf("%d\n",*(int *)data);
- printf("(int *)data=%p\n",(int *)data); 打印 ch1 内存地址
-
//printf("%d\n",(int)data); 这个不行,为什么 书上是这么写 ???
-
return 0;
-
}
-
-
int main(int argc, char *argv[])
-
{
-
int ch1 = 234;
-
int ch2;
-
-
print_fun(&ch1,print_int); // 调用 C 文件中函数,
-
printf("&ch2=%p\n",&ch2);
-
return 0;
-
}
指针: 1 指向一块连续的内存 如:int 型,指向了4 个单元的连续地址
2. 指向连续内存的首地址
但是 void * 指针类型: 因为 void 是空类型,所以它 只有第二条: 指向连续内存的首地址
我们发现,ch1 ch2 还是相隔了 4 个单位(字节) ,void * 类型 只是指向了 首地址
- ywx@yuweixian:~/yu/professional/1$ ./huidiao
-
*(int *)data234
-
(int *)data=0xbfe891bc
-
&ch2=0xbfe891b8
阅读(760) | 评论(0) | 转发(0) |