第四天 今天的任务为《明解C语言中级篇》后半本6-10章内容+一道leetcode2.两数相加
后面章节也是以实际的编程实战程序为主,其中穿插知识点,要注意的内容如下:
1、空指针是一个特殊指针,它能够区别于指向任何对象/函数的指针,整数0能转换成任意的指针类型,转换结果为空指
针。表示空指针的是宏NULL ,它被称为空指针常量。
2、sprintf函数和printf函数都可以把参数展开并整理后输出,不同的是前者把参数输出到用方指定的数组中,后者输出到标准
输出流(控制台画面)。
3、scanf函数和getchar函数获取键盘输入信息时需要按下回车键,而getch函数(非标准库)无需按回车键就可以立即获取信
息。与之对应的putch函数把字符显示在画面上,不需要通过fflush函数进行清空操作。
4、包含头文件保护的头文件
#ifndef _ _HEADERXX
#define _ _HEADERXX
/* 声明及定义*/
#endif
5、C语言支持三种缓冲模式:
全缓冲:进行完整的缓冲。输入/输出的字符被存储到缓冲区,当缓冲区存满时才会把缓冲区的内容传送给程序/主机环境。
行缓存:以行为单位进行缓冲。输入/输出的字符被存储到缓冲区,当缓冲区存满时或者读取/写入换行字符,才会把缓冲区
的内容传送给程序/主机环境。
无缓存:不进行缓冲。只要条件允许输入/输出的字符直接传送给程序/输出目标的主机环境。
6、可以使用setvbuf/setbuf函数更改缓存办法,但不一定成功,依赖于编程环境和运行环境。
7、C语言有三个标准流:stdin(标准输入流)使用scanf函数、getchar函数读取字符、stdout(标准输出流)printf函数、
putchar函数向该流输出、stderr(标准错误流)使用fprintf函数和fputc函数向该流进行输出。
leecode
2. 两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0]
输出:[0]
提示:
每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
struct ListNode *head = NULL, *tail = NULL;
int carry = 0;
while (l1 || l2) {
int n1 = l1 ? l1->val : 0;//取出l1的第一个节点存储的数值
int n2 = l2 ? l2->val : 0;//取出l2的第一个节点存储的数值
int sum = n1 + n2 + carry; //计算相同位的数值和并加上上一次计算的进位
if (!head) { //判断存储结果的链表是否为空,若为空则开辟空间进行存储计算结果
head = tail = malloc(sizeof(struct ListNode)); //开辟动态存储空间
tail->val = sum % 10; //赋值
tail->next = NULL; //为下一个节点指向为空
} else {
tail->next = malloc(sizeof(struct ListNode));//若存储结果的链表不为空则直接在尾部存储结果
tail->next->val = sum % 10;
tail = tail->next;
tail->next = NULL;
}
carry = sum / 10; //计算进位
if (l1) {
l1 = l1->next; //更新要计算的下一个节点
}
if (l2) {
l2 = l2->next;
}
}
if (carry > 0) { //检查最后一次计算是否存在进位,若存在则再附加一个结点保存结果
tail->next = malloc(sizeof(struct ListNode));
tail->next->val = carry;
tail->next->next = NULL;
}
return head; //输出链表的结果
}
PS:该代码为leetcode官方答案,加上自己的注释。侵删。
本文解析了C语言中空指针概念、sprintf和printf的区别,以及scanf与getchar的输入技巧。重点讲解了链表相加的实现,包括如何处理进位和链表构建。同时介绍了头文件保护和缓冲模式的运用,以及LeetCode问题2.两数相加的解题思路。
5451

被折叠的 条评论
为什么被折叠?



