由题引入
C=1,结构体一级排序,C=2,C=3对结构体二级排序。
AC代码详解博客站内很多,在此记录一下我遇到的问题。(没错,这是一篇伪题解博客)
想法
看到题后,数据储存第一想法是单链表存储,排序时就有两种方法,交换结点指针,或者交换结点内容。这两种方法我都不熟练的情况下,还担心了自己写的排序模块会不会时间过长,想到了用C语言<stdlib.h>库函数qsort() 。
qsort函数对数组元素进行排序,于是数据存储就换成了结构体数组。(其实可以把链表元素遍历一遍,存入数组进行排序,输出排序后的数组。)
qsort()函数
函数原型:
void qsort(void *base,size_t nitems,size_t size,int (*compare)(const void *,const void *))
参数
base-- 指向要排序的数组的第一个元素的指针。
nitems-- 由 base 指向的数组中元素的个数。
size-- 数组中每个元素的大小,以字节为单位。
compare-- 用来比较两个元素的函数,即函数指针(回调函数)
回调函数:就是一个通过函数指针调用的函数。如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就说这是回调函数。1
compare函数:2
标准,qsort函数需要被告知一个规则,什么是大什么是小。
通过编写比较函数可以为函数qsort提供这些信息。
当给定两个指向数组元素的指针p和q时,比较函数必须返回一个整数。
如果* p小于* q,那么返回的数为负数;如果* p等于* q,那么返回0。如果* p大于* q,返回正数。
strcmp()函数
还有对字符串数组的排序,可使用strcmp函数。(之前有试过自己用字符串数组首元素地址所对应的空间中字母的ASC||值比较,未成功)
函数原型:
int strcmp(const char *s1,const char *s2);
规则:3
当s1<s2时,返回为负数;
当s1=s2时,返回值= 0;
当s1>s2时,返回正数。
即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止。如:
1.“A”<“B”
2.“A”<“AB”
3.“Apple”<“Banana”
4.“A”<“a”
5.“compare”<“computer”
源码:
int strcmp(const char *str1,const char *str2)
{
while(*str1 == *str2)
{
assert((str1 != NULL) && (str2 != NULL));
if(*str1 == '\0')
return 0;
str1++;
str2++;
}
return *str1 - *str2;
}
模拟算法:
int strcmp(const char * src, const char * dst)
{
int ret = 0 ;
while(!(ret=*src-*dst) && *dst)