void main() { polynomial p,q; int m; printf("请输入第一个一元多项式的非零项的个数:"); scanf("%d",&m); CreatPolyn(&p,m); printf("请输入第二个一元多项式的非零项的个数:"); scanf("%d",&m); CreatPolyn(&q,m); AddPolyn(&p,&q); printf("两个一元多项式相加的结果:\n"); PrintPolyn(p); printf("请输入第三个一元多项式的非零项的个数:"); scanf("%d",&m); CreatPolyn(&q,m); AddPolyn1(&p,&q); printf("两个一元多项式相加的结果(另一种方法):\n"); PrintPolyn(p); printf("请输入第四个一元多项式的非零项的个数:"); scanf("%d",&m); CreatPolyn(&q,m); SubtractPolyn(&p,&q); printf("两个一元多项式相减的结果:\n"); PrintPolyn(p); printf("请输入第五个一元多项式的非零项的个数:"); scanf("%d",&m); CreatPolyn(&q,m); MultiplyPolyn(&p,&q); printf("两个一元多项式相乘的结果:\n"); PrintPolyn(p); DestroyPolyn(&p); }
void AddPolyn(polynomail *pa, polynomail *pb) { Link *ha, *hb, *hc; //利用归并的方法,将两个多项式合并成一个 ha = pa->head->next; hb = pb->head->next; hc = pa->head; while (ha&&hb) { if (ha->data->expn < hb->data->expn) { hc->next = ha; hc = hc->next; ha = ha->next; } else if (ha->data->expn == hb->data->expn) { Link *t; ha->data->coef += hb->data->coef; t = hb; hb = hb->next; FreeNode(t); if (fabs(ha->data->coef) < 1e-6) { t = ha; ha = ha->next; FreeNode(t); } else { hc->next = ha; ha = ha->next; hc = hc->next; } } else { hc->next = hb; hc = hc->next; hb = hb->next; } } if (ha)hc->next = ha; else if (hb)hc->next = hb; else hc->next = NULL; pb->head->next = NULL; DestroyPolyn(pb); pa->tail = GetLast(*pa); pa->len = ListLength(*pa); }
//主函数 int main() { int m; float x; polynomial p1,p2;//建立新链表 p1.head=NULL; p1.tail=NULL; p1.len=0; p2.head=NULL; p2.tail=NULL; p2.len=0; printf("请输入关于x的多项式1中x的最高次幂:"); scanf("%d",&m); if(m<0) { printf("输入值非法!\n"); } CreatePolyn(&p1,m);//创建多项式 printf("多项式1"); PrintPolyn(&p1);//显示多项式1 printf("请输入关于x的多项式2中x的最高次幂:"); scanf("%d",&m); if(m<0) { printf("输入值非法!\n"); } CreatePolyn(&p2,m);//创建多项式 printf("多项式2"); PrintPolyn(&p2);//显示多项式 AddPolyn(&p1,&p2); printf("和多项式"); PrintPolyn(&p1);//输出和多项式 printf("输入x的值:"); scanf("%f",&x); printf("多项式在x=%g时,值为%g",x,ComputeValue(&p1,x));//输出多项式求值 DestroyPolyn(&p1);//销毁多项式 return 0; }
Status MultiplyPolyn(polynomail *pa, polynomail *pb) { Link *ha; Link *t; if (!pa || !pb) return ERROR; if (ListEmpty(*pa) || ListEmpty(*pb)) return ERROR; ha = pa->head->next; pa->tail = pa->head; pa->head->next = NULL; pa->len = 0; while (ha) { //将pa中每个结点分别于pb整个链表乘一遍 t = sub_MultiplyPolyn(ha, pb); //返回一串结点,将这一串节点插入pa中 if (t == NULL)return ERROR; if (Append(pa, t) == ERROR)return ERROR; t = ha; ha = ha->next; FreeNode(t); } SortPolyn(pa); DestroyPolyn(pb); return OK; }
//多项式相加运算,Pa=Pa+Pb,并销毁多项式Pb void AddPolyn(polynomial *Pa,polynomial *Pb) { Link ptr_a,ptr_b,ta,tb,ha; ta=NULL;//Pa链表中的临时指针 tb=NULL;//Pb链表中的临时指针 ha=NULL;//ha为当前已经合并的链表最后一个结点 ptr_a=Pa->head;//指向多项式Pa ptr_b=Pb->head;//指向多项式Pb while(ptr_a&&ptr_b) { if(ptr_a->data.expn==ptr_b->data.expn)//幂相等,合并同类项 { ptr_a->data.coeff+=ptr_b->data.coeff;//系数相加 if(ptr_a->data.coeff==0.0)//系数为0 { if(ha==NULL)//Pa的首相相消 Pa->head=ptr_a->next; free(ptr_a);//删除ptr_a指向结点 ptr_a=Pa->head; } else { //系数不为0 if(ha!=NULL)//和多项式项数不为0 ha->next=ptr_a; ha=ptr_a; ptr_a=ptr_a->next; } tb=ptr_b->next; free(ptr_b); ptr_b=tb; } else if(ptr_a->data.expn<ptr_b->data.expn)//Pb当前项幂较高 { if(ha==NULL) { Pa->head=ha=ptr_b; } else { ha->next=ptr_b; ha=ptr_b; } ptr_b=ptr_b->next; } else//Pa当前项幂较高 { if(ha==NULL) ha=ptr_a; else ha->next=ptr_a; ptr_a=ptr_a->next; }//if }//while //链接剩余结点 if(ha!=NULL)//所有处理过的项均相消 { ha->next=(ptr_a==NULL)?(ptr_b):(ptr_a); } else { Pa->head=(ptr_a==NULL)?(ptr_b):(ptr_a); } Pb->head=Pb->tail=NULL;//修改多项式Pb指针 Pb->len=0; //修正多项式Pa的尾指针和长度 Pa->len=0; Pa->tail=Pa->head; if(Pa->tail!=NULL) while(Pa->tail->next) { Pa->tail=Pa->tail->next; Pa->len++; } Pa->len++; DestroyPolyn(Pb);//销毁Pb }