怎么用c语言单链表制作万年历

功能要求:
1、输入一个年份,输出是在屏幕上显示该年的日历。假定输入的年份在1940-2040年之间。

2、输入年月,输出该月的日历。

3、输入年月日,输出距今天还有多少天,星期几,是否是公历节日。

没看出和单链表有什么关系。
万年历C源代码在百度上一搜一大堆。


#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

// 定义节点结构体
typedef struct Node {
    int year;
    int month;
    int day;
    struct Node* next;
} Node;

// 定义函数声明
int getWeekday(int year, int month, int day);
bool isLeapYear(int year);
int getMonthDays(int year, int month);
int getTotalDays(int year, int month, int day);
void printMonth(int year, int month);
void printYear(int year);
void printCountdown(int year, int month, int day);

// 主函数
int main() {
    int choice, year, month, day;
    printf("欢迎使用万年历系统!\n");
    while (true) {
        printf("\n请选择要执行的操作:\n");
        printf("1. 输入年份,输出该年的日历。\n");
        printf("2. 输入年月,输出该月的日历。\n");
        printf("3. 输入年月日,输出距今天还有多少天,星期几,是否是公历节日。\n");
        printf("4. 退出系统。\n");
        scanf("%d", &choice);
        switch (choice) {
            case 1:
                printf("\n请输入要查询的年份(1940-2040年之间):\n");
                scanf("%d", &year);
                printYear(year);
                break;
            case 2:
                printf("\n请输入要查询的年月(格式:年 月):\n");
                scanf("%d %d", &year, &month);
                printMonth(year, month);
                break;
            case 3:
                printf("\n请输入要查询的年月日(格式:年 月 日):\n");
                scanf("%d %d %d", &year, &month, &day);
                printCountdown(year, month, day);
                break;
            case 4:
                printf("\n感谢使用万年历系统!\n");
                exit(0);
            default:
                printf("\n输入有误,请重新输入。\n");
        }
    }
}

// 获取星期几,0代表星期日,1代表星期一,以此类推
int getWeekday(int year, int month, int day) {
    if (month == 1 || month == 2) {
        month += 12;
        year--;
    }
    int c = year / 100, y = year % 100;
    int weekday = y + y / 4 + c / 4 - 2 * c + 26 * (month + 1) / 10 + day - 1;
    if (weekday < 0) {
        weekday = (weekday % 7 + 7) % 7;
    } else {
        weekday %= 7;
    }
    return weekday;
}

// 判断是否是闰年
bool isLeapYear(int year) {
    return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}

// 获取某年某月的天数
int getMonthDays(int year, int month) {
    int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31


#include <stdio.h>
#include <stdlib.h>

struct Node {
    int day; // 当月第一天是星期几,0表示星期天,1表示星期一,以此类推
    int days; // 当月的天数
    struct Node *next; // 指向下一个月的指针
};

// 判断是否是闰年
int isLeapYear(int year) {
    return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0);
}

// 初始化月份的天数
int initDays(int month, int year) {
    int days;
    if (month == 2) {
        days = isLeapYear(year) ? 29 : 28;
    } else if (month == 4 || month == 6 || month == 9 || month == 11) {
        days = 30;
    } else {
        days = 31;
    }
    return days;
}

// 创建链表
struct Node *createList() {
    struct Node *head, *p, *q;
    head = p = (struct Node*)malloc(sizeof(struct Node));
    head->day = 0; // 第一个节点为1900年1月,第一天是星期天
    head->days = 31;
    for (int i = 2; i <= 12; i++) {
        q = (struct Node*)malloc(sizeof(struct Node));
        q->day = (p->day + p->days) % 7; // 计算下个月的第一天是星期几
        q->days = initDays(i, 1900); // 计算下个月的天数
        p->next = q;
        p = q;
    }
    p->next = head; // 形成循环链表
    return head;
}

// 输出某个月份的日历
void printMonth(int month, int year, struct Node *head) {
    int days = initDays(month, year); // 当月的天数
    int day = 0; // 当月第一天是星期几
    struct Node *p = head;
    for (int i = 1; i < month; i++) {
        p = p->next;
    }
    day = p->day;
    printf("Sun  Mon  Tue  Wed  Thu  Fri  Sat\n");
    for (int i = 0; i < day; i++) {
        printf("     ");
    }
    for (int i = 1; i <= days; i++) {
        printf("%-4d ", i);
        day++;
        if (day % 7 == 0) {
            printf("\n");
        }
    }
    printf("\n");
}

int main() {
    struct Node *head = createList();
    int year, month;
    printf("请输入年份和月份,格式为yyyy mm:\n");
    scanf("%d %d", &year, &month);
    printf("%d年%d月的日历如下:\n", year, month);
    printMonth(month, year, head);
    return 0;
}