求教:C语言用qsort给日期排序
struct date
{
char m[20];//january 等等
int d;//日 1 2 3 4 5 6.。。。。。
int y;//年 90-99 00-12
}
给一个日期的struct,然后输入n行日期,用qsort排序,最后输出排序后的日期。
求指导。 c 语言 struct qsort
[解决办法]
/**
* @file datesort.c
* @brief
*/
struct date
{
char m[20]; /**< January 等等 */
int d; /**< 日 1 2 3 4 5 6.。。。。。 */
int y; /**< 年 90-99 00-12 */
};
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp_month(const char *m1, const char *m2)
{
int i, n, n1, n2;
static const char *months[] = {
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December",
};
n = sizeof(months) / sizeof(months[0]);
n1 = n2 = -1;
for (i = 0; i < n; ++i) {
if (n1 < 0 && strcmp(m1, months[i]) == 0)
n1 = i;
if (n2 < 0 && strcmp(m2, months[i]) == 0)
n2 = i;
if (n1 >= 0 && n2 >= 0)
break;
}
return n1 - n2;
}
int cmp_date(const void *v1, const void *v2)
{
int ret;
const struct date *d1, *d2;
d1 = (const struct date *)v1;
d2 = (const struct date *)v2;
if ((ret = (d1->y != d2->y)) != 0) {
if (d1->y >= 70 && d2->y >= 70)
return ret;
if (d1->y >= 70 && d2->y < 70)
return -1;
if (d1->y < 70 && d2->y < 70)
return ret;
if (d1->y < 70 && d2->y >= 70)
return +1;
}
if ((ret = cmp_month(d1->m, d2->m)) != 0)
return ret;
return d1->d - d2->d;
}
int main(int argc, char *argv[])
{
int i, n;
struct date date[] = {
{"March", 1, 1},
{"January", 1, 1},
{"January", 1, 99},
{"January", 1, 70},
};
n = sizeof(date) / sizeof(date[0]);
qsort(date, n, sizeof(struct date), &cmp_date);
for (i = 0; i < n; ++i)
printf("%s %d %d\n", date[i].m, date[i].d, date[i].y);
return 0;
}