浙江大学第五六周练习2-1 Add Two Polynomials

2-1 Add Two Polynomials

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; /* Nodes are sorted in decreasing order of exponents.*/

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

Sample program of judge:

 

#include <stdio.h> #include <stdlib.h> typedef struct Node *PtrToNode; struct Node { int Coefficient; int Exponent; PtrToNode Next; }; typedef PtrToNode Polynomial; Polynomial Read(); /* details omitted */ void Print( Polynomial p ); /* details omitted */ Polynomial Add( Polynomial a, Polynomial b ); int main() { Polynomial a, b, s; a = Read(); b = Read(); s = Add(a, b); Print(s); return 0; } /* Your function will be put here */

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

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

答案一 

Polynomial Add( Polynomial a, Polynomial b ){
	Polynomial t1=a,t2=b,head,rear,tmp;
	head = (Polynomial)malloc(sizeof(struct Node));head->Next = NULL;
	rear = head;
	while(t1&&t2){
		if(t1->Exponent==t2->Exponent){
			if(t1->Coefficient+t2->Coefficient){
				Polynomial P = (Polynomial)malloc(sizeof(struct Node));
				P->Coefficient = t1->Coefficient+t2->Coefficient;P->Exponent=t1->Exponent;
				rear->Next = P;rear = P;  //尾插法
			}
			t1=t1->Next;t2=t2->Next;
		}else if(t1->Exponent<t2->Exponent){
			Polynomial P = (Polynomial)malloc(sizeof(struct Node));
			P->Coefficient = t2->Coefficient;P->Exponent=t2->Exponent;
			rear->Next = P;rear = P;  //尾插法
			t2=t2->Next;
		}else{
			Polynomial P = (Polynomial)malloc(sizeof(Polynomial));
			P->Coefficient = t1->Coefficient;P->Exponent=t1->Exponent;
			rear->Next = P;rear = P;  //尾插法
			t1=t1->Next;
		}
	}
	rear->Next=t1?t1:t2;  //相当于写循环把t1/t2剩下的结点一个个加到链表中
	return head;  //根据题意,空结点不用释放
}

答案二、 

Polynomial Add( Polynomial a, Polynomial b )
{
    Polynomial c;  //c是新产生的链表的头指针
    c = (Polynomial) malloc(sizeof(struct Node));
    c->Next = NULL; 
    PtrToNode p,t;  //t是新产生的链表的尾指针
    t = c;

    //首先判断是否为空表
    if(a->Next==NULL)
        return b;
    else if(b->Next==NULL)
        return a;
    else{
        a = a->Next;
        b = b->Next;
    }
 
    while (a&&b)
    {
        p = (Polynomial) malloc(sizeof(struct Node));
        
        while(1){ //判断是否为全0     
            if(a->Coefficient + b->Coefficient !=0)
                break;
            else{
                a = a->Next;
                b = b->Next;
                if(a==NULL){
                    p->Next = b;
                    return c;
                }   
                else if(b==NULL){
                    p->Next = a;
                    return c;
                }
            }
        }

        if(a->Exponent == b->Exponent){ //如果a,b的指数相等
            if(a->Coefficient + b->Coefficient !=0){
                p->Exponent = a->Exponent;
                p->Coefficient = a->Coefficient + b->Coefficient;
                }
                a = a->Next;
                b = b->Next;
        }
        else if(a->Exponent > b->Exponent){//如果a的指数>b的指数
                p->Exponent = a->Exponent;
                p->Coefficient = a->Coefficient;
                a = a->Next;
            }
        else{//如果a的指数<b的指数
                p->Exponent = b->Exponent;
                p->Coefficient = b->Coefficient;
                b = b->Next;
            }

            p->Next = NULL;
            t->Next = p;  //把p接在t后面
            t = t->Next;  //尾指针后移
    }
    if(a==NULL){
        p->Next = b;
        return c;
    }   
    else if(b==NULL){
        p->Next = a;
        return c;
    }
    return c;
        
}
    
           
           

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值