如何分步拆分输入数字的每一位,通过for循环逐个传入push函数?
整数拆分为链表节点的C语言实现逻辑
核心思路
要将用户输入的整数拆分为单个数字并逐个传入push函数构建链表,关键是循环提取整数的每一位数字,同时注意处理0这类特殊输入(避免循环直接跳过)。以下是两种常见的拆分方式,对应链表的顺序存储与逆序存储:
方式1:逆序存储(低位在前,适合链表乘法场景)
这种方式拆分时直接从整数的最后一位(个位)开始提取,通过%10取模得到当前位,再用/10去掉已提取的位,直到整数变为0。
完整代码示例
#include <stdio.h> #include <stdlib.h> // 链表节点结构 struct Node { int data; struct Node* next; }; // 头插法构建链表(逆序存储时用头插,结果为低位在前) void push(struct Node** head_ref, int new_data) { struct Node* new_node = (struct Node*)malloc(sizeof(struct Node)); new_node->data = new_data; new_node->next = (*head_ref); (*head_ref) = new_node; } // 打印链表 void printList(struct Node* node) { while (node != NULL) { printf("%d ", node->data); node = node->next; } printf("\n"); } // 拆分整数并构建链表的函数 void buildListFromNumber(struct Node** head_ref, int num) { // 处理输入为0的特殊情况 if (num == 0) { push(head_ref, 0); return; } // 循环拆分每一位数字 for (; num > 0; num /= 10) { int digit = num % 10; push(head_ref, digit); } } int main() { struct Node* head = NULL; int input_num; printf("请输入一个整数:"); scanf("%d", &input_num); // 处理负数,取绝对值后拆分(如果需要保留符号可额外存储) if (input_num < 0) { input_num = -input_num; printf("注意:已自动取绝对值构建链表\n"); } buildListFromNumber(&head, input_num); printf("构建后的链表:"); printList(head); return 0; }
代码说明
buildListFromNumber函数中,先用if判断输入是否为0,直接插入0节点;for循环条件为num > 0,每次循环提取当前个位数字,调用push插入链表,再将num除以10缩小一位;- 头插法会让链表呈现低位在前的顺序(例如输入123,链表为3->2->1),这种结构在链表乘法时更方便低位对齐计算。
方式2:顺序存储(高位在前,符合直观阅读顺序)
如果需要链表按数字的原始顺序存储(输入123,链表为1->2->3),可以先计算数字的总位数,再从高位到低位依次提取:
核心拆分逻辑代码
void buildListFromNumber(struct Node** head_ref, int num) { if (num == 0) { push(head_ref, 0); return; } // 计算数字的位数 int temp = num; int digit_count = 0; while (temp > 0) { temp /= 10; digit_count++; } // 计算最高位的除数(例如3位数的除数是100) int divisor = 1; for (int i = 1; i < digit_count; i++) { divisor *= 10; } // 从高位到低位拆分,用尾插法构建顺序链表 struct Node* tail = NULL; for (; divisor > 0; divisor /= 10) { int digit = num / divisor; // 尾插法插入节点 struct Node* new_node = (struct Node*)malloc(sizeof(struct Node)); new_node->data = digit; new_node->next = NULL; if (*head_ref == NULL) { *head_ref = new_node; tail = new_node; } else { tail->next = new_node; tail = new_node; } num = num % divisor; // 去掉已提取的高位 } }
代码说明
- 先通过循环计算数字的位数,再得到最高位的除数;
- 用
for循环从高位开始提取数字,通过尾插法插入链表,保证顺序与输入数字一致; - 每次提取后用
num % divisor去掉已处理的高位,缩小除数继续循环。
注意事项
- 如果需要处理负数,可以在拆分前记录符号,拆分完成后再额外存储符号信息(比如用单独的变量标记,或者在链表头部插入符号节点);
- 注意
malloc后的内存释放,实际使用中记得在程序结束前遍历链表释放所有节点空间,避免内存泄漏。
内容的提问来源于stack exchange,提问作者mamiwnl
相关产品推荐
相关产品推荐

