回調函數實現冒泡法的多種排序

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

wKioL1ZlszLR5-UJAAAeqBU-S0Y669.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章