首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用C语言在链表中存储日期和时间

链表是一种常用的数据结构,用于存储和操作数据。在C语言中,可以使用结构体来表示日期和时间,并通过链表的方式来存储和管理多个日期和时间。

首先,我们可以定义一个结构体来表示日期和时间:

代码语言:txt
复制
typedef struct DateTime {
    int year;
    int month;
    int day;
    int hour;
    int minute;
    int second;
} DateTime;

接下来,我们可以定义一个链表节点的结构体,其中包含一个DateTime结构体和一个指向下一个节点的指针:

代码语言:txt
复制
typedef struct Node {
    DateTime data;
    struct Node* next;
} Node;

然后,我们可以实现一些基本的链表操作,例如插入节点、删除节点和遍历链表等:

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>

Node* createNode(DateTime data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

void insertNode(Node** head, DateTime data) {
    Node* newNode = createNode(data);
    if (*head == NULL) {
        *head = newNode;
    } else {
        Node* current = *head;
        while (current->next != NULL) {
            current = current->next;
        }
        current->next = newNode;
    }
}

void deleteNode(Node** head, DateTime data) {
    if (*head == NULL) {
        return;
    }
    Node* current = *head;
    Node* previous = NULL;
    if (current->data.year == data.year &&
        current->data.month == data.month &&
        current->data.day == data.day &&
        current->data.hour == data.hour &&
        current->data.minute == data.minute &&
        current->data.second == data.second) {
        *head = current->next;
        free(current);
        return;
    }
    while (current != NULL &&
           (current->data.year != data.year ||
            current->data.month != data.month ||
            current->data.day != data.day ||
            current->data.hour != data.hour ||
            current->data.minute != data.minute ||
            current->data.second != data.second)) {
        previous = current;
        current = current->next;
    }
    if (current == NULL) {
        return;
    }
    previous->next = current->next;
    free(current);
}

void printList(Node* head) {
    Node* current = head;
    while (current != NULL) {
        printf("%d-%02d-%02d %02d:%02d:%02d\n",
               current->data.year, current->data.month, current->data.day,
               current->data.hour, current->data.minute, current->data.second);
        current = current->next;
    }
}

void freeList(Node* head) {
    Node* current = head;
    while (current != NULL) {
        Node* temp = current;
        current = current->next;
        free(temp);
    }
}

int main() {
    Node* head = NULL;

    DateTime dt1 = {2022, 1, 1, 0, 0, 0};
    DateTime dt2 = {2022, 1, 1, 12, 0, 0};
    DateTime dt3 = {2022, 1, 2, 0, 0, 0};

    insertNode(&head, dt1);
    insertNode(&head, dt2);
    insertNode(&head, dt3);

    printf("Inserted nodes:\n");
    printList(head);

    DateTime dt4 = {2022, 1, 1, 12, 0, 0};
    deleteNode(&head, dt4);

    printf("\nAfter deleting a node:\n");
    printList(head);

    freeList(head);

    return 0;
}

上述代码演示了如何使用链表存储日期和时间,并进行插入和删除操作。在主函数中,我们创建了一个空链表head,然后插入了三个日期和时间节点。接着,我们打印出插入的节点,并尝试删除一个节点。最后,我们释放了链表的内存。

这是一个简单的示例,你可以根据实际需求扩展链表的功能和操作。在实际开发中,可以根据具体的场景和需求选择合适的数据结构和算法来存储和处理日期和时间数据。

腾讯云相关产品和产品介绍链接地址:

请注意,以上链接仅作为示例,具体的产品选择应根据实际需求和情况进行评估和决策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

MySQL 处理日期时间(四)

第四章节:创建日期时间的几种方法 在这个关于日期时间的系列,我们探索了 MySQL 的五种时态数据类型,以及它的许多面向日期时间的函数的一些。...本文中,我们将介绍 MySQL 创建日期时间的几种方法。 使用 MAKEDATE() 函式 MAKEDATE() 函数,它接受 year dayofyear,并返回生成的日期值。...它接受一个日期字符串一个格式字符串并返回: 如果字符串仅包含日期,则为 DATE 值 如果字符串仅包含时间,则为 TIME 值 如果格式字符串包含日期时间部分,则为 DATETIME 值 此外,如果从...同时,忽略 str 末尾的额外字符: 未指定的日期时间部分的值为 0,因此日期时间字符串未完全指定的值会产生部分或全部部分设置为 0 的结果: 组合 MAKEDATE()、MAKETIME()...虽然这听起来可能需要做很多工作,但实际上非常简单: 总结 在这一部分,我们介绍了使用 MySQL 的一些专用日期时间函数 MySQL 创建日期时间的几种方法。

3.8K10
  • MySQL 处理日期时间(二)

    第二章节:TIMESTAMP YEAR 类型 欢迎回到这个关于 MySQL 处理日期时间的系列。在前面章节,我们探讨 MySQL 的时态数据类型。...TIMESTAMP 类型 TIMESTAMP 类型与 MySQL 的 DATETIME 相似,两者都是包含日期时间组合的时态数据类型。这就引出了一个问题,为什么同一信息有两种类型?...首先,MySQL 时间戳通常用于跟踪记录的更改,并且通常在每次记录更改时更新,而日期时间用于存储特定的时间值。...另一方面,DATETIME 表示日期日历时间挂钟上),而 TIMESTAMP 表示明确定义的时间点。...以下是 Navicat 表设计器四位数格式的年份列示例: 因此,我们表中看到完整年份: 总结 我们对五种 MySQL 时态数据类型的探索到此结束。下一部分将介绍一些有用的日期时间函数。

    3.4K10

    MySQL 处理日期时间(五)

    第五章节:如何在 SELECT 查询中使用时态数据 MySQL 日期时间系列的最后一部分,我们将通过编写 SELECT 查询来将迄今为止学到的所有知识付诸实践,以获得对数据的与日期相关的细节...从 Datetime 列中选择日期 数据库从业人员尝试查询日期时遇到的首要挑战之一是大量时间数据存储为 DateTime Timestamp 数据类型。...例如,Sakila 示例数据库将 customer 表的 create_date 列存储为 Datetime: 因此,如果我们尝试选择特定日期创建的客户记录,就不能只提供日期值: 一个简单的解决方法是使用...获取两个日期之间的差异 执行确定某件事发生多久之前的查询是非常常见的。 MySQL ,这样做的方法是使用 DATEDIFF() 函数。它接受两个日期值并返回它们之间的天数。...系列总结 我们在这个日期时间系列涵盖了很多内容,包括: MySQL 的五种时态数据类型 一些重要的面向日期时间的功能函数 如何在 MySQL 创建日期时间 SELECT 查询中使用时态数据

    4.2K10

    Python如何处理日期时间

    幸运的是,我们有系统时钟,它为所有编程语言和硬件提供了一个通用参考。 Python ,您可以使用 datetime 模块轻松访问此时钟。 datetime 模块引用系统时钟。...这些系统调用 API 返回当前日期时间。此时间的准确性精度取决于硬件操作系统的计时机制,但它们都始于同一个地方。 Python 的时间接口是 datetime 模块。...它调用系统 API 来检索当前日期时间。 datetime 如何工作? 首先要使用日期时间,您需要导入 datetime 模块。...from datetime import datetime 要获取当前日期时间,可以使用 datetime.now() 方法。它将返回包含当前日期时间的完整 datetime 对象,精确到纳秒。...使用它之前,您需要导入它: import pytz 您不需要先获取 UTC 时间,但这是最佳实践,因为 UTC 从不改变(包括夏令时期间),因此它是一个强大的参考点。

    7010

    如何在C语言中进行日期时间处理

    如何在C语言中进行日期时间处理日期时间处理许多软件应用程序中都是非常重要的功能。无论是计算两个日期之间的天数,还是计算某个日期是星期几,C语言提供了丰富的库函数功能来满足这些需求。...本文将介绍如何在C语言中进行日期时间处理。18如何在C语言中进行日期时间处理1. 获取当前日期时间要获取当前的日期时间,可以使用time.h头文件的time函数。...格式化日期时间C语言还提供了一组函数来将日期时间格式化为指定的字符串。可以使用strftime函数将时间格式化为自定义的字符串格式。...可以根据具体的需求选择合适的函数来处理日期时间。总结C语言提供了丰富的函数功能来进行日期时间处理。.../time_h.htm以上就是关于C语言中进行日期时间处理的介绍。

    97600

    Java时间日期(二):java时间存储的基本原理

    java,java.util.Date对象用于表示时间。这个对象既能表示日期,也能表示时间。原因在于这个对象内部实际上是一个long字符来存储的毫秒数。...2.时区 无线电还没有产生的年代,如何确定时间很多时候只能根据日出、星象等来确定。为此不同的地区形成了不同的历法,但是无论那种历法,地球公转的时长次数不会改变。...这样对于java时间就非常容易理解了。通过一个long的时间戳,加上固定的时区转换,就能得到我们所需要的时间日期。...jdk1.8之前的体系时间日期底层都是相同的实现,日期只不过是通过这个long的时间戳,参考Epoch Time加上Time Zone进行转换得到的结果。...但是jdk1.7时间并不完善,存在着诸多缺点,因此,1.8引入了新的时间工具类,我们在后面详细介绍。

    1.8K10

    C语言整型浮点数在内存存储

    但是C语言中除了8 bit的char之外,还有16 bit的short 型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32 位的处理器,由于寄存器宽度大于一个字节...因 此就导致了大端存储模式小端存储模式。...案例说明 整型数字9VS2019(32位小端模式)存储 代码: int main() { int i = 9; return 0; } 9的二进制表示:0000 0000 0000...0000 0000 0000 0000 1001 00 00 00 09 在内存存储: 二.浮点数存储 浮点数类型包括:float、double 浮点数表示方法 根据国际标准IEEE(电气电子工程协会...三.总结 以上就是今天的内容,本文仅仅简单介绍了整型浮点数在内存存储问题。 这篇博客如果对你有帮助,给博主一个免费的点赞以示鼓励,欢迎各位点赞评论收藏⭐,谢谢!!!

    19120

    C语言】整数浮点数在内存存储

    一、 整数在内存存储 详情请见拙文 【C语言的位操作符移位操作符,原码反码补码以及进制之间的转换 其中详细介绍了整数在内存存储是依靠原反补码存储实现的 二、大小端字节序字节序判断 首先声明我使用的编译器是...; return 0; } 调试 框输入&a,得到a存储的数据时44332211,这里我们会有疑问:为什么不是11223344呢,怎么会是倒着存储的呢?...-1; signed char b = -1; unsigned char c = -1; printf("a=%d,b=%d,c=%d", a, b, c); return 0; } signed...char ,而且-1的unsigned char 输出结果为255,这是因为我们计算机存储数据时是以下图来进行存储的: 我们把这个圆看作是一个钟表,数据进行加一时,表针顺时针移动,指向下一个数字...,再进行减一时,表针逆时针移动,指向上一个数字,那么因为unsigned char,-1是没有定义的,它就会等于0-1,即零逆时针移动一个数字,即255 当然这些数字是二进制存储的,我十进制写出来是为了方便

    8610

    C语言】整形数据浮点型数据在内存存储

    个人主页:修修修也 所属专栏:C语言 ⚙️操作环境:Visual Studio 2022 一.观察现象,提出问题 为什么我们%f打印整形数值时结果总为0.000000,而用%...但接下来我们一起探究一下整形数据浮点型数据在内存存储后,就能明白其实编译器给出的这些数字是经过非常严格的计算得来的,而不是我们想象的那样是个随机值。...二.了解整形在内存存储方式 首先,计算机的整数有三种2进制表示方法,即原码、反码补码。...三种表示方法均有符号位和数值位两部分,符号位都是0表示“正”,1表示“负”。 整形在内存存储图示: 要注意的是: 正数的原、反、补码都相同。...相关文章推荐 【C语言】结构体的大小是如何计算的?(结构体对齐) 【数据结构】什么是数据结构? 【数据结构】什么是算法?

    10510

    C语言实例描述程序的内聚耦合

    程序设计软件工程发展过程中产生的很多技术、设计原则,都可以从内聚耦合的角度进行解读。作为C语言程序设计的初学者,结合当前对于函数的理解可达到的程度,我们探讨一下如何做到高内聚低耦合。 针对低耦合。...有些函数数调用时,利用形式参数传地址的方式,函数体内通过指针可以修改其指向的作用域以外的存储单元,这构成了更强的耦合,称为特征耦合,在这里,使函数之间产生联系的是地址这样的特征标识。...C语言中,还可以通过静态局部变量,同一个程序的两次调用之间共享数据,这也可以视为是一种外部耦合,只不过静态局部变量的作用域限于函数内部,其影响也只函数内部,耦合程度比使全局变量也还是弱很多。...总之,解决问题划分函数时,要遵循“一个函数,一个功能”的原则,尽可能使模块达到功能内聚。 要做到高内聚低耦合,重点是要在写代码之前花些时间做好设计。...在下面的例子,将讨论结合具体的问题,如何将以上的因素考虑进去。 二、示例篇 本例受裘宗燕老师《从问题到程序——程序设计与C语言引论启发》。

    87330

    C 语言】指针间接赋值 ( 直接修改 间接修改 指针变量 的值 | 函数 间接修改 指针变量 的值 | 函数 间接修改 外部变量 的原理 )

    文章目录 一、直接修改 间接修改 指针变量 的值 二、函数 间接修改 指针变量 的值 三、函数 间接修改 外部变量 的原理 一、直接修改 间接修改 指针变量 的值 ---- 直接修改 指针变量...// 打印一级指针地址 printf("%d\n", p); // 命令行不要退出 system("pause"); return 0; } 执行结果 : 二、函数...间接修改 指针变量 的值 ---- 函数 间接修改 指针变量 的值 , 将 指向一级指针 的 二级指针 变量 , 传递到 函数形参 , 函数 , 使用 * 符号 , 修改 二级指针...将一级指针的地址赋值给二级指针 p2 = &p; // 间接修改指针的值 *p2 = 12345678; // 打印一级指针地址 printf("%d\n", p); // 函数...三、函数 间接修改 外部变量 的原理 ---- 如果要 修改 一级指针 的值 , 必须 传入 指向 一级指针 的 二级指针 变量 才可以 , 传入一级指针变量 , 不能修改一级指针变量值 ; 这是因为

    21.2K11

    漫谈数据仓库之拉链表(原理、设计以及Hive的实现)

    下面有几种方案可选: 方案一:每天只留最新的一份,比如我们每天Sqoop抽取最新的一份全量数据到Hive。 方案二:每天保留一份全量的切片数据。 方案三:使用拉链表。...2017-01-01 004 444444 2017-01-02这一天表的数据是, 用户002004资料进行了修改,005是新增用户: 注册日期 用户编号 手机号码 备注 2017-01-01...(此处要好好理解,是拉链表比较重要的一块。) Hive实现拉链表 现在的大数据场景下,大部分的公司都会选择以HdfsHive为主的数据仓库架构。...还是以上面的用户表为例,我们要实现用户的拉链表实现它之前,我们需要先确定一下我们有哪些数据源可以。 我们需要一张ODS层的用户全量表。至少需要用它来初始化。 每日的用户更新表。...拉链表流水表 流水表存放的是一个用户的变更记录,比如在一张流水表,一天的数据,会存放一个用户的每条修改记录,但是在拉链表只有一条记录。 这是拉链表设计时需要注意的一个粒度问题。

    830110

    链表是什么

    所以一些场景下,拉链表是能解决很多问题的。 0x02 拉链表的设计实现 如何设计一张拉链表 下面我们来举个栗子详细聊一下拉链表。...2017-01-01 004 444444 2017-01-02 这一天表的数据是, 用户 002 004 资料进行了修改,005 是新增用户: 注册日期 用户编号 手机号码 备注 2017...(此处要好好理解,是拉链表比较重要的一块。) Hive实现拉链表 现在的大数据场景下,大部分的公司都会选择以 Hdfs Hive 为主的数据仓库架构。...拉链表流水表 流水表存放的是一个用户的变更记录,比如在一张流水表,一天的数据,会存放一个用户的每条修改记录,但是在拉链表只有一条记录。 这是拉链表设计时需要注意的一个粒度问题。...其它 使用还有了一些心得,补充进来: 使用拉链表的时候可以不加 t_end_date,即失效日期,但是加上之后,能优化很多查询。 可以加上当前行状态标识,能快速定位到当前状态。

    10.4K145

    漫谈数据仓库之拉链表(原理、设计以及Hive的实现)

    下面有几种方案可选: 方案一:每天只留最新的一份,比如我们每天Sqoop抽取最新的一份全量数据到Hive。 方案二:每天保留一份全量的切片数据。 方案三:使用拉链表。...2017-01-01这一天表的数据是: 2017-01-02这一天表的数据是, 用户002004资料进行了修改,005是新增用户: 2017-01-03这一天表的数据是, 用户004...(此处要好好理解,是拉链表比较重要的一块。) Hive实现拉链表 现在的大数据场景下,大部分的公司都会选择以HdfsHive为主的数据仓库架构。...还是以上面的用户表为例,我们要实现用户的拉链表实现它之前,我们需要先确定一下我们有哪些数据源可以。 我们需要一张ODS层的用户全量表。至少需要用它来初始化。 每日的用户更新表。...拉链表流水表 流水表存放的是一个用户的变更记录,比如在一张流水表,一天的数据,会存放一个用户的每条修改记录,但是在拉链表只有一条记录。 这是拉链表设计时需要注意的一个粒度问题。

    33130

    详解数据仓库之拉链表(原理、设计以及Hive的实现)

    下面有几种方案可选: 方案一:每天只留最新的一份,比如我们每天Sqoop抽取最新的一份全量数据到Hive。 方案二:每天保留一份全量的切片数据。 方案三:使用拉链表。...2017-01-01这一天表的数据是: 2017-01-02这一天表的数据是, 用户002004资料进行了修改,005是新增用户: 2017-01-03这一天表的数据是, 用户004005...(此处要好好理解,是拉链表比较重要的一块。) Hive实现拉链表 现在的大数据场景下,大部分的公司都会选择以HdfsHive为主的数据仓库架构。...还是以上面的用户表为例,我们要实现用户的拉链表实现它之前,我们需要先确定一下我们有哪些数据源可以。 我们需要一张ODS层的用户全量表。至少需要用它来初始化。 每日的用户更新表。...拉链表流水表 流水表存放的是一个用户的变更记录,比如在一张流水表,一天的数据,会存放一个用户的每条修改记录,但是在拉链表只有一条记录。 这是拉链表设计时需要注意的一个粒度问题。

    53310
    领券