⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dx.cpp

📁 课程实验关于多项式相加和相减
💻 CPP
字号:
#include <iostream.h>
#include <math.h>

typedef struct node         // 定义单链表结点的数据类型mulpoly
  { 
	double coef;   // 表示系数
    int exp;      // 表示指数
    struct node * next;    // 指向下一项结点的指针
  }mulpoly;

mulpoly * create()    // 逐项输入系数和指数,建立单链表的函数
{
	mulpoly * h, * p, * q;
	h=new mulpoly;    // 建立头结点
	p=h;      // 头结点作为初始的前驱
    double x;
    cout<<"输入第1项的系数,输入系数是零截止: "; 
	cin>>x;    // 输入第1项的系数
    while(x)    // 循环建立各项结点,直到输入系数是零为止
	{
		q=new mulpoly;
		cout<<" 输入一个指数 "; 
		cin>>q->exp;  // 输入指数
		q->coef=x;    // 保存系数
		p->next=q;    // 前驱的next指向新建结点
		p=q;    // 下一个结点的前驱即当前结点
		cout<<"继续输入系数 ";
		cin>>x;    // 继续输入系数
	}
	p->next=NULL;    // 最后一项结点无后继
	return h;   // 返回头指针
}

 
void output(mulpoly * h)   // 遍历单链表,输出一元多项式的函数
{ 
	mulpoly * p;
	cout<<"Y=";
	p=h->next;
	if(p!=NULL)     // 输出多项式的第1项
	{
		cout<<p->coef;   
		if(p->exp!=0) 
			cout<<"X";  
		if(p->exp>1) 
			cout<<"^"<<p->exp; 
		p=p->next;
	}
  while(p!=NULL)    // 逐项输出后续各项 
  { 
	  if(p->coef>0) 
		  cout<<"+";  
	  cout<<p->coef<<"X";  
	  if(p->exp>1) 
		  cout<<"^"<<p->exp;  
	  p=p->next;
  }
   cout<<endl;
}


mulpoly *  add(mulpoly * a,mulpoly * b)   // 两个多项式求和的函数
{ 
	mulpoly * c, * pa, * pb, * pc, * q;  
	c=new mulpoly;     // 建立结果多项式单链表的头结点  
	pc=c;
	pa=a->next; 
	pb=b->next;
	while((pa!=NULL)&&(pb!=NULL))
  { 
		if(pa->exp<pb->exp)       // 被加项的指数较小   
		{
			q=new mulpoly;  
			q->coef=pa->coef; 
			q->exp=pa->exp; 
			pa=pa->next;  
			pc->next=q;
			pc=q;  
		}
		else if(pa->exp>pb->exp)  // 被加项的指数较大
		{
			q=new mulpoly;    
			q->coef=pb->coef; 
			q->exp=pb->exp; 
			pb=pb->next;
   			pc->next=q; 
			pc=q;
		}
		else if(fabs(pa->coef+pb->coef)>1e-8)  // 指数相同,系数之和非零
		{
			q=new mulpoly;  
			q->coef=pa->coef+pb->coef;
			q->exp=pa->exp;    
			pa=pa->next;
			pb=pb->next;    
			pc->next=q;
			pc=q;  
		}
  
		else                     // 系数之和为零
    	{ 
			pa=pa->next;
			pb=pb->next;
		}
  
	}
  
	while(pa!=NULL)      // 链接多项式a的剩余项 
	{
		q=new mulpoly;  
		q->coef=pa->coef; 
		q->exp=pa->exp; 
		pa=pa->next;
		pc->next=q;
		pc=q;
	}
  
	while(pb!=NULL)      // 链接多项式b的剩余项
	{
		q=new mulpoly;
		q->coef=pb->coef; 
		q->exp=pb->exp; 
		pb=pb->next;
		pc->next=q;
		pc=q;
	}
	pc->next=NULL;
	return c;     // 返回头结点
}


