#include<stdio.h> //多項式的加法
#include<stdlib.h> //多項式本身可能不是最簡的情況,即需要合併多項式冪指數相同的項
typedef struct node
{
int coef; //係數coefficient
int expn; //指數exponent
struct node *next;
}Node;
Node *insert(Node *head, Node *p) //插入函數
{
Node *p1, *p2;
if (head->next == NULL)
{
head->next = p;
p->next = NULL;
return head;
}
else
{
p1 = p2 = head->next;
while (p->expn < p1->expn&&p1->next != NULL)
{
p2 = p1;
p1 = p1->next;
}
if (p->expn >= p1->expn)
{
p->next = p1;
if (p1 == head->next)
head->next = p;
else
p2->next = p;
}
else
{
p1->next = p;
p->next = NULL;
}
}
return head;
}
Node *create() //創建按照冪指數升序排列的帶頭鏈表
{
Node *head, *p;
int coef, expn;
head = (Node *)malloc(sizeof(Node));
head->next = NULL;
scanf("%d %d", &coef, &expn);
while (expn >= 0)
{
p = (Node *)malloc(sizeof(Node));
p->coef = coef;
p->expn = expn;
head = insert(head, p);
scanf("%d %d", &coef, &expn);
}
return head;
}
Node *ADD(Node *A, Node *B) //多項式相加(冪指數降序)
{
Node *pa1, *pa2, *pb, *p;
pa1 = A->next;
pa2 = A; //pa2指向pa1的前驅
pb = B->next;
while (pa1&&pb)
{
if (pb->expn < pa1->expn) //將A的當前節點後移即可
{
pa2 = pa1;
pa1 = pa1->next;
}
else
if (pb->expn > pa1->expn) //插入在pa1之前
{
p = pb->next;
pb->next = pa1;
pa2->next = pb;
pa2 = pb;
pb = p;
}
else //冪指數相等
{
pa1->coef = pa1->coef + pb->coef; //先相加,之後再刪除係數爲0的項
pa2 = pa1;
pa1 = pa1->next;
pb = pb->next;
}
}
if (pb)
pa2->next = pb;
return A;
}
void simplify(Node *head) //將多項式化爲最簡,即合併同指數冪項
{
Node *p1, *p2, *p;
p2 = head->next;
if (!p2) return;
p1 = p2->next;
while (p1)
{
if (p2->expn == p1->expn)
{
p2->coef = p2->coef + p1->coef;
p = p1;
p1 = p1->next;
p2->next = p1;
free(p);
}
else
{
p2 = p1;
p1 = p1->next;
}
}
}
void delzero(Node *head) //刪除coef爲零的節點
{
Node *p1, *p2, *p;
p2 = head;
p1 = head->next;
while (p1)
{
if (p1->coef == 0)
{
p = p1;
if (p1 == head->next)
head->next = p1->next;
else
p2->next = p1->next;
p1 = p1->next;
free(p);
}
else
{
p2 = p1;
p1 = p1->next;
}
}
}
void show(Node *A)
{
Node *p;
p = A->next;
while (p)
{
printf("[ %d %d ] ", p->coef, p->expn);
p = p->next;
}
printf("\n");
}
int main()
{
Node *A[100], *B[100];
int i, n;
scanf("%d", &n);
for (i = 0; i < n; i++)
{
A[i] = create();
B[i] = create();
A[i] = ADD(A[i], B[i]);
}
for (i = 0; i < n; i++)
{
simplify(A[i]);
delzero(A[i]);
show(A[i]);
}
return 0;
}
DSOJ Addition of Polynomial(多項式求和)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.