You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何分步拆分输入数字的每一位,通过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去掉已处理的高位,缩小除数继续循环。

注意事项

  1. 如果需要处理负数,可以在拆分前记录符号,拆分完成后再额外存储符号信息(比如用单独的变量标记,或者在链表头部插入符号节点);
  2. 注意malloc后的内存释放,实际使用中记得在程序结束前遍历链表释放所有节点空间,避免内存泄漏。

内容的提问来源于stack exchange,提问作者mamiwnl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 23:06:10