一元多项式

一元多项式

功能:1>.求解2个一元多项式的和

           2>.求解2个一元多项式的差

           3>.打印一元多项式

        注:3>这个本来不算是一个功能,但是发现打印一元多项式的时候问题很多。例如:-1X应该打印成-X,X^0不应该应该打印出来

1.结点的定义

typedef struct Polynomial 
{
	int coef;
	int expn;
	struct Polynomial *next;
}Polynomial;

2.多项式的创建(尾插法)

Polynomial *Create_List()
{
	int coef;
	int expn;
	Polynomial *pHead;
	pHead=(Polynomial*)malloc(sizeof(Polynomial));
	pHead->next=NULL;//很重要 
	Polynomial *pnew=NULL;
	Polynomial *rear=NULL;
	rear=pHead;
	printf("请输入数字coef和expn\n");
	scanf("%d %d",&coef,&expn);
	while(coef!=0)
	{
		pnew=(Polynomial*)malloc(sizeof(Polynomial));
		pnew->coef=coef;
		pnew->expn=expn;
		pnew->next=rear->next;
		rear->next=pnew;
		rear=pnew;
	scanf("%d %d",&coef,&expn);
	}
	printf("创建完成!\n");
	return pHead;
}

3.多项式求和

Polynomial *AddPolyn(Polynomial *pa,Polynomial *pb)
{
	Polynomial *pc=(Polynomial*)malloc(sizeof(Polynomial));//尾结点 
	Polynomial *chead=pc;//头结点 
	pc->next=NULL;
	Polynomial *qa=pa->next;
	Polynomial *qb=pb->next;
	Polynomial *qc=NULL;//新结点 
	while(qa!=NULL&&qb!=NULL)
	{
		qc=(Polynomial*)malloc(sizeof(Polynomial));
		if(qa->expn<qb->expn)
		{
			qc->coef=qa->coef;
			qc->expn=qa->expn;
			qa=qa->next;	
		}
		else if(qa->expn>qb->expn)
		{
			qc->coef=qb->coef;
			qc->expn=qc->expn;
			qc=qc->next;
		}
		else
		{
			qc->coef=qa->coef+qb->coef;
			qc->expn=qa->expn;
			qa=qa->next;
			qb=qb->next;	
		}
		if(qc->coef!=NULL)
		{
			qc->next=pc->next;
			pc->next=qc;
			pc=qc;
		}	
		else
		free(qc);	
	} 
	while(qa!=NULL)
	{
		qc=(Polynomial*)malloc(sizeof(Polynomial));
		qc->coef=qa->coef;
		qc->expn=qa->expn;
		qc->next=pc->next;
			pc->next=qc;
			pc=qc;
		qa=qa->next;
	 } 
	while(qb!=NULL)	
	{
		qc=(Polynomial*)malloc(sizeof(Polynomial));
		qc->coef=qb->coef;
		qc->expn=qb->expn;
		qc->next=pc->next;
			pc->next=qc;
			pc=qc;
		qb=qb->next;
	}
	return chead;
}

设计思路:

               1>.当qa与qb结点都不为空时,将结点qx->expn较小的结点赋给qc,并且将qc采用尾插法连接给pc;

                   相等时,qa与qb进行运算,将结果赋给qc并且将qc采用尾插法连接给pc

               2>.当qa为空时,将pb中未遍历的结点逐一复制连接在pc后面

               3>.当qa为空时,将pb中未遍历的结点逐一复制连接在pc后面

4.多项式求差

Polynomial *SubPolyn(Polynomial *pa,Polynomial *pb)
{
	Polynomial *headc=NULL;
	Polynomial *p=pb->next;
	while(p!=NULL)
	{
		p->coef=p->coef*(-1);
		p=p->next;
	}
	headc=AddPolyn(pa,pb);
	p=pb->next;
	while(p!=NULL)
	{
		p->coef=p->coef*(-1);
		p=p->next;
	}
	return headc;
}

设计思路: 

                1>.由于要实现多项式pc-pb,可以考虑将多项式pb的每一项的系数*-1;

                2>.调用求和函数

                3>.恢复多项式pb,将多项式pb的每一项的系数*-1

5.打印多项式

     说明:原本以为这只是一个很简单的打印函数,但是却是花的时间最长的。。。。。。。因为考虑的东西稍微有点多

int Print_List(Polynomial *pHead)
{
	Polynomial *p=pHead->next;
	int flag=0;
	if(p==NULL)
	{
		printf("链表为空!\n");
		return 0;
	}
	else{
	while(p!=NULL){
			if(flag!=0&&p->coef>0)
				putchar('+');
			if(p->coef!=1&&p->coef!=-1)
				{
					printf("%d",p->coef);
					if(p->expn==1)	putchar('X');
					else if(p->expn) printf("X^%d",p->expn);//不为0 
				}
			else
			{
				if(p->coef==1)
				{
					if(!p->expn) putchar('1');//为0 
					else if(p->expn=1) putchar('X');
					else printf("X%d",p->expn);
					
				}
				if(p->coef==-1)
				{
					if(!p->expn) printf("-1");
					else if(p->expn==1)
					printf("-X");
					else printf("-X^%d",p->expn);
				}
				
			}
		
			p=p->next;
				flag=1;
		}
		}
		printf("\n");
	return 1;
	
}

设计思路:

               1.首先区分打印的是不是多项式的第一个数,因为当多项式的第一个数为整数时不应该打印"+"号,其余的应该打印"+"号

                2.其次,因该分为三种情况

                          1>.多项式的系数不为-1&&+1;

                           2>.多项式的系数不为-1

                           3>.多项式的系数不为-1

               在以上三种情况的基础上必须讨论多项式X的指数是不是为0;

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值