回调函数与qsort函数的学习

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//回调函数
//void calc(int (*pf)(int, int))
//{
//	int x = 0;
//	int y = 0;
//	printf("请输入两个操作数:");
//	scanf("%d%d", &x, &y);
//	printf("%d\n", pf(x,y));
//}
//int add(int x, int y)
//{
//	return x + y;
//}
//int main()
//{
//	calc(add);
//	return 0;
//}



//指向函数指针数组的指针
//int main()
//{
//	int arr[10] = { 0 };
//	int(*p)[10] = &arr;//去除数组的地址
//
//	int(*pf)(int, int);//函数指针
//	int (*pfarr[4])(int, int);//pfarr是一个数组—函数指针的数组
//	//ppfarr是一个指向[函数指针数组]的指针
//	int(*(*ppfarr)[4])(int,int) = &pfarr;
//	//
//	//ppfarr是一个数组指针,指针指向的数组有4个元素。
//	//指向的数组的每个元素的类型是一个函数指针 int (*)(int, int)
//	//
//	return 0;
//} 



//struct stu
//{
//	char name[20];
//	int age;
//};
//qsort 函数排序
// 第一个参数:待排序数组的首元素地址
// 第二个参数:待排序数组的元素个数
// 第三个参数:待排序数组的每个元素的大小-单位是字节;
// 第四个元素:是函数指针,比较两个函数的所用函数的地址-这个函数使用者自己实现
// 函数指针的两个参数是:待比较的两个元素的地址 
//void qsort(void* base,
//	       size_t num,
//	       size_t width,
//	       int(*cmp)(const void* e1, const void* e2)返回值是第一个元素大于第二个元素返回正数,相同0,小于负数;
//           );
//
//int cmp_int(const void* e1, const void* e2)
//{
//	return *(int*)e1 - *(int*)e2;
//}
//int cmp_stu_age(const void* e1, const void* e2)
//{
//	return ((struct stu*)e1)->age - ((struct stu*)e2)->age;
//}
//int main()
//{
//	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	struct stu s[3] = { {"zhangsan",20},{"lisi",10},{"wangwu",30}};
//	int sz1 = sizeof(s) / sizeof(s[0]);
//	qsort(arr, sz,sizeof(arr[0]),cmp_int);
//	qsort(s, sz1, sizeof(s[0]), cmp_stu_age);
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d", arr[i]);
//	} 
//	return 0;
//}




//普通冒泡排序;
//void paixu(int* arr, int sz)
//{
//	int j = 0;
//	for (j = 0; j < sz - 1; j++)
//	{ 
//		int i = 0;
//		for (i = 0; i < sz - j - 1; i++)
//		{
//			if (arr[i] > arr[i + 1])
//			{
//				int tem = 0;
//				tem = arr[i];
//				arr[i] = arr[i + 1];
//				arr[i + 1] = tem;
//			}
//		}
//	}
//}
//int main()
//{
//	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	 
//	paixu(arr, sz);
//
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	} 
//	return 0;
//}



//void类型指针介绍.
//int main()
//{
//	int a = 0;
//	int* p = &a;
//	void* pa = &a;//void类型的指针可以接收任意类型的地址;
//	//*pa = 0;(错误写法)     //void类型的指针 不能进行解引用操作;
//	//pa++; (错误写法)       //void类型的指针 不能进行+-整数的操作;
//	char b = 'w';
//	pa = &b;
//	return 0;
//}



//自己仿照写一个my_qsort函数;
struct stu
{
	char name[20];
	int age;
};
void swap(char* e1, char* e2, int width)
{
	int i = 0;
	for (i = 0; i < width; i++)
	{
		char tem = *e1;
		*e1 = *e2;
		*e2 = tem;
		e1++;
		e2++;
	}
}
int cmp_int(void* e1,void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
int cmp_stu_age(void* e1, void* e2)
{
	return ((struct stu*)e1)->age - ((struct stu*)e2)->age;
}
int cmp_stu_name(void* e1, void* e2)
{
	return strcmp(((struct stu*)e1)->name ,((struct stu*)e2)->name);
	//strcmp函数返回值也是第一个元素大于第二个元素返回1,相同0,小于-1;
}
void my_qsort(void* arr, int sz, int width, int (*cmp)(void*, void*))
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)//比较的趟数
	{
		int j = 0;
		for (j = 0; j < sz - i - 1; j++)
		{
			if (cmp((char*)arr+j*width, (char*)arr + (1 + j)*width) > 0)
			{
				swap((char*)arr + j * width, (char*)arr + (1 + j) * width,width);
			}
		}
	}
}
int main()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	struct stu s[3] = { {"zhangsan",20},{"lisi",10},{"wangwu",30}};
	int sz1 = sizeof(s) / sizeof(s[0]);
	my_qsort(arr, sz,sizeof(arr[0]),cmp_int);
	my_qsort(s, sz1, sizeof(s[0]), cmp_stu_age);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d", arr[i]);
	} 
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值