目录
一.先排序,看排序后的字符串是否相等
int cmp(const void* a, const void* b)
{
/*
char pa = *(char*)a; //精简版
char pb = *(char*)b;
return pa - pb;
*/
char* pa = (char*)a; //void*:任意类型的数组。把不知类型的指针转换为知道的类型
char* pb = (char*)b;
int num1 = *pa; //转换成真正的整数(拿到pa,pb的内容)
int num2 = *pb;
return num1 - num2; //比较num1和num2的大小(从小到大的顺序排,从大到小就是:num2-num1)
}
bool isAnagram(char* s, char* t)
{
int len_s = strlen(s), len_t = strlen(t);
if (len_s != len_t) //长度不一样肯定不相等
{
return false;
}
/*qsort(第一个元素的指针,元素个数,每个元素多少字节,用来比较两个元素的函数)
qsort(void* base, size_t num, size_t size, int (*compare)(const void*, const void*))
int 函数名字
*/
qsort(s, len_s, sizeof(char), cmp);
qsort(t, len_t, sizeof(char), cmp);
/*
strcmp(const char *str1, const char *str2):把str1,str2所指向的字符串进行比较。
如果返回值小于 0,则表示 str1 小于 str2。
如果返回值大于 0,则表示 str1 大于 str2。
如果返回值等于 0,则表示 str1 等于 str2。
*/
return strcmp(s, t) == 0;
}
上面是比较字符,如果比较的是浮点数👇
int cmp(const void* a, const void* b)
{
float* pa = (float*)a;
float* pb = (float*)b;
float num1 = *pa;
float num2 = *pb;
if(num1 - num2 > 0)
{
return 1;
}
else
{
return -1;
}
}
比较结构体👇
typedef struct
{
char name[30];
int Chinese;
int Math;
int English;
} Student;
Student students[7];
void readData() // 读文件
{
FILE* file = fopen("mark.txt", "r");
int i;
for(i = 0; i < 7; i++)
{
fscanf(file, "%s", students[i].name);
fscanf(file, "%d", &students[i].Chinese);
fscanf(file, "%d", &students[i].Math);
fscanf(file, "%d", &students[i].English);
}
fclose(file);
}
void displayData() //把所有学生的信息打印出来
{
int i;
for(i = 0; i < 7; i++)
{
printf("%s\t", students[i].name);
printf("%d\t", students[i].Chinese);
printf("%d\t", students[i].Math);
printf("%d\t", students[i].English);
}
}
int cmp(const void* a, const void* b) //根据语文成绩排序
{
Student* pa = (Student*)a;
Student* pb = (Student*)b;
int num1 = pa->Chinese;
int num2 = pb->Chinese;
return num1 - num2;
}
int main()
{
readData();
qsort(s, len_s, sizeof(Student), cmp);
displayData();
return 0;
}
二.补充函数:bsearch():二分查找函数
还是延用上面结构体函数,查找总成绩为240的学生
bsearch():要么可以从小到大排,要么可以从大到小排,否则无法使用这个函数
int cmp2(const void* key, const void* e)
{
int* pNum1 = (int*)key;
Student* ps = (Student*)e;
int num1 = *pNum1;
int num2 = pS->Chinese + pS->Math + pS->English;
return num1 - num2;
}
int main()
{
readData();
qsort(s, len_s, sizeof(Student), cmp);
/*void* bsearch(const void* key, const void* base, size_t num, size_t size,
int (*compare)(const void*, const void*))
key:要查找的元素
*/
int key = 240;
Student* s = bsearch(&key, students, 7, sizeof(Student), cmp2);
printf("%s\n", s->name);
displayData();
return 0;
}