ZJU PTA 6-1 Add Two Polynomials

ZJU PTA 6-1 Add Two Polynomials,第1张

ZJU PTA 6-1 Add Two Polynomials 6-1 Add Two Polynomials (10 point(s))

Write a function to add two polynomials. Do not destroy the input. Use a linked list implementation with a dummy head node. Note: The zero polynomial is represented by an empty list with only the dummy head node.

Format of functions:

Polynomial Add( Polynomial a, Polynomial b );

where Polynomial is defined as the following:

typedef struct Node *PtrToNode;
struct Node {
    int Coefficient;
    int Exponent;
    PtrTonode Next;
};
typedef PtrTonode Polynomial;
  

The function Add is supposed to return a polynomial which is the sum of a and b.

Sample program of judge:
#include 
#include 
typedef struct Node *PtrToNode;
struct Node  {
    int Coefficient;
    int Exponent;
    PtrTonode Next;
};
typedef PtrTonode Polynomial;

Polynomial Read(); 
void Print( Polynomial p ); 
Polynomial Add( Polynomial a, Polynomial b );

int main()
{
    Polynomial a, b, s;
    a = Read();
    b = Read();
    s = Add(a, b);
    Print(s);
    return 0;
}



Sample Input:

4
3 4 -5 2 6 1 -2 0
3
5 20 -7 4 3 1

Sample Output:

5 20 -4 4 -5 2 9 1 -2 0
Polynomial Add( Polynomial a, Polynomial b )
{
    Polynomial s = a;// make s point to any dummy head
    Polynomial pa = a->Next, pb = b->Next;
    Polynomial cur = s;// as the cursor, in order to make s unchanged

    while (pa != NULL && pb != NULL) {// When any polynomial traversal is completed, we can stop
    // compare the exponents of each term of a and b
        if (pa->Exponent > pb->Exponent) {
            cur->Next = pa;
            pa = pa->Next;
            cur = cur->Next;
        }
        else if (pa->Exponent < pb->Exponent) {
            cur->Next = pb;
            pb = pb->Next;
            cur = cur->Next;
        }
        else {// if the exponent of pa equals to the exponent of pb
            pb->Coefficient += pa->Coefficient;// here I select the b as the base
            if (pb->Coefficient != 0) {
                cur->Next = pb;
                cur = cur->Next;
            }
            pa = pa->Next;
            pb = pb->Next;
        }
    }
    if (pa == NULL) {// If the pa has been traversed, let's point cur to psb
        cur->Next = pb;
    }
    else {// If the pb has been traversed, let's point cur to pa
        cur->Next = pa;
    }
    return s;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5703500.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存