回调函数
时间:2022-04-22
本文章向大家介绍回调函数,主要内容包括首先定义查找函数、比较函数、函数中的调用、全部代码、运行示例、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
有点类似模板的功能,可以使用函数指针作为参数,当调用函数时,使用void *进行传递参数,细致比较时,再用int *之类的进行强制转换。回调函数,其实就是在参数中定义函数,调用时,回到主函数去调用这个函数。仔细用法如下:
首先定义查找函数
Node * search_list(Node *node, void const *value, int (*compare)(void const *,void const *)){
while(node!=NULL){
if(compare(&node->data,value) == 0 )
break;
node = node->next;
}
return node;
}
比较函数
int compare_ints(void const *a,void const *b){
if( *(int *)a == *(int *)b)
return 0;
else
return 1;
}
函数中的调用
int *desire = (int *)malloc(sizeof(int));
*desire = 3;
Node *n1 = (Node *)malloc(sizeof(Node));
n1 = search_list(L->next,desire,compare_ints);
if(n1!=NULL)
printf("找到了%d",n1->data);
全部代码
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 typedef struct Node{
5 int data;
6 struct Node * next;
7 }Node;
8
9 void createList(Node * L,int len);
10 void showList(Node *L);
11 void clearList(Node *L);
12 void getNode(Node *L,int n,Node *tar);
13 int insertNode(Node *L,int n,int num);
14 int deleteNode(Node *L,int n);
15 Node * search_list(Node *node, void const *value, int (*compare)(void const *,void const *));
16 int compare_ints(void const *a,void const *b);
17
18 int main()
19 {
20 Node *L= (Node *)malloc(sizeof(Node));
21
22 createList(L,5);
23 showList(L);
24
25 Node *tar= (Node *)malloc(sizeof(Node));
26 getNode(L,3,tar);
27 printf("the third is:%dn",tar->data);
28
29 if(insertNode(L,3,0))
30 showList(L);
31
32 printf("回调函数:n");
33 int *desire = (int *)malloc(sizeof(int));
34 *desire = 3;
35 Node *n1 = (Node *)malloc(sizeof(Node));
36 n1 = search_list(L->next,desire,compare_ints);
37 if(n1!=NULL)
38 printf("找到了%d",n1->data);
39
40 /*
41 if(deleteNode(L,3))
42 showList(L);
43
44 clearList(L);
45 showList(L);
46 */
47
48 /**desire = 9;
49 Node *n2 = search_list(L,desire,compare_ints);
50 if(n2!=NULL)
51 printf("找到了%d",n2->data);
52 *desire = 7;
53 Node *n3 = search_list(L,desire,compare_ints);
54 if(n3!=NULL)
55 printf("找到了%d",n3->data);*/
56 getchar();
57 return 0;
58 }
59 Node * search_list(Node *node, void const *value, int (*compare)(void const *,void const *)){
60 while(node!=NULL){
61 if(compare(&node->data,value) == 0 )
62 break;
63 node = node->next;
64 }
65 return node;
66 }
67 int compare_ints(void const *a,void const *b){
68 if( *(int *)a == *(int *)b)
69 return 0;
70 else
71 return 1;
72 }
73
74 void createList(Node * L,int len){
75 int i;
76 Node * p;
77 L->next = NULL;
78 for(i=0;i<len;i++){
79 p = (Node *)malloc(sizeof(Node));
80 p->data = 2*i+1;
81 p->next = L->next;
82 L->next = p;
83 }
84 }
85
86 void showList(Node *L){
87 Node *p = (Node *)malloc(sizeof(Node));
88 p=L->next;
89 while(p){
90 printf("%d->",p->data);
91 p=p->next;
92 }
93 printf("nulln");
94 free(p);
95 }
96
97 void clearList(Node *L){
98 Node *p,*q;
99 p=L->next;
100 while(p){
101 q=p->next;
102 free(p);
103 p=q;
104 }
105 L->next=NULL;
106 }
107
108 void getNode(Node *L,int n,Node *tar){
109 int i=1;
110 Node *p;
111 p=L->next;
112 while(p && i<n){
113 p=p->next;
114 i++;
115 }
116 if(!p || i>n)
117 printf("error!");
118 tar->data=p->data;
119 }
120
121 int insertNode(Node *L,int n,int num){
122 int i=1;
123 Node *p = L->next;
124 while( p && i<n-1){
125 p=p->next;
126 i++;
127 }
128 if(!p || i>n-1)
129 return 0;
130 Node *q = (Node *)malloc(sizeof(Node));
131 q->data = num;
132 q->next = p->next;
133 p->next = q;
134 return 1;
135 }
136
137 int deleteNode(Node *L,int n){
138 int i=1;
139 Node *p = L->next;
140 Node *q;
141 while( p->next && i<n-1){
142 p=p->next;
143 i++;
144 }
145 if( !(p->next) || i>n-1)
146 return 0;
147 q=p->next;
148 p->next = q->next;
149 free(q);
150 return 1;
151 }
运行示例
- spring-boot 速成(2) devtools之热部署及LiveReload
- 使用git提交项目
- JavaScript中的内置对象--Number对象
- 自动驾驶落地,究竟被什么绑住了脚?
- JDBC(三)数据库连接池(DBCP、C3P0)
- Single Page Application概览
- HashSet集合中hashCode及equals方法详解
- 企鹅智造企业发展论坛:共话小程序生态下的企业营销
- MySQL(十六)之MySQL用户管理
- JavaScript中this关键字使用
- thrift:swift项目笔记
- Java常用类(五)之集合工具类Collections
- Windows8小技巧(1)—Map Network Drive
- mysql: Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for opera
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 最大子序列和的接口函数(3)
- 【剑指Offer】二叉树的深度
- 运行时间中的对数
- IIC协议
- 通过例子学习编写shell
- 【redis6.0.6】redis源码慢慢学,慢慢看 -- 第三天:MakeFile
- 继续学习Shell脚本(详细)
- 将linux终端的输出信息保存到log中
- UNIX网络编程卷1(第三版)一个简单的时间获取服务器的程序
- Python数据分析实战(3)Python实现数据可视化
- xresloader转表工具链增加了一些新功能(map,oneof支持,输出矩阵,基于模板引擎的加载代码生成等)
- 数据结构之树
- UNIX网络编程卷1(第三版)套接字编程简介
- UNIX网络编程卷1(第三版)readn,writen和readline函数
- UNIX网络编程卷1(第三版)基本TCP套接字编程