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

📄 一元稀疏多项式计算器.cpp

📁 一元稀疏多项式计算器,功能完善
💻 CPP
字号:

#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
#include "string.h"
#include "iostream.h"
#include "math.h"
#include "stdlib.h"

#define TRUE    1
#define FALSE   0
typedef int status;

typedef struct NodeType 
{
    float coef;  //系数
    int   expn;  //指数
    struct NodeType *next;
} NodeType, *LinkType;

typedef LinkType polynomail; //用带头结点的有序链表表示多项式


void InitPolyn( polynomail &P)
//构造一个多项式
{  
   P=(NodeType *)malloc(sizeof(NodeType));
   P->coef=0;P->expn=0;P->next=NULL;
   //初始化带头结点的单链表
}

void ClearPolyn( polynomail &P)
//将单链表清空,并释放原链表的结点空间
{ LinkType q;
  q=P->next;
  while(q!=NULL) //释放原链表的结点空间
  {P->next=q->next;free(q);q=P->next;}
}

void DestroyPolyn( polynomail &P) 
//销毁一元多项式P
{LinkType q=P;
 while(q!=NULL)
 {q=P->next;free(P);}//释放所有结点空间
}

void DelZeroNode(polynomail &Pn)
 //释放无用结点,即系数为0项
{ LinkType p,q;
  p=Pn->next; q=Pn;
  while(p!=NULL)
  {  if(p->coef==0)
	  {q->next=p->next;
	   free(p);
	   p=q->next;
	  }
     else 
	 {q=p;p=p->next;}
  }
}

void MergePolynCoef(polynomail &Pn)
//在序链表中,合并同类项
{ LinkType p,p1,p2;
  p=Pn->next; 
  while(p!=NULL)
  {p1=p;p2=p->next;
    while(p2!=NULL) //合并指数相同项
	{ if(p->expn==p2->expn)
		{p->coef+=p2->coef;
		 p1->next=p2->next;
		 free(p2);
		 p2=p1->next;
		}
	   else {p1=p2;p2=p1->next;}
	 }
	p=p->next;
  }
 DelZeroNode(Pn);//删除合并后系数为0的结点
}

void SortPolyn(polynomail &Pn)
//根据链表的expn指数域,对链表进行升序排序
{ 
  MergePolynCoef(Pn);//先合并同类项
  LinkType p,q,r;
  q=Pn->next;Pn->next=NULL;
  while(q!=NULL) //插入法排序
  {  p=Pn; 
	 while(p->next!=NULL&&p->next->expn<q->expn)
	 p=p->next;
	 r=q->next; 
	 q->next=p->next;
	 p->next=q;
	 q=r;   
  } 
}

void CreatPolyn( polynomail &P,int m)
//输入m项的系数和指数,建立表示一元多项式的有序链表P
{  float fcoef;
   int   fexpn;
   NodeType *s,*q;
   q=P;
 
 for(int i=1;i<=m;i++)
   { 
     cout<<"请输入第"<<i<<"项式系数 指数:";
	 cin>>fcoef>>fexpn;
	 s=(NodeType *)malloc(sizeof(NodeType));
	 s->coef=fcoef;s->expn=fexpn;s->next=NULL;
	 q->next=s;q=s;q->next=NULL;
   }
 MergePolynCoef(P); //合并指数相同项
 DelZeroNode(P);    //删除系数为0的结点
 SortPolyn(P);      //按指数域,对链表进行升序排序
}

void PrintPolyn(polynomail P) 
//打印输出一元多项式P
{ LinkType q;
  q=P->next;
  if(P->next==NULL) cout<<"0";
  else{
   while(q!=NULL)
   {
	 if(q->coef>1||q->coef<-1)
	 cout<<q->coef;
     if(q->expn==0&&(q->coef==1||q->coef==-1))cout<<q->coef;
     else if(q->coef==-1&&q->expn!=0) cout<<"-";
	 if(q->expn<0) cout<<"x^"<<"("<<q->expn<<")";
     else if(q->expn==1) cout<<"x"; 
     else if(q->expn>0) cout<<"x^"<<q->expn;
     if(q->next!=NULL&&q->next->coef>0)cout<<"+";
        q=q->next;
   }
  }//else
}

int PolynLength( polynomail P) 
//返回一元多项式P中的项数
{ int i=0;
  LinkType q;
  q=P->next;
 while(q!=NULL) {q=q->next;i++;}
 return i;
}

