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

链表求和结果首元素始终为0的问题排查求助

问题描述

通过用户输入创建两个链表,将两链表对应元素相加后存入第三个链表。但打印第三个链表时,首元素总是0,后续才是正确的求和值。调试AddTwoLists()函数未找到0的来源,暂未处理两链表长度不同的情况,优先解决该问题。

原代码
#include <iostream>

struct Node {
    int n; // 非零元素数量
    int index;
    int value;
    Node* link;
};

struct Data {
    int n;
    int index;
    int value;
};

Node* A;
Node* B;

void AddEndNode(Node*& head, int index, int value){
    Node* current = head;
    Node* temp = new Node;
    temp->index = index;
    temp->value = value;
    temp->link = NULL;
    
    if(current == NULL) head = temp;
    else{
        while(current->link != NULL) current = current->link;
        current->link = temp;
    }
}

void PrintList(Node* head){
    Node* current = head;
    
    while(current != NULL){
        std::cout<< current->value<< "	";
        current = current->link;
    }
    std::cout<< "\n";
}

void AddTwoLists(Node* A, Node* B){
    Node* currentA = A;
    Node* currentB = B;
    Node* C = new Node;
    C->n = A->n;
    C->link = NULL;
    int sum = 0;
    int index = 1;
    
    while(currentA != NULL){
        sum = 0;
        C->index = index;
        sum += currentA->value;
        std::cout<< "\n1st sum is "<< sum;
        sum += currentB->value;
        std::cout<< "\n2nd sum is "<< sum;

        AddEndNode(C, index, sum);
        std::cout<< "\nlist C is ";
        PrintList(C);
        currentA = currentA->link;
        currentB = currentB->link;
        index++;
    }

    PrintList(C);
}


int main() {
    Data dataA, dataB;
    dataA.index = 1;
    dataB.index = 1;
    
    A = NULL;
    B = NULL;

    std::cout<< "请输入要添加到链表A的非零整数数量:\n";
    std::cin>> dataA.n;
    for(int i =0; i < dataA.n; i++){
        std::cout<< "请输入一个非零整数:";
        std::cin>> dataA.value;
        AddEndNode(A, dataA.index, dataA.value);
        dataA.index++;
    }
    PrintList(A);

    std::cout<< "\n请输入要添加到链表B的非零整数数量:\n";
    std::cin>> dataB.n;
    for(int i =0; i < dataB.n; i++){
        std::cout<< "请输入一个非零整数:";
        std::cin>> dataB.value;
        AddEndNode(B, dataB.index, dataB.value);
        dataB.index++;
    }
    PrintList(B);
    
    std::cout<< "\n链表A和链表B的求和结果:\n";
    AddTwoLists(A, B);

    return 0;
}
问题原因

AddTwoLists函数开头直接用new Node初始化链表C的头节点,这个新节点的value未被赋值,默认是0。后续调用AddEndNode都是往这个节点后面追加元素,导致链表C的首元素就是这个未初始化的0。

解决方法

将链表C初始化为NULL,利用AddEndNode函数的逻辑自动创建第一个节点,避免额外的空节点。同时调整C->n的赋值时机,确保链表有元素时再赋值。

修改后的AddTwoLists函数:

void AddTwoLists(Node* A, Node* B){
    Node* currentA = A;
    Node* currentB = B;
    Node* C = NULL; // 初始化为NULL,而非直接new Node
    int sum = 0;
    int index = 1;
    
    while(currentA != NULL){
        sum = 0;
        sum += currentA->value;
        sum += currentB->value;

        AddEndNode(C, index, sum);
        currentA = currentA->link;
        currentB = currentB->link;
        index++;
    }

    // 确保链表C和A不为空时,再赋值n
    if(C != NULL && A != NULL){
        C->n = A->n;
    }

    PrintList(C);
}
说明

修改后,链表C的第一个节点会由AddEndNode在第一次循环时创建,直接存入正确的求和值,不会再出现首元素为0的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 00:45:36