#include <stdio.h>
#include <stdlib.h>
typedef struct Polynode
{
int coef;
int exp;
struct Polynode *next;
}Polynode, *Polylist;
// 初始化多项式
bool InitPoly(Polylist *Poly) // 二级指针
{
*Poly = (Polylist)malloc(sizeof(Polynode)); //产生头结点,并使L指向此头节点
if (!(*Poly)) // 存储分配失败
return false;
(*Poly)->next = NULL;
return true;
}
// 外插法建立一元多项式单链表,n代表多项式非零系数的个数
void PolyCreate(Polylist head, int n)
{
Polynode *rear, *s; //rear为尾指针,s为新结点指针
int c, e;
rear = head;
for (int i = 0; i < n; i++)
{
scanf_s("%d %d", &c, &e);
s = (Polynode*)malloc(sizeof(Polynode));
s->coef = c;
s->exp = e;
rear->next = s; // 当前结点作为表尾插入
rear = s; // 插入的结点作为新的尾节点
}
rear->next = NULL; // 将表尾的最后一个结点置为空
}
// 多项式相加
void Polyadd(Polylist polya, Polylist polyb)
{
Polynode *p, *q, *pre, *temp;
int sum;
p = polya->next; // p指向polya第一个结点
q = polyb->next; // q指向polyb第一个结点
pre = polya; // pre表示和多项式的尾节点,初始与polya相同
while (p != NULL && q != NULL)
{
if (p->exp > q->exp) // a的结点加入和多项式
{
pre->next = p; // p所指的结点加入和多项式
pre = p; // pre向后移动,尾插
p = p->next; // 扫描下一个p
}
else if (p->exp == q->exp) // 系数相等,对应系数相加
{
sum = p->coef + q->coef;
if (sum != 0)
{
p->coef = sum; // 修改p
pre->next = p; // 将p加入表尾
pre = p;
p = p->next; // p向后移动
temp = q;
q = q->next;
free(temp); // 释放系数相同的q结点
}
else
{
// 系数相同情况
temp = p;
p = p->next;
free(temp); // 释放原来p指针
temp = q;
q = q->next;
free(temp);
}
}
else
{
pre->next = q; //将q加入到和多项式尾部
pre = q; // 将pre移动到q
q = q->next;
}
}
if (p != NULL)
pre->next = p; // 将p剩余结点加入到和多项式
else
pre->next = q;
}
void PrintPoly(Polylist poly)
{
Polynode *p;
p = poly->next;
printf("%d", p->coef);
printf(" %d", p->exp);
p = p->next;
while (p != NULL)
{
printf(" %d", p->coef);
printf(" %d", p->exp);
p = p->next;
}
printf("\n");
}
int main()
{
Polylist Polya, Polyb;
int n, m;
InitPoly(&Polya);
InitPoly(&Polyb);
scanf_s("%d", &n);
PolyCreate(Polya, n);
scanf_s("%d", &m);
PolyCreate(Polyb, m);
Polyadd(Polya, Polyb);
PrintPoly(Polya);
}