使用链接列表添加两个数字

时间:2016-04-02 04:11:31

标签: c++

我正在尝试添加两个由链接列表表示的数字。所以我插入了数字3-> 2-> 8和6-> 5-> 4。我试图得到数字328和654,然后添加两个并将它们插入第三个列表。我在计算数字时遇到了一些问题。这是代码。

    #include<bits/stdc++.h>

using namespace std;


struct Node{
int data;
struct Node *next;
};
int flag=1;
void input(Node **head,int num)
{
    Node *temp=(struct Node*)malloc(sizeof(struct Node));
    temp->data=num;
    if(!flag)temp->next=*head;
    if(flag){temp->next=NULL;flag=0;}
    *head=temp;
}

void add(Node *l1,Node *l2,Node *l3)
{
    Node *cur1=l1;
    Node *cur2=l2;
    int size1=0,size2=0;

    while(cur1!=NULL)
    {
       size1++;

        cur1=cur1->next;
    }
    while(cur2!=NULL)
    {
        size2++;
        cur2=cur2->next;
    }
    int i=size1-1,j=size2-1,sum1=0,sum2=0;
    cur1=l1;cur2=l2;
    cout<<i<<endl;
    while(cur1!=NULL)
    {
        cout<<cur1->data<<"\t";
        cout<<cur1->data*pow(10,i)<<"\t";

        sum1=sum1+cur1->data*pow(10,i);
        cout<<sum1<<endl;
        i--;
        cur1=cur1->next;
    }
    cout<<sum1<<endl;
    while(cur2!=NULL)
    {    cout<<cur2->data<<"\t";
        cout<<cur2->data*pow(10,j)<<"\t";
        sum2=sum2+cur2->data*pow(10,j);
        cout<<sum2<<endl;
        j--;
        cur2=cur2->next;
    }
    cout<<sum2<<endl;
    sum1+=sum2;
    while(sum1!=0)
    {
        int r=sum1%10;
        input(&l3,r);
        sum1/=10;
    }
    cur1=l3;
    while(cur1!=NULL)
    {
        cout<<cur1->data;
        cur1=cur1->next;
    }
}

int main()
{
    Node *l1=NULL;
    Node *l2=NULL;
    Node *l3=NULL;
    input(&l1,8);
    input(&l1,2);
    input(&l1,3);
    flag=1;
    input(&l2,4);
    input(&l2,5);
    input(&l2,6);
    add(l1,l2,l3);
    return 0;
}

我得到了输出

2 //value of i
3       300     299 //cur1->data*pow(10,i) is initially 300 then becomes 299
2       20      319
8       8       327
327 //total sum which should be 328
6       600     599 //Same problem 
5       50      649
4       4       653
653 //total sum which should be 654
980 //sum of 327 and 653 

2 个答案:

答案 0 :(得分:2)

问题可能是由于截断。 pow函数返回浮点数。然后将其转换为整数,从而导致截断。

示例:

299.99999999 as float will become 299 as int

尝试先加0.5,然后进行四舍五入。

像:

sum1=sum1+(cur1->data*pow(10,i) + 0.5);

正如@viraptor评论的那样,避免浮动(即战俘)更好。尝试类似:

sum1 = 0;
while(cur1 != NULL)
{
    sum1 = 10 * sum1;
    sum1 = sum1 + cur1->data;
    cur1=cur1->next;
}

然后所有计算都在整数上完成,由于float和int之间的转换,你不会遇到问题。

答案 1 :(得分:0)

该代码很难遵循。您可以简单地对(简单的)链接列表求和,而不是提取每个列表的值,将它们相加然后存储结果。

下面是一个简单的示例。请注意,carry必须作为参考传递,因此调用者在展开堆栈时可以访问修改后的值。此外,此示例还假定两个列表具有相同数量的节点。如果没有,您可以将0添加到最短列表中。

// basic node structure
template <typename T>
struct Node
{
    T data = 0;
    Node<T>* next = nullptr;
};

// function to sum 2 simply linked lists
Node<int>* sumLists(Node<int>* l1, Node<int>* l2, int& carry, int k = -1)
{
    if (!l1 && !l2)
    {
        // we reached the end of both lists
        return nullptr;
    }

    ++k; // index of the largest list

    // iterate to the end of both lists, head is the head of the result list
    auto head = sumLists(l1 ? l1->next : l1, l2 ? l2->next : l2, carry, k);

    // compute the value and carry
    int value = carry;
    if (l1) value += l1->data;
    if (l2) value += l2->data;
    carry = value / 10;

    // insert the value into the result list
    Node<int>* node = new Node<int>();
    node->data = value % 10;
    if (!head)
    {
        head = node;
    }
    else
    {
        node->next =head;
        head = node;
    }

    // add carry for the last iteration
    if ((k == 0) && (carry != 0))
    {
        Node<int>* node = new Node<int>();
        node->data = carry;
        node->next = head;
        head = node;
    }

    return head;
}