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;
}