C 使用链表添加和减去bigint

C 使用链表添加和减去bigint,c,linked-list,C,Linked List,我的任务就快完成了,我快累死了。这是我的第三篇关于这三个不同部分的文章,我真的很尴尬,我在这项任务中挣扎了这么久 赋值本身就是制作一个程序,使用链表执行大整数的加法和减法(我慢慢开始讨厌Lisp之外的链表)。除了实际的加法和减法之外,现在一切似乎都正常了。我不确定是否是算术函数,因为它们以前工作过(但从来没有100%),但与S/O社区核实一下也无妨(通常我不会在作业上要求这么多帮助,因为我更喜欢自己解决问题,但这是一个糟糕而忙碌的周,最后期限很快就要到了) 我写的算术函数如下,谁能帮我找出哪里错

我的任务就快完成了,我快累死了。这是我的第三篇关于这三个不同部分的文章,我真的很尴尬,我在这项任务中挣扎了这么久

赋值本身就是制作一个程序,使用链表执行大整数的加法和减法(我慢慢开始讨厌Lisp之外的链表)。除了实际的加法和减法之外,现在一切似乎都正常了。我不确定是否是算术函数,因为它们以前工作过(但从来没有100%),但与S/O社区核实一下也无妨(通常我不会在作业上要求这么多帮助,因为我更喜欢自己解决问题,但这是一个糟糕而忙碌的周,最后期限很快就要到了)

我写的算术函数如下,谁能帮我找出哪里错了

/*
 * Function add
 *
 * @Paramater STRUCT* Integer
 * @Parameter STRUCT* Integer
 *
 * Takes two linked lists representing
 * big integers stored in reversed order,
 * and returns a linked list containing
 * the sum of the two integers.
 *
 * @Return STRUCT* Integer
 * 
 * TODO Comment me
 */
struct integer* add( struct integer *p, struct integer *q )
{
    int carry = 0;

    struct integer *sHead, *sCurr;
    struct integer *pHead, *qHead;

    pHead = p;
    qHead = q;

    sHead = NULL;

    while( p )
    {
        sCurr = ( struct integer* ) malloc (sizeof(struct integer));
        sCurr->digit = p->digit + q->digit + carry;
        sCurr->next = sHead;
        sHead = sCurr;

        carry = 0;

        /*
         * If the current digits sum to greater than 9,
         * create a carry value and replace the current
         * value with value mod 10.
         */
        if( sCurr->digit > 9 )
        {
            carry = 1;
            sCurr->digit = sCurr->digit % 10;
        }

        /*
         * If the most significant digits of the numbers
         * sum to 10 or greater, create an extra node
         * at the end of the sum list and assign it the
         * value of 1.
         */
        if( carry == 1 && sCurr->next == NULL )
        {
            struct integer *sCarry = ( struct integer* ) malloc (sizeof(struct integer));
            sCarry->digit = 1;
            sCarry->next = NULL;
            reverse( &sCurr );
            sCurr->next = sCarry;
            reverse( &sCurr );
        }

        p = p->next;
        if( q->next ) q = q->next; 
        else q->digit = 0; 
    }

    return sHead;
}

但实际上,它看起来是这样的:

8888888888 + 2222222222 = 11111111110
10000000000 – 9999999999 = 1
10000000000 – 9999999999 = 1
8888888888 + 2222222222 = 1111111110
10000000000 - 9999999999 = 10000000001
10000000000 - 9999999999 = 10000000001

编辑整个程序(截至美国东部时间下午3:30的当前形式)可供参考,或者在这些功能不是问题的情况下。

else q->digit=0
您正在更改函数内的参数

尝试更改函数以接受
const
参数并重新编译

struct integer* add( const struct integer *p, const struct integer *q )
struct integer* subtract( const struct integer *p, const struct integer *q )
读的部分

if( dCurr->next == NULL && carry == 1 )
{
    struct integer *dCarry = (struct integer*) malloc (sizeof(struct integer));
    dCarry->digit = -1;
    dCarry->next = NULL;
    dCurr->next = dCarry;
}
看起来有点不合适。从上面的代码中,
dCurr->next
被设置为我们在前面的循环中已经计算过的数字,因此它只在第一个数字上为空。我想你是想检查
p->next

我假设此函数的条件
len(p)>=len(q)
成立。如果没有,您将不得不做一些事情来处理它不起作用的地方(在用完q节点之前用完p节点)。我还假设数字在列表中从最低有效数字到最高有效数字。如果没有,您可能需要在处理p和q之前反转它们

还有一件事我搞不懂,那就是如何处理负数。或者即使你应该处理它们。向这样的结构中添加内容并不容易,因为在减法时,在末尾添加内容的简单方法是行不通的:当q为负时,您将费尽周折从p中减去q,然后发现您应该添加内容。

在函数
compare()
中,您“行走”
p
然后再次尝试行走

int compare( struct integer *p, struct integer *q )
{
    /* ... */
    while( p )
    {
        pCount++;
        p = p->next;
    }
p
现在为空

    /* ... */
    while( p )
    {
        /* ... */
    }

while
循环从不运行。

使用调试器并显示每个步骤上发生的情况如何。似乎这不是关于链表本身,而是关于如何进行减法。顺便说一句,在减法中最好把它命名为“借来”而不是“进位”。特别有趣的是dCurr->数字,p->数字,q->数字的输出。您还没有显示integer类型是如何定义的。@Pmod很抱歉,我将建立整个程序的粘贴库作为参考。作为赋值的一部分,我无法更改函数定义:/好的,但是无论如何要改变,用
const
编译直到没有错误,然后删除
const
:)结果是最大的问题是
else q->digit=0
中的一个错误,谢谢你指出。谢谢你的反馈。我就知道!英雄联盟但我不想有太多的“猎虫”乐趣。这是你的错误,你应该得到乐趣:)幸运的是,该程序只处理非负整数。另外,我已经设置好了
subtract()。现在唯一剩下的问题是
subtract()
函数:(如果要减去的数字的长度不同会发生什么情况呢?比方说
12
-
8
…函数的第一个数字操作是什么?嗯,数字是反向存储的,所以它应该做
2-8=-6
,然后
-6+10=4
。嗯…我忘记了反向操作。但是会发生什么呢在
12
-
8
q->digit
是8,
q->next
是空的。注意
中的最后一句话,而
@pmg我将它改为
如果(qCurr->next)qCurr=qCurr->next;否则qCurr->digit=0;
。我得到了非常奇怪的结果,这就证明了这一点
    /* ... */
    while( p )
    {
        /* ... */
    }