linux c回调函数

<strong>common.h</strong>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* 定义一个自定义类型的函数指针,返回值是整型,两个参数是两个任意类型的指针 
* 该函数的两个参数分别是需要比较的两个对象,在比较时将其转换
* 如果大于则返回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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值