#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; }