linux c 回调函数用户参数,linux c回调函数

common.h

#include

#include

#include

/* 定义一个自定义类型的函数指针,返回值是整型,两个参数是两个任意类型的指针

* 该函数的两个参数分别是需要比较的两个对象,在比较时将其转换

* 如果大于则返回1,等于则返回0,小于则返回-1

*/

typedef int (*cmp)(void *, void *);

typedef struct book* Book;

/* 图书结构

* id : 图书的编号

* name : 图书的名字

*/

struct book{

int id;

char name[10];

};

/* 求最大对象的函数 */

extern void *max(void *array[], int len, cmp func);

/* 比较两个整数的函数 */

extern int cmp_int(void *p, void *q);

/* 比较两个图书结构的函数 */

extern int cmp_struct(void *p, void *q);

/* 插入一个结构 */

extern int insert_struct(Book *pos, int id, char * name);

/* 插入一个整数 */

extern int insert_int(int **pos, int val);

cmp.c

#include "common.h"

int cmp_int(void *p, void *q)

{

int *a, *b;

a = (int *)p; /* 将参数中void *类型的指针转换为int型的指针 */

b = (int *)q;

if(*a > *b) /* 比较两个值的大小 */

return 1;

else if(*a < *b)

return -1;

else

return 0;

}

int cmp_struct(void *p, void *q)

{

Book a, b;

a = (Book)p; /* 将参数中void *类型的指针转换为Book类型的指针 */

b = (Book)q;

if(a->id > b->id) /* 比较成员变量id的大小 */

return 1;

else if(a->id < b->id)

return -1;

else

return 0;

}

obj.c

#include "common.h"

/* 创建一个图书结构,并将其插入到指定的位置

* pos : 保存新创建的结构体的数组的指针,注意这是一个指向Book指针类型的指针

* id : 新结构体的id

* name : 新结构体的name

* 如果成功创建一个新结构并将其设置到指定位置,则返回0,失败则返回-1

*/

int insert_struct(Book *pos, int id, char *name)

{

Book p;

p = (Book)malloc(sizeof(struct book)); /* 分配一个空间 */

if(p == NULL){

perror("fail to malloc");

return -1;

}

p->id = id;

strcpy(p->name, name); /* 对结构体变量进行赋值 */

*pos = p; /* 将结构体变量赋值到数组中 */

return 0;

}

/* 为了统一模式,添加一个插入整型元素的函数,这个函数也可以不要 */

int insert_int(int **pos, int val)

{

int *p;

p = (int *)malloc(sizeof(int)); /* 分配一个整型数据 */

*p = val; /* 将整型数据的值赋值到新分配的空间中 */

*pos = p; /* 将整型数据设置到数组中 */

return 0;

}

max.c

#include "common.h"

/* 求序列中最大对象的函数,并且返回最大对象的位置

* array : 存储对象的数组,每个元素是一个指向对象的指针

* len : 存储对象的数组的元素个数

* func : 用于比较两个对象的回调函数

*/

void *max(void *array[], int len, cmp func)

{

int i;

void *tmp;

tmp = array[0]; /* 初始时最大对象是数组中的第一个对象 */

for(i = 1; i < len; i++) { /* 遍历数组,比较每个对象 */

/* 比较两个对象,调用用户提供的比较函数。

* 如果当前对象大于之前的最大对象,则替换掉最大对象

*/

if((*func)(tmp, array [i]) == -1)

tmp = array [i];

}

return tmp; /* 返回最大对象 */

}

main.c

#include "common.h"

#define MAX 3

int main(void)

{

Book array1[MAX];/* 结构体变量的数组 */

int *array[MAX];/* 整型变量的数组 */

int i;

int id;

int val;

char name[10];

Book res1;

int *res2;

for(i = 0; i < MAX; i++)

{ /* 每次输入一个结构的信息和一个整数 */

printf("input info of book\n");

scanf("%d", &id);

scanf("%s", name);

if(insert_struct(array1 + i, id, name) == -1)

/* 将新结构插入到数组中 */

exit(1);

printf("input int\n");

scanf("%d", &val);

/* 将新的整型元素插入到数组中 */

if(insert_int(array + i, val) == -1)

exit(1);

}

res1 = (Book)max((void **)array1, MAX, cmp_struct);/* 得到id最大的图书结构 */

res2 = (int *)max((void **)array, MAX, cmp_int);/* 得到最大的整型元素 */

printf("the max of books : %d, %s\n", res1->id, res1->name);

/* 输出结果 */

printf("the max of int : %d\n", *res2);

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值