#include<stdio.h>
typedef struct Polynome {
int coef; /*系数*/
int expo; /*指数*/
struct Polynome* next;
}Term, * Poly;
void PrintPoly(Poly p); /*打印多项式*/
void InitPoly(Poly* p); /*初始化多项式*/
void AddPoly(Poly pa, Poly pb); /*将两个多项式相加*/
void PrintPoly(Poly p) /*打印多项式*/
{
Term* cur = p->next; /*cur指针指向第一个结点*/
while (cur != NULL) /*cur不为空,则打印其内容*/
{
printf("(%d)x^%d ", cur->coef, cur->expo);
if (cur->next != NULL)
{
printf("+ ");
}
cur = cur->next; /*cur指针后移*/
}
printf("\n\n");
} /*PrintPoly函数*/
void InitPoly(Poly* p) /*初始化多项式*/
{
*p = (Poly)malloc(sizeof(Term));
if (*p == NULL)
{
return 0;
}
(*p)->next = NULL; /*初始化表头*/
Term* tail = *p; /*tail指针始终指向链表的尾部*/
Term* new; /*用于新建结点*/
int flag = 1;
while (flag)
{
new = (Poly)malloc(sizeof(Term));
if (new == NULL)
{
return 0;
}
//(new)->next = NULL; /*初始化一个新项*/
scanf_s("%d %d", &new->coef, &new->expo);
if (new->coef != 0)
{
tail->next = new;
tail = tail->next; /*尾插法建立多项式*/
}
else
{
flag = 0;
tail->next = NULL; /*清空表尾结点的next指针*/
}
}
} /*InitPoly函数*/
void AddPoly(Poly pa, Poly pb) /*将两个多项式相加*/
{
Term* tail = pa; /*tail指针始终指向新链表的尾部*/
Term* p1 = pa->next;
Term* p2 = pb->next; /*p1,p2指针用于遍历pa和pb两个多项式,依次比较各项的指数大小*/
Term* temp; /*用于保存待释放结点的地址*/
while (p1 != NULL && p2 != NULL) /*当两个多项式都没遍历完时*/
{
if (p1->expo < p2->expo) /*如果p1项指数小于p2项指数*/
{
tail->next = p1; /*将p1项添加到新链表队尾*/
tail = p1; /*新链表尾指针后移*/
p1 = p1->next; /*p1继续遍历多项式pa*/
}
else if (p1->expo == p2->expo) /*如果p1项指数等于p2项指数*/
{
if (p1->coef + p2->coef != 0) /*如果两个同类项系数之和不为零*/
{
p1->coef += p2->coef; /*系数相加保存在p1项系数中*/
tail->next = p1; /*把p1项添加到新链表表尾*/
tail = p1; /*新链表表尾更新为p1项*/
p1 = p1->next; /*p1继续遍历多项式pa*/
temp = p2; /*保存p2项位置*/
p2 = p2->next; /*p2继续遍历多项式pb*/
free(temp); /*释放原p2项*/
}
else /*如果两个同类项系数之和为零*/
{
temp = p1; /*保存p1项位置*/
p1 = p1->next; /*p1继续遍历多项式pa*/
free(temp); /*释放原p1项*/
temp = p2; /*保存p2项位置*/
p2 = p2->next; /*p2继续遍历多项式pb*/
free(temp); /*释放原p2项*/
}
}
else /*如果p1项指数大于p2项指数*/
{
tail->next = p2; /*将p2项添加到新链表队尾*/
tail = p2; /*新链表尾指针后移*/
p2 = p2->next; /*p2继续遍历多项式pb*/
}
} /*while*/
if (p1 != NULL)
{
tail->next = p1;
}
else
{
tail->next = p2;
} /*如果有任何一个多项式还未遍历完,将剩余部分尾插到新链表*/
free(pb); /*释放多项式pb头结点*/
} /*AddPoly函数*/
void Test()
{
printf("******按照指数次数由小到大的顺序依次添加系数和指数,输入系数为零则代表一次结束,共两次*******\n");
printf("输入示例:\n1 2\n3 4\n5 6\n0 8 /*此时系数为零,第一个多项式初始化结束*/\n");
printf("1 2\n2 3\n3 4\n7 8\n0 1 /*此时系数为零,第二个多项式也初始化结束。两次初始化指数次数必须由小到大否则结果不正确。*/\n");
Poly pa;
Poly pb;
InitPoly(&pa);
InitPoly(&pb);
printf("第一个多项式为:\n\n");
PrintPoly(pa);
printf("第二个多项式为:\n\n");
PrintPoly(pb);
AddPoly(pa, pb);
printf("相加后的多项式为:\n");
PrintPoly(pa);
}
int main()
{
Test();
return 0;
}
算法思想详见注释。