void Difference(polynomail &pa)
// 稀疏多项式pa 以链表作存储结构,    
// 将此链表修改成它的导函数,并释放无用结点 
{
   LinkType p,q;
   p=pa->next;
   q=pa;
   while(p!=NULL)
   {  
     if(p->expn==0) {q->next=p->next;free(p);p=q->next;}
      //常数项,导数为零,释放结点
     else 
      {
      p->coef=p->coef*p->expn; //系数=原系数* 指数
      (p->expn )--; //指数减1
	  q=q->next;
      p=p->next;
      }
   }  
}

void AddPolyn(polynomail Pa,polynomail Pb,polynomail &Pc)
//完成多项式相加运算,即:Pc=Pa+Pb
{  float x;
   LinkType p,q,r;
   NodeType *s;
   p=Pa->next;
   q=Pb->next;
   r=Pc;
 while(p!=NULL&&q!=NULL)
  { if(p->expn==q->expn)//指数相同
	 { x=p->coef+q->coef ;
	    if(x!=0)  //指数相同,若系数相加不等于0,插入表中
		{s=(NodeType *)malloc(sizeof(NodeType));
		 s->coef=x;s->expn=q->expn;s->next=NULL;
         r->next=s;r=r->next;
		}
	  p=p->next;q=q->next;
	 }
	else if(q->expn<p->expn) //指数小的插入表中
	 {   s=(NodeType *)malloc(sizeof(NodeType));
		 s->coef=q->coef;s->expn=q->expn;s->next=NULL;
         r->next=s;r=r->next;
	  q=q->next;
	 }
    else  
	 {   s=(NodeType *)malloc(sizeof(NodeType));
		 s->coef=p->coef;s->expn=p->expn;s->next=NULL;
         r->next=s;r=r->next;
	   p=p->next;
	 }
  }
//加入余下的多项式 
  while(p!=NULL)
  { s=(NodeType *)malloc(sizeof(NodeType));
	s->coef=p->coef;s->expn=p->expn;s->next=NULL;
    r->next=s;r=r->next;
  p=p->next;
  }
  while(q!=NULL)
  { s=(NodeType *)malloc(sizeof(NodeType));
    s->coef=q->coef;s->expn=q->expn;s->next=NULL;
    r->next=s;r=r->next;
	q=q->next;
	}
}

void SubtractPolyn( polynomail Pa,polynomail Pb,polynomail &Pc)
     //完成多项式相减运算,即:Pc=Pa-Pb
{ float x;
   LinkType p,q,r;
   NodeType *s;
   p=Pa->next;
   q=Pb->next;
   r=Pc;
 while(p!=NULL&&q!=NULL)
  {  if(p->expn==q->expn)//指数相同
	 { x=p->coef-q->coef;
	    if(x!=0) //指数相同,若系数相减不等于0,插入表中
		{s=(NodeType *)malloc(sizeof(NodeType));
		 s->coef=x;s->expn=q->expn;s->next=NULL;
         r->next=s;r=r->next;
		}
	  p=p->next;q=q->next;
	 }
	 else if(q->expn<p->expn) //指数小的插入表中
	 {   s=(NodeType *)malloc(sizeof(NodeType));
		 s->coef=-q->coef; //减数的系数变为相反数
		 s->expn=q->expn;s->next=NULL;
         r->next=s;r=r->next;
	  q=q->next;
	 }
     else  
	 {   s=(NodeType *)malloc(sizeof(NodeType));
		 s->coef=p->coef;s->expn=p->expn;s->next=NULL;
         r->next=s;r=r->next;
	  p=p->next;
	 }
  }
//加入余下的多项式,减数的系数变为相反数
  while(p!=NULL)
  { s=(NodeType *)malloc(sizeof(NodeType));
	s->coef=p->coef;s->expn=p->expn;s->next=NULL; 
    r->next=s;r=r->next;
  p=p->next;
  }
  while(q!=NULL)
  { s=(NodeType *)malloc(sizeof(NodeType));
    s->coef=-q->coef;s->expn=q->expn;s->next=NULL;
    r->next=s;r=r->next;
	q=q->next;
	}
}

void MultiplyPolyn( polynomail Pa,polynomail Pb,polynomail &Pc)
 //完成多项式相乘运算,即:Pc=Pa×Pb
{  LinkType p,q,r;
   NodeType *s;
   p=Pa->next; 
   r=Pc;
   while(p!=NULL)
   {q=Pb->next;
     while(q!=NULL)
	 { s=(NodeType *)malloc(sizeof(NodeType));
	   s->coef=p->coef*q->coef;
	   s->expn=p->expn+q->expn;
	   s->next=NULL;

       r->next=s;r=r->next;
	   q=q->next;
	 }
	 p=p->next;
   }
 MergePolynCoef(Pc);//合并指数相同项
 DelZeroNode(Pc);   //删除系数为0的结点
 SortPolyn(Pc);     //按指数域,对链表进行升序排序

}


