c语言实现多项式的基本运算

多项式是数学中常用的一种表达式,现在我们给出用c语言编程实现多项式的计算,并且多项式的计算是链表的典型应用,通过编程实现多项式,也为我们巩固一下链表的知识以及它的生活应用。
下面给出代码

#include 
#include 
#include 
typedef struct node
{ float coef; //系数域 
  int  exp;  //指数域 
  struct node *next; //指针域 
  }*polynode;
int LocateElem(polynode L,int e) //在链表中查找与e相等的元素并返回元素位置 
{	int i;
	polynode p;
	p=L->next;
	for(i=0;i<L->exp;i++)
	{
		if(p->exp==e)
		return i+1;
		p=p->next;
	}
	return 0;
 } 
 int CreatePoly(polynode &L ,int m)
 {  int i;
 	L=(polynode)malloc(sizeof(polynode));
    L->coef=0.0;
    L->exp=0;  //头指针指数域中存放链表长度 
	polynode p,r;
 	r=L;
    for(i=0;i<m;i++)  //依次输入 m 个非零项 
     { 	p=(polynode)malloc(sizeof(polynode));
	   scanf("%f,%d",&p->coef,&p->exp);
	   if(!LocateElem(L,p->exp)) //如果表中不存在相同指数项,则插入 
	  { r->next=p;
	   r=p; 
	   L->exp++; //表长++ 
		} 
	 }
	 r->next=NULL; 
     return 1;
 }

 void print(polynode L)//打印函数 
 {  int i=0;
 	polynode p;
    p=L->next;
 	while(i<L->exp)
 	{ 
	  printf("%.2f,%d  ",p->coef,p->exp);
	  p=p->next;
	  i++;
	  if(i%10==0)
	  printf("\n");
	 }
 }
 void AddPoly(polynode &La,polynode &Lb)  //多项式相加 
 {  polynode p,q,pre,r;  //p,q为LaLb当前指针节点 ,pre为指向La中p的前一个节点,r为Lb中的交换容器 
 	float x;
	 p=La->next;
 	q=Lb->next;
 	pre=La;
 	while((p!=NULL)&&(q!=NULL))
 	{ if(p->exp<q->exp) 
 	   { pre=p; //pre为指向La中p的前一个节点
		 p=p->next;
		}
	  else if(p->exp==q->exp)
	  { x=p->coef+q->coef;  //系数相加 
	    if(x!=0)
	    { p->coef=x;
	      pre=p;
		}
		else
	     { pre->next=p->next;  //如果等于0,则删除等于0的节点 
	       free(p);
	       La->exp--;  //La长度-1
		 }
		 p=pre->next;
		 r=q; //删除q节点前先赋给r 
		 q=q->next;
		 free(r); //删除q节点 
		 Lb->exp--;  //Lb长度-1 
	  }
	  else //如果Lb指数项小,则插入到La中 
	  { r=q->next; //因为q也要往下走,所以用r来做中间容器 
	  	q->next=p;  //插入到p之前 
		 pre->next=q; 
		 pre=q;  //改变pre的指向 
		 q=r;  //因为q也要往下走,所以用r来做中间容器 
		 La->exp++; //长度+1 
		  Lb->exp--; //Lb长度-1 
	  }
	 }
 	if(q!=NULL)  //链接p的剩余节点 
	{ pre->next=q;
	  La->exp+=Lb->exp;  //LaLb长度相加 
	 }
	 free(Lb); 
 }
 void SubtractPoly(polynode &La,polynode &Lb)  //多项式相减 
 {  polynode p,q,pre,r;  //p,q为LaLb当前指针节点 ,pre为指向La中p的前一个节点,r为Lb中的交换容器 
 	float x;
	 p=La->next;
 	q=Lb->next;
 	pre=La;
 	while((p!=NULL)&&(q!=NULL))
 	{ if(p->exp<q->exp) 
 	   { pre=p; //pre为指向La中p的前一个节点
		 p=p->next;
		}
	  else if(p->exp==q->exp)
	  { x=p->coef-q->coef;  //系数相加 
	    if(x!=0)
	    { p->coef=x;
	      pre=p;
		}
		else
	     { pre->next=p->next;  //如果等于0,则删除等于0的节点 
	       free(p);
	       La->exp--;  //La长度-1
		 }
		 p=pre->next;
		 r=q; //删除q节点前先赋给r 
		 q=q->next;
		 free(r); //删除q节点 
		 Lb->exp--;  //Lb长度-1 
	  }
	  else //如果Lb指数项小,则插入到La中 
	  { r=q->next; //因为q也要往下走,所以用r来做中间容器 
	    q->coef=-q->coef;
	  	q->next=p;  //插入到p之前 
		 pre->next=q; 
		 pre=q;  //改变pre的指向 
		 q=r;  //因为q也要往下走,所以用r来做中间容器 
		 La->exp++; //长度+1 
		  Lb->exp--; //Lb长度-1 
	  }
	 }
 	if(q!=NULL)  //链接p的剩余节点 
	{ pre->next=q;
	  while(q)
	  { q->coef=-q->coef;
	    q=q->next;
	  }
	  La->exp+=Lb->exp;  //LaLb长度相加 
	 }
	 free(Lb); 
 }
