Ejemplo n.º 1
0
 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);
 }
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
//主函数
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;
}
Ejemplo n.º 4
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;
}
Ejemplo n.º 5
0
//多项式相加运算,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
}