c语言实现以下问题,求各位指正!

从键盘输入n个日期,输入格式为:月日年 例如:01052023,找出其中距离今天最远的三个日期,请问各位,这个问题有没有更好的解法。
下面是我自己的想法和程序,请各位批评指正。

/*
算法思想:
先把输入的字符串(月日年)通过函数整合为int类型,格式为(年月日)
这样可以直接和今天的日期20201225进行减法运算并取绝对值,绝对值越大,表示距离今天越远。
*/
#include
#include
#include
int fun(char *p)
{//返回整合后日期与20201225的差值
    int i=4;
    int data=0;
    while(i<8)
        data=data*10+p[i++]-'0';
    i=0;
    while(i<4)
        data=data*10+p[i++]-'0';
    return abs(data-20201225);
}
void swap(char *p,char *q)
{
    char str[10];
    strcpy(str,p);
    strcpy(p,q);
    strcpy(q,str);
}
void main()
{
    char max1[10],max2[10],max3[10];//按差值大小依次存放距离今天最远的三个日期
    char data[10];  //存放输入的日期
    int n;   //输入日期的个数
    scanf("%d",&n);
    getchar(); //接收输入缓冲区的换行符
    gets(max1);gets(max2);gets(max3); //获取前三个输入的日期
    //三个if调整顺序,max1中日期最远,2和3依次
    if(fun(max1)<fun(max2))
        swap(max1,max2);
    if(fun(max1)<fun(max3))
        swap(max1,max3);
    if(fun(max2)<fun(max3))
        swap(max2,max3);
    for(int i=4;i<=n;i++)
    {
        gets(data);
        if(fun(data)>fun(max1))
        {
            strcpy(max3,max2);
            strcpy(max2,max1);
            strcpy(max1,data);
        }
        else if(fun(data)>fun(max2))
        {
            strcpy(max3,max2);
            strcpy(max2,data);
        }
        else if(fun(data)>fun(max3))
            strcpy(max3,data);
    }
    puts(max1);puts(max2);puts(max3);
}

这个程序的思路是正确的。但是在实现方面,可以考虑以下几点优化:

1、使用 sscanf 函数,而不是手写的 fun 函数,把输入的字符串转化为整数:

int data;
sscanf(p, "%2d%2d%4d", &month, &day, &year);
data = year * 10000 + month * 100 + day;
return abs(data - 20201225);

2、使用结构体存储每个日期及其差值,而不是使用字符串和临时变量。这样可以减少代码量,同时提高程序的可读性。

3、使用快速排序函数,而不是手写的 swap 函数,对日期进行排序。
仅供参考,望采纳,谢谢。

各位如果还有更好的解法,欢迎补充!