mulpoly *  subtract(mulpoly * a,mulpoly * b)   // 两个多项式求差的函数
{ 
	mulpoly * c, * pa, * pb, * pc, * q;  
	c=new mulpoly;     // 建立结果多项式单链表的头结点  
	pc=c;
	pa=a->next; 
	pb=b->next;
	while((pa!=NULL)&&(pb!=NULL))
  { 
		if(pa->exp<pb->exp)       // 被减项的指数较小   
		{
			q=new mulpoly;  
			q->coef=pa->coef; 
			q->exp=pa->exp; 
			pa=pa->next;  
			pc->next=q;
			pc=q;  
		}
		else if(pa->exp>pb->exp)  // 被减项的指数较大
		{
			q=new mulpoly;    
			q->coef=pb->coef; 
			q->exp=pb->exp; 
			pb=pb->next;
   			pc->next=q; 
			pc=q;
		}
		else if(fabs(pa->coef-pb->coef)>1e-8)  // 指数相同,系数之差非零
		{
			q=new mulpoly;  
			q->coef=pa->coef-pb->coef;
			q->exp=pa->exp;    
			pa=pa->next;
			pb=pb->next;    
			pc->next=q;
			pc=q;  
		}
  
		else                     // 系数之差为零
    	{ 
			pa=pa->next;
			pb=pb->next;
		}
  
	}
  
	while(pa!=NULL)      // 链接多项式a的剩余项 
	{
		q=new mulpoly;  
		q->coef=pa->coef; 
		q->exp=pa->exp; 
		pa=pa->next;
		pc->next=q;
		pc=q;
	}
  
	while(pb!=NULL)      // 链接多项式b的剩余项
	{
		q=new mulpoly;
		q->coef=-pb->coef; 
		q->exp=pb->exp; 
		pb=pb->next;
		pc->next=q;
		pc=q;
	}
	pc->next=NULL;
	return c;     // 返回头结点
}




mulpoly * multiply(mulpoly * a,mulpoly * b)   // 两个多项式乘积的函数
{ 
	mulpoly * c, * pa, * pb, * pc, * q, * p;
	int j, maxe;
	double m_coef; 
	c=new mulpoly;     // 建立结果多项式单链表的头结点
	pc=c;  
	pa=a->next;
	while(pa!=NULL)    // 双层循环使之各项相乘
	{
		pb=b->next;  
		while(pb!=NULL)
    {
			q=new mulpoly;    // 为每次乘积用一个结点存储    
			q->coef=(pa->coef)*(pb->coef);      
			q->exp=pa->exp+pb->exp;    
			maxe=q->exp;      // 最高指数    
			pc->next=q;
			pc=q;    
			pb=pb->next;  
		}
   		pa=pa->next; 
	} 
	pc->next=NULL; 
	pa=c;
	pc=c->next;     // 暂存乘积的第一项地址 
	for(j=0; j<=maxe; j++)  // 合并指数相同的各项
	{ 
		p=pc; 
		m_coef=0.0;  
		while(p!=NULL)  
		{ 
			if(p->exp==j) m_coef+=p->coef;
		p=p->next;
		}   
		if(fabs(m_coef)>1e-8)  // 系数之和非零,建立新的结点存储结果项  
		{ 
			q=new mulpoly; 
			q->coef=m_coef; 
			q->exp=j;  
			pa->next=q; 
			pa=q;
		}
	}
	pa->next=NULL; 
	while(pc!=NULL)   // 释放第一次乘积运算的各项结点 
	{ 
		p=pc;   
		pc=pc->next;   
		delete p; 
	}
	return c;    // 返回头结点
}



void main()    // 主函数
{ 
	mulpoly * ha, * hb, * hc, * hd, * he;
	char a;
	ha=create();
	hb=create(); 
	hc=add(ha,hb);
	cout<<"第一个多项式为: "; 		
	output(ha);
	cout<<"第二个为: "; 	
	output(hb); 
	cout<<"输入任意键得出结果: "; 
    cin>>a;
	cout<<"多项式之和: "; 
	output(hc);
	cout<<endl;
	hd=subtract(ha,hb);
	cout<<"多项式之差: "; 
	output(hd);
	cout<<endl;
	he=multiply(ha,hb); 
	cout<<"多项式的乘积是: "; 
	output(he); 
	cout<<endl; 
	return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -