6-3 Add Two Polynomials (20 分)
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
#include <stdio.h>
#include <stdlib.h>
typedef struct Node *PtrToNode;
struct Node {
int Coefficient;
int Exponent;
PtrToNode Next;
};
typedef PtrToNode Polynomial;
Polynomial Read(){
Polynomial s = (Polynomial)malloc(sizeof(struct Node));
int n = 0;
Polynomial h = s;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
Polynomial p1 = (Polynomial)malloc(sizeof(struct Node));
scanf("%d %d", &p1->Coefficient, &p1->Exponent);
s->Next = p1;
p1->Next = NULL;
s = p1;
}
return h;
}
void Print(Polynomial p) {
p = p->Next;
while (p) {
printf("%d %d ", p->Coefficient, p->Exponent);
p = p->Next;
}
}
Polynomial Add(Polynomial a, Polynomial b);
int main()
{
Polynomial a, b, s;
a = Read();
b = Read();
s = Add(a, b);
Print(s);
return 0;
}
Polynomial Add(Polynomial a, Polynomial b) {
if (!a->Next) return b;
if (!b->Next) return a;
a = a->Next;
b = b->Next;
int sum = 0;
int ans[100000] = {0};
while (a) {
ans[a->Exponent] += a->Coefficient;
if (a->Exponent > sum)
sum = a->Exponent;
a = a->Next;
}
while (b) {
ans[b->Exponent] += b->Coefficient;
if (b->Exponent > sum)
sum = b->Exponent;
b = b->Next;
}
int flag = 0;
Polynomial s = (Polynomial)malloc(sizeof(struct Node));
Polynomial h = s;
for (int i = sum; i >= 0; i--) {
if (ans[i] != 0) {
Polynomial tp = (Polynomial)malloc(sizeof(struct Node));
tp->Exponent = i;
tp->Coefficient = ans[i];
s->Next = tp;
tp->Next = NULL;
s = tp;
flag = 1;
}
}
if(flag==0){
Polynomial tp = (Polynomial)malloc(sizeof(struct Node));
tp->Exponent = 0;
tp->Coefficient = 0;
tp->Next = NULL;
s->Next = NULL;
}
return h;
}