多项式的加减乘

举报
悦来客栈的老板 发表于 2020/12/30 01:56:47 2020/12/30
【摘要】 这是我学数据结构写的第一个比较"大型"的程序,唉,还是有不足之处啊。。。 # include <stdio.h># include <iostream.h># include <stdlib.h># include <malloc.h> # define OK 1# define ERROR 0# define OVERFLO...

这是我学数据结构写的第一个比较"大型"的程序,唉,还是有不足之处啊。。。


      # include <stdio.h>
      # include <iostream.h>
      # include <stdlib.h>
      # include <malloc.h>
      # define OK 1
      # define ERROR 0
      # define OVERFLOW -1
      typedef struct Polynomial
      {
     	float coef;
     	int expn;
     	struct Polynomial *next;
      }Polynomial,*LinkPolyn;
      void Create_Polyn(LinkPolyn &L)
      {
     	int i,n;
      	LinkPolyn p,s;
      	L = (LinkPolyn) malloc (sizeof (Polynomial));
     	if (!L)
     		exit(OVERFLOW);
      	L->next = NULL;
      	p = L;
     	cout<<" 请输入您要创建多项式的项数:";
     	cin>>n;
     	for (i=0; i<n; i++)
      	{
      		s = (LinkPolyn) malloc (sizeof (Polynomial));
      		p->next = s;
     		cout<<" 请输入第"<<i+1<<"项的系数:";
     		cin>>s->coef;
     		cout<<" 请输入第"<<i+1<<"项的指数:";
     		cin>>s->expn;
      		p = s;
      	}
      	p->next = NULL;
      }
      void Display(LinkPolyn L)
      {
      	LinkPolyn p;
     	if (!L->next )
     		cout<<" 多项式的项数为0!无法显示"<<endl;
      	p = L->next ;
     	while (p)
      	{
     		if (p->coef == 0.0)
     			cout<<"";
     		else if (p->expn == 0 )
     			cout<<p->coef ;
     		else if (p->coef == 1 && p->expn == 1)
     			cout<<"X";
     		else if (p->coef == 1 && p->expn != 1)
     			cout<<"X^"<<p->expn;
     		else if (p->coef == -1 && p->expn == 1)
     			cout<<"-X";
     		else if (p->coef != 1 && p->expn == 1)
     			cout<<p->coef<<"X";
     		else if (p->coef == -1 && p->expn != 1)
     			cout<<"-X^"<<p->expn ;
     		else
     			cout<<p->coef <<"X^"<<p->expn ;
     		if (p->next!=NULL && p->coef !=0 && p->next->coef >=0)
     			cout<<"+";
      		p = p->next ;
      	}
     	cout<<endl;
      }
      void SortPolyn(LinkPolyn &L)
      {
      	LinkPolyn p,q;
     	int temp;
     	float tmp;
     	if (!L->next )
     		cout<<" 多项式的项数为0,无法排序!"<<endl;
     	for(p=L->next;p; p=p->next )
     		for(q=L->next ;q; q=q->next)
      		{
     			if(p->expn < q->expn )
      			{
       temp = p->expn ;
       p->expn = q->expn ;
       q->expn = temp;
       tmp = p->coef ;
       p->coef = q->coef ;
       q->coef = tmp;
      			}
     			else if (p != q && p->expn == q->expn)
      			{
       p->coef +=q->coef ;
       q->coef = 0;
       q->expn = 0;
      			}
      		}
      }
      void Diff_Polyn(LinkPolyn &L)
      {
      	LinkPolyn p;
     	if (!L->next )
     		cout<<" 多项式的项数为0,无法求导!"<<endl;
      	p = L->next ;
     	while (p)
      	{
      		p->coef *= p->expn ;
      		p->expn -=1;
      		p = p->next ;
      	}
      }
      void Int_Polyn(LinkPolyn &L)
      {
      	LinkPolyn p;
     	if (!L->next )
     		cout<<" 多项式的项数为0,无法求积分!"<<endl;
      	p = L->next ;
     	while (p)
      	{
      		p->coef = p->coef/(p->expn+1);
      		p->expn +=1;
      		p = p->next ;
      	}
      }
      int cmp (int a, int b)
      {
     	if (a>b)
     		return 1;
     	else if (a == b)
     		return 0;
     	return -1;
      }
      int Add_Polyn(LinkPolyn &PA, LinkPolyn &PB)
      {
      	LinkPolyn qc,qa,qb,temp;
      float sum;
      	qc = PA;
      	qa = PA->next ;
      	qb = PB->next ;
     	while (qa && qb)
      	{
     		switch(cmp(qa->expn ,qb->expn ))
      		{
     		case -1:
      			qc->next = qa;
      			qc = qa;
      			qa = qa->next;
     			break;
     		case 0:
      			sum = qa->coef + qb->coef ;
     			if(sum !=0.0)
      			{
       qa->coef = sum;
       qc->next = qa;
       qc = qa;
       qa = qa->next;
      			}
     			else
      			{
       temp = qa;
       qa = qa->next ;
      free(temp);
      			}
      			temp = qb;
      			qb = qb->next ;
     			free(temp);
     			break;
     		case 1:
      			qc->next = qb;
      			qc = qb;
      			qb = qb->next;
     			break;
      		}
      	}
     	while(qa)
      	{
      			qc->next = qa;
      			qc = qa;
      			qa = qa->next;
      	}
     	while(qb)
      	{
      			qc->next = qb;
      			qc = qb;
      			qb = qb->next;
      	}
     	free(qb);
     	return OK;
      }
      int Sub_Polyn(LinkPolyn &PA, LinkPolyn &PB)
      {
      	LinkPolyn qc,qa,qb,temp;
      float sum;
      	qc = PA;
      	qa = PA->next ;
      	qb = PB->next ;
     	while (qa && qb)
      	{
     		switch(cmp(qa->expn ,qb->expn ))
      		{
     		case -1:
      			qc->next = qa;
      			qc = qa;
      			qa = qa->next;
     			break;
     		case 0:
      			sum = qa->coef - qb->coef ;
     			if(sum !=0.0)
      			{
       qa->coef = sum;
       qc->next = qa;
       qc = qa;
       qa = qa->next;
      			}
     			else
      			{
       temp = qa;
       qa = qa->next ;
      free(temp);
      			}
      			temp = qb;
      			qb = qb->next ;
     			free(temp);
     			break;
     		case 1:
      			qb->coef =-qb->coef ;
      			qc->next = qb;
      			qc = qb;
      			qb = qb->next;
     			break;
      		}
      	}
     	while(qa)
      	{
      		qc->next = qa;
      		qc = qa;
      		qa = qa->next;
      	}
     	while(qb)
      	{
      		qb->coef =-qb->coef ;
      		qc->next = qb;
      		qc = qb;
      		qb = qb->next;
      	}
     	free(qb);
     	return OK;
      }
      int Mul_Polyn(LinkPolyn pa,LinkPolyn pb,LinkPolyn &pc)
      {
      	LinkPolyn qa,qb,qc,s;
      	pc = (LinkPolyn) malloc (sizeof (Polynomial));
      	pc->next = NULL;
      	qc = pc;
     	for(qa=pa->next;qa;qa=qa->next)
      	{
     		for(qb=pb->next;qb;qb=qb->next)
      		{
      			s = (LinkPolyn) malloc (sizeof (Polynomial));
      			qc->next = s;
      			s->coef=qa->coef*qb->coef;
      			s->expn=qa->expn+qb->expn;
      			qc = s;
      		}
      	}
      	qc->next = NULL;
      	SortPolyn(pc);
     	return OK;
      }
      int main (void)
      {
     	char i;
      	LinkPolyn L;
      	LinkPolyn PA,PB,PC;
     	cout<<endl;
     	cout<<" ********************************************************"<<endl;
     	cout<<" | 欢迎使用本系统! |"<<endl;
     	cout<<" | 制作人:风尘三侠 |"<<endl;
     	cout<<" | 1:创建一个多项式 2:对一个多项式求导 |"<<endl;
     	cout<<" | 3:对一个多项式求积分 4:两个多项式相加 |"<<endl;
     	cout<<" | 5:两个多项式相减 6:两个多项式相乘 |"<<endl;
     	cout<<" | 7:帮助 8:退出 |"<<endl;
     	cout<<" ********************************************************"<<endl;
     	cout<<endl;
     	do
      	{
     		cout<<" 请选择您要执行的操作:";
     		cin>>i;
     		switch (i)
      		{
     		case '1':
      			Create_Polyn(L);
      			SortPolyn(L);
     			cout<<" 您创建的多项式是: F(X) = ";
      			Display(L);
     			break;
     		case '2':
     			cout<<" 对一个多项式求导前请先创建一个多项式!"<<endl;
      			Create_Polyn(L);
      			SortPolyn(L);
     			cout<<" 您创建的多项式是: F(X) = ";
      			Display(L);
      			Diff_Polyn(L);
     			cout<<" 求导后的多项式是: F'(X) = ";
      			Display(L);
     			break;
     		case '3':
     			cout<<" 对一个多项式求积分前请先创建一个多项式!"<<endl;
      			Create_Polyn(L);
      			SortPolyn(L);
     			cout<<" 您创建的多项式是: F(X) = ";
      			Display(L);
      			Int_Polyn(L);
     			cout<<" 积分后的多项式是: F'(X) = ";
      			Display(L);
     			break;
     		case '4':
     			cout<<" 请先创建两个多项式!"<<endl;
     			cout<<" 创建第一个多项式!"<<endl;
      			Create_Polyn(PA);
      			SortPolyn(PA);
     			cout<<" 您创建的第一个多项式是: F(X) = ";
      			Display(PA);
     			cout<<" 创建第二个多项式!"<<endl;
      			Create_Polyn(PB);
      			SortPolyn(PB);
     			cout<<" 您创建的第二个多项式是: G(X) = ";
      			Display(PB);
     			cout<<" 两个多项式相加后:F(X) + G(X) = ";
      			Add_Polyn(PA, PB);
      			Display(PA);
     			break;
     		case '5':
     			cout<<" 请先创建两个多项式!"<<endl;
     			cout<<" 创建第一个多项式!"<<endl;
      			Create_Polyn(PA);
      			SortPolyn(PA);
     			cout<<" 您创建的第一个多项式是: F(X) = ";
      			Display(PA);
     			cout<<" 创建第二个多项式!"<<endl;
      			Create_Polyn(PB);
      			SortPolyn(PB);
     			cout<<" 您创建的第二个多项式是: G(X) = ";
      			Display(PB);
     			cout<<" 两个多项式相减后:F(X) - G(X) = ";
      			Sub_Polyn(PA, PB);
      			Display(PA);
     			break;
     		case '6':
     			cout<<" 请先创建两个多项式!"<<endl;
     			cout<<" 创建第一个多项式!"<<endl;
      			Create_Polyn(PA);
      			SortPolyn(PA);
     			cout<<" 您创建的第一个多项式是: F(X) = ";
      			Display(PA);
     			cout<<" 创建第二个多项式!"<<endl;
      			Create_Polyn(PB);
      			SortPolyn(PB);
     			cout<<" 您创建的第二个多项式是: G(X) = ";
      			Display(PB);
     			cout<<" 两个多项式相乘后:F(X) * G(X) = ";
      			Mul_Polyn(PA, PB,PC);
      			Display(PC);
     			break;
     		case '7':
     			cout<<" 创建多项式! "<<endl;
     			cout<<" 先输入多项式的项数,要输入自然数!"<<endl;
     			cout<<" 可以输入重复的项,先输入系数,再输入指数!"<<endl;
     			cout<<" 系数可以是任意的数字,指数要输入自然数!"<<endl;
     			break;
     		case '8':
     			cout<<" 谢谢使用,再见!"<<endl;
     			exit(OVERFLOW);
     			break;
     		default:
      			{
     			cout<<" 您的输入有误,请重新输入!"<<endl;
     			break;
      			}
      		}
      	}while (i != 8);
     	return 0;
      }
  
 


 

文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq523176585/article/details/6818975

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。