回调函数实现冒泡法的多种排序
来源:互联网 发布:帝国cms支持视频 编辑:程序博客网 时间:2024/05/24 04:38
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <string.h>typedef struct//定义学生结构体{char name[20];char number[20];int score;}Student;int struct_cmp(const void *elem1, const void *elem2){assert(elem1);assert(elem2);//断言return ((*(Student*)elem1).score - (*(Student*)elem2).score);//通过比较student的分数确定大小}int int_cmp(const void *elem1, const void *elem2)//整型比较函数{assert(elem1);assert(elem2);//断言return (*(int *)elem1 - *(int *)elem2);//elem1和elem2为两个int变量的地址,所以将elem1和elem2强制类型转换为int*类型,//然后截引用,访问两个int 变量,返回值为两个int 变量的差,如果第一个数大于第二个//返回整数,相等返回0,小于返回负数。}int str_cmp(const void *elem1, const void *elem2){assert(elem1);assert(elem2);//断言return strcmp((char*)*(int *)elem1,(char*)*(int *)elem2);//elem1和elem2为存放字符串地址的字符指针,所以需要访问4个字节,//将其强制类型转换为int*,然后截引用访问到字符串指针,最后将其强制类型转换为(char *).}void swp(void *elem1, void *elem2, size_t width)//size_t width为类型所占的空间,由于不知道交换的是什么类型, //所以需要多传入一个参数(表示类型的大小),然后以字节为单位逐个交换{assert(elem1);assert(elem2);//断言size_t i = 0;//逐字节的交换,进而交换两个变量for (i = 0; i < width; i++){char tmp = *((char*)elem1 + i);*((char*)elem1 + i) = *((char*)elem2 + i);*((char*)elem2 + i) = tmp;}}void bubble(void *arr, size_t num, size_t width, int(*compare)(const void *elem1, const void *elem2)) //int(*compare)(const void *elem1, const void *elem2为一个比较函数指针{assert(arr);assert(compare);//断言size_t i = 0, j = 0;for (i = 0; i < num - 1; i++){for (j = 0; j < num - 1 - i; j++){if (compare(((char*)arr + j*width), (char*)arr + (j + 1)*width)>0)//由于不知道需要比较的函数类型,所以利用类型的大小作为函数参数, //并统一转换为(char *)进行逐字节的转换(char*)arr + j*width{swp((char*)arr + j*width, (char*)arr + (j + 1)*width, width);}}}}int main(){char *arr1[] = { "amdgdj","lsansk","aaaaa","ueojjfdh","dcsaouid" };int sz = sizeof(arr1) / sizeof(arr1[0]);bubble(arr1, sz, sizeof(arr1[0]), str_cmp);int i = 0;for (i = 0; i < sz; i++){printf("%s\n", arr1[i]);}int arr2[] = { 1,3,7,7,6,4,9,4,3,8,5 };sz = sizeof(arr2) / sizeof(arr2[0]);bubble(arr2, sz, sizeof(arr2[0]), int_cmp);for (i = 0; i < sz; i++){printf("%d ", arr2[i]);}printf("\n");Student arr3[] = { {"张三","201312030120",94},{"李四","201312030118",98},{"王麻子","201312030116",96} };sz = sizeof(arr3) / sizeof(arr3[0]);bubble(arr3, sz, sizeof(arr3[0]), struct_cmp);for (i = 0; i < sz; i++){printf("%s %s %d\n", arr3[i].name, arr3[i].number, arr3[i].score);}system("pause");return 0;}
0 0
- 回调函数实现冒泡法的多种排序
- 回调函数实现冒泡排序
- 回调函数实现冒泡排序
- 用回调函数实现冒泡排序
- 回调函数实现通用冒泡排序
- 用回调函数实现冒泡排序
- 使用回调函数实现一个通用的冒泡排序,可以排序不同的数据类型。
- 【C语言】 使用回调函数实现冒泡排序
- 利用回调函数实现通用冒泡排序
- 使用回调函数实现qsort(冒泡排序)
- 冒泡排序之回调函数!
- 通用冒泡排序(回调函数)
- 【C语言】使用回调函数实现一个通用的冒泡排序,可以排序不同的数据类型。
- 用回调函数来完成多种数据类型的插入排序
- 通过冒泡排序(C语言实现)学习回调函数设计原理
- 通过冒泡排序的快速排序练习使用回调函数
- C语言冒泡排序之回调函数设计
- 采用回调函数的内部排序算法-插入排序,希尔排序,冒泡,快排,堆排,归并排,基数排序
- 编写一个函数reverse_string(char * string)(递归实现)
- TOJ 4146 4147 4148 4149 4150 4151 4152 4153 4154
- 二叉树的简单操作
- 模拟实现常用字符串函数
- memcpy函数和memmove函数的模拟实现与区别
- 回调函数实现冒泡法的多种排序
- 2016百度之星复赛 1003 拍照 扫描线
- C语言常见单链表面试题(1)
- C语言常见单链表面试题(2)
- C语言注释转换为c++的注释
- c++中string类的基本功能的实现(1)
- c/c++单链表面试题—链表带环问题
- c/c++单链表面试题—链表相交问题
- c++实现双向链表的常用功能