polynode MultiplyPoly(polynode La,polynode Lb)  //多项式相乘 
 {  
    polynode p,q,r,Lc,pre,rear,s; //Lc为最终生成的链表  r为交换容器( rear为Lc中的当前指针 s为生成的新节点 
	p=La->next;
	q=Lb->next;
	Lc=(polynode)malloc(sizeof(polynode));
	Lc->exp=0;
	rear=Lc;
	while(q)  //将La的第一项与Lb的每个项相乘 
	{
		s=(polynode)malloc(sizeof(polynode));
		s->exp=p->exp+q->exp;
		s->coef=p->coef*q->coef;
		s->next=NULL;
		rear->next=s;
		rear=s;
		Lc->exp++;
		q=q->next;
	}
	p=p->next;
	while(p)// 下面依次将元素插入到Lc中
	{   rear=Lc->next;
		q=Lb->next;
		while(q)
		{   s=(polynode)malloc(sizeof(polynode));
			s->exp=p->exp+q->exp;
			s->coef=p->coef*q->coef;
			s->next=NULL;
			rear=Lc->next;
			pre=rear;
			while(rear)  //判断系数 与之前的相加函数类似 
			{
			  if(rear->exp<s->exp)
				{ pre=rear;
			 	 rear=rear->next;			  
				}
				else if(rear->exp==s->exp) //如果系数相等,则相加 
				{
					if((rear->coef+s->coef)!=0)
					{
						pre=rear;			
						rear->coef+=s->coef;
					}
					else 
					{ pre->next=rear->next;
					  free(rear);
					  Lc->exp--;					
					}
				rear=pre->next;
				break;
				}
				else   //如果之前没有,则插入 
				{ s->next=rear;
				  pre->next=s;
				  pre=s;	
				  Lc->exp++;
				  break;
				}
			}
			if((s!=NULL)&&(rear==NULL)) //如果后面还有项,则补到Lc后 
			{pre->next=s;
			 Lc->exp++;
			}
			q=q->next;
		}
		p=p->next;		
	}
	return Lc;
 }
void Substitution(polynode L,float x)
{ float sum=0;
  polynode p;
  p=L->next;
  while(p)
  {
  	sum+=p->coef*pow(x,p->exp);
  
  	p=p->next;
  }
  printf("代入结果为:%f",sum);

}
void  menu()
{   
	printf("\n-------------------------------------1.两个多项式相加----------------------------------------------------------");
	printf("\n-------------------------------------2.两个多项式相减----------------------------------------------------------");
	printf("\n-------------------------------------3.两个多项式相乘----------------------------------------------------------");
	printf("\n-------------------------------------4.打印多项式--------------------------------------------------------------");
    printf("\n-------------------------------------5.带入x值运算--------------------------------------------------------------");



 } 
  int main()
  { int choose,m,n,x,sum; 
  	polynode La,Lb,Lc;
    printf("输入多项式La的项数:\n");
    scanf("%d",&m);
	printf("\n输入多项式La:\n"); 
    CreatePoly(La,m); 
	printf("输入多项式Lb的项数:\n");
    scanf("%d",&n);
	printf("\n输入多项式Lb:\n"); 
	CreatePoly(Lb,n);
	menu();	
	p:
	printf("\n请输入你的选项: ");	
	scanf("%d",&choose);
	switch(choose)
	{
		case 1:printf("\n相加后的多项式为:\n");AddPoly(La,Lb);print(La); goto p;
		case 2:printf("\n相减后的多项式为:\n");SubtractPoly(La,Lb);print(La);goto p;
		case 3:printf("\n相乘后的多项式为:\n");Lc=MultiplyPoly(La,Lb);print(Lc);goto p;
		case 4:print(La);goto p;
		case 5:printf("请输入要带入的x的值");scanf("%d",&x);Substitution(La,x); goto p;
	}

    return 0;
   } 

请看运行结果
c语言实现多项式的基本运算_第1张图片

你可能感兴趣的:(链表,指针,数据结构,c语言)