void main()//主程序
{ 
  LinkType pa,pb,pc;
  InitPolyn(pa);
  InitPolyn(pb);
  InitPolyn(pc);
  int num1,num2;

open: while(1)
{system("cls");
	cout<<endl;
	cout<<"                        一元稀疏多项式计算器                               "<<endl;
    cout<<" **************************************************************************"<<endl;
    cout<<"        班级:0312             姓名:张明琪           学号:031207          "<<endl;
	cout<<" --------------------------------------------------------------------------"<<endl;
	cout<<"        加法--1      减法--2     乘法--3     求导--4     退出--0           "<<endl;
	cout<<" **************************************************************************"<<endl;
   

  char choice;
  cout<<endl<<" 请选择操作(0-4):";
  cin>>choice;
  cout<<endl;
  switch(choice)
  {  
     case '1': cout<<"多项式加法C=A+B"<<endl;
		       cout<<"输入多项式A的项数:";
			   cin>>num1;
               CreatPolyn(pa,num1);
			   cout<<"多项式A为:";
			   PrintPolyn(pa);
			   cout<<endl<<endl;

			   cout<<"输入多项式B的项数:";
               cin>>num2; 
               CreatPolyn(pb,num2);
			   cout<<"多项式B为:";
			   PrintPolyn(pb);
			   cout<<endl<<endl;
             
			   AddPolyn(pa,pb,pc);
               cout<<"多项式C=A+B: (";
			   PrintPolyn(pa);
			   cout<<")+(";
			   PrintPolyn(pb);
			   cout<<")=";
			   PrintPolyn(pc);

			   ClearPolyn(pa);
			   ClearPolyn(pb);
			   ClearPolyn(pc);
		       cout<<"\n按任意键返回初始界面!"<<endl;
               getche();system("cls");goto open;

	 case '2': cout<<"多项式减法C=A-B"<<endl;
		       cout<<"输入多项式A的项数:";
               cin>>num1;
               CreatPolyn(pa,num1);
			   cout<<"多项式A为:";
			   PrintPolyn(pa);
			   cout<<endl<<endl;

			   cout<<"输入多项式B的项数:";
               cin>>num2;
               CreatPolyn(pb,num2);
			   cout<<"多项式B为:";
			   PrintPolyn(pb);
			   cout<<endl<<endl;
             
			   SubtractPolyn(pa,pb,pc);
               cout<<"多项式C=A-B: (";
			   PrintPolyn(pa);
			   cout<<")-(";
			   PrintPolyn(pb);
			   cout<<")=";
			   PrintPolyn(pc);

			   ClearPolyn(pa);
			   ClearPolyn(pb);
			   ClearPolyn(pc);
		       cout<<"\n按任意键返回初始界面!"<<endl;
               getche();system("cls");goto open;
		 
		
	 case '3': cout<<"多项式乘法C=A×B"<<endl;
		       cout<<"输入多项式A的项数:";
               cin>>num1;
               CreatPolyn(pa,num1);
			   cout<<"多项式A为:";
			   PrintPolyn(pa);
			   cout<<endl<<endl;

			   cout<<"输入多项式B的项数:";
               cin>>num2;
               CreatPolyn(pb,num2);
			   cout<<"多项式B为:";
			   PrintPolyn(pb);
			   cout<<endl<<endl;
             
			   MultiplyPolyn(pa,pb,pc);
               cout<<"多项式C=A×B: (";
			   PrintPolyn(pa);
			   cout<<")×(";
			   PrintPolyn(pb);
			   cout<<")=";
			   PrintPolyn(pc);

			   ClearPolyn(pa);
			   ClearPolyn(pb);
			   ClearPolyn(pc);
		       cout<<"\n按任意键返回初始界面!"<<endl;
               getche();system("cls");goto open;
		 		    
	 case '4': cout<<"求多项式的导数"<<endl;
               cout<<"输入多项式的项数:";
               cin>>num1;
               CreatPolyn(pa,num1);
               cout<<"多项式为:";
			   PrintPolyn(pa);
			   cout<<endl<<endl;

			   cout<<"多项式的导数: (";
			   PrintPolyn(pa);
			   cout<<")’= ";
			   Difference(pa);
			   PrintPolyn(pa);
             			 
			   ClearPolyn(pa);
			   cout<<"\n按任意键返回初始界面!"<<endl;
               getche();system("cls");goto open;
		 
	 case '0': cout<<"谢谢使用!再见!"<<endl<<endl;
			   return ;

     default:  cout<<"错误命令!"<<endl;
		       cout<<"按任意键返回初始界面"<<endl;
               getche();system("cls");goto open;

  }//switch
 }//whlie(1)

}

⌨️ 快捷键说明

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