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

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

📁 提供多项式的算法
💻 CPP
字号:
#include <stdio.h> 
#include <stdlib.h> 


#define OK 1; 
#define READ(I) while (((I)=getchar())=='\n'); //读入合法字符 
typedef int status; 
typedef struct PolyNode 
{ 
float coef; 
int expn; 
struct PolyNode *next; 
}Poly,*P_Poly; 


 
status CreatPoly(P_Poly *P_PolyHead,int n)   //创建多项式链表
{ //为确保其他子函数正常运行,入口参数要求不含同类项、指数递减 
 int i=0; 
 P_Poly p,tail; 
 *P_PolyHead=(Poly*)malloc(sizeof(Poly)); 
 (*P_PolyHead)->expn=n; 
 tail=*P_PolyHead; 
 printf ("请按照指数递减顺序输入最简形式的多项式\n"); 
  for (;i<n;i++) 
  { 
    p=(Poly*)malloc(sizeof(Poly)); 
    printf ("请输入第%d项的系数和指数(系数,指数):",i+1); 
    scanf ("%f,%d",&(p->coef),&(p->expn)); 
    tail->next=p; 
    tail=p; 
  } 
 tail->next=NULL; 
 return OK; 
} 


void OutPutPoly(P_Poly PolyHead)   //输出多项式
{ 
 int i=0; 
 P_Poly p;  
 p=PolyHead->next; 
  for (;i<PolyHead->expn;i++) 
  { 
	if(PolyHead->next!=p) 
	{printf("+");}
    printf("%f*X^%d",p->coef,p->expn);
	p=p->next;
  } 
 printf ("\n"); 
} 


void AddPoly(P_Poly* P_PolyHead,P_Poly PolyHead1,P_Poly PolyHead2) //求和 
{ 
 int i=0; 
 P_Poly p1,p2,p,tail; 
 p1=PolyHead1->next; 
 p2=PolyHead2->next; 
 *P_PolyHead=(P_Poly)malloc(sizeof(Poly)); 
 p=tail=*P_PolyHead; 
  while(p1&&p2) 
  { 
    int e1,e2; 
    e1=p1->expn; 
    e2=p2->expn; 
    if (e1>e2) 
	{ 
      p=(P_Poly)malloc(sizeof(Poly)); 
      tail->next=p; 
      tail=p; 
      *p=*p1; 
      p1=p1->next; 
      i++; 
	} 
    else if(e1==e2&&e1!=0&&e2!=0) 
	{ 
      float sum=p1->coef+p2->coef; 
      if (sum!=0.0) 
	  { 
        p=(P_Poly)malloc(sizeof(Poly)); 
        tail->next=p; 
        tail=p; 
        p->coef=sum; 
        p->expn=e1; 
        i++; 
	  } 
	  else if(sum=0.0)
	  {
        p=(P_Poly)malloc(sizeof(Poly)); 
        tail->next=p; 
        tail=p; 
        p->coef=sum; 
        p->expn=e1; 
        i++;
	  }
      p1=p1->next; 
      p2=p2->next; 
	}
    else if (e1<e2) 
	{ 
      p=(P_Poly)malloc(sizeof(Poly)); 
      tail->next=p; 
      tail=p; 
      *p=*p2; 
      p2=p2->next; 
      i++; 
	} 
  } 
  while (p1) 
  { 
    p=(Poly*)malloc(sizeof(Poly)); 
    *p=*p1; 
    tail->next=p; 
    tail=p; 
    p1=p1->next; 
    i++; 
  } 
  while (p2) 
  { 
	p=(Poly*)malloc(sizeof(Poly)); 
    *p=*p2;
    tail->next=p; 
    tail=p; 
    p2=p2->next; 
    i++; 
  } 
 (*P_PolyHead)->expn=i; 
 tail->next=NULL; 
} 

 
void DecPoly(P_Poly* P_PolyHead,P_Poly PolyHead1,P_Poly PolyHead2) //求差
{ 
 int i=0; 
 P_Poly p1,p2,p,tail; 
 p1=PolyHead1->next; 
 p2=PolyHead2->next; 
 *P_PolyHead=(P_Poly)malloc(sizeof(Poly)); 
 p=tail=*P_PolyHead; 
  while(p1&&p2) 
  { 
    int e1,e2; 
    e1=p1->expn; 
    e2=p2->expn; 
    if (e1>e2) 
	{ 
      p=(P_Poly)malloc(sizeof(Poly)); 
      tail->next=p; 
      tail=p; 
      *p=*p1; 
      p1=p1->next; 
      i++; 
	} 
    else if(e1==e2) 
	{ 
      float dif=p1->coef-p2->coef; 
      if (dif!=0.0) 
	  { 
        p=(P_Poly)malloc(sizeof(Poly)); 
        tail->next=p; 
        tail=p; 
        p->coef=dif; 
        p->expn=e1; 
        i++; 
	  } 
      p1=p1->next; 
      p2=p2->next; 
	}  
    else if (e1<e2) 
	{ 
      p=(P_Poly)malloc(sizeof(Poly)); 
      tail->next=p; 
      tail=p; 
      p->coef=-p2->coef; 
      p->expn=p2->expn; 
      p2=p2->next; 
      i++; 
	} 
  } 
  while (p1) 
  { 
    p=(Poly*)malloc(sizeof(Poly)); 
    *p=*p1; 
    tail->next=p; 
    tail=p; 
    p1=p1->next; 
    i++; 
  } 
  while (p2) 
  { 
    p=(Poly*)malloc(sizeof(Poly)); 
    *p=*p2; 
    tail->next=p; 
    tail=p; 
    p2=p2->next; 
    i++; 
  } 
 (*P_PolyHead)->expn=i; 
 tail->next=NULL; 
} 


/*void MulPolyn(P_Poly* P_PolyHead,P_Poly PolyHead1,P_Poly PolyHead2)//求积
{
 int i=0; 
 P_Poly p1,p2,p3,p4,p5,p,tail; 
 //p1=PolyHead1->next; 
 //p2=PolyHead2->next; 
 //*P_PolyHead=(P_Poly)malloc(sizeof(Poly)); 
 //p=tail=*P_PolyHead;
 p3=(P_Poly)malloc(sizeof(Poly));
 p3->next=NULL;
 p4=(P_Poly)malloc(sizeof(Poly));
 p4->next=NULL;
 for(p1=PolyHead1->next;p1;p1=p1->next)
 {
	 for(p2=PolyHead2->next;p2;p2=p2->next)
	 {
		 p5=(P_Poly)malloc(sizeof(Poly));
         p4->next=p5;
         p5->coef=p1->coef*p2->coef;
		 p5->expn=p1->expn+p2->expn;
		 p5->next=NULL;
         AddPoly(&p,p4,p3);
		 tail->next=p;
	     tail=p;
		 p->coef=p4->coef;
		 p->expn=p4->expn;
         p1=p1->next; 
         p2=p2->next;
		 
	 }
 }
}

void Derivation(P_Poly* P_PolyHead,P_Poly PolyHead1)//求导数
{
   int i=0;
   P_Poly p1,p,tail;
   p1=PolyHead1->next;
   *P_PolyHead=(P_Poly)malloc(sizeof(Poly));
   p=tail=*P_PolyHead;
   for(;p1!=NULL;p1=p1->next)
   {
	   p=(P_Poly)malloc(sizeof(Poly));
	   tail->next=p; 
       tail=p;
	   if(p1->expn==0)
		   p1->coef=0;
	   else 
	   { p1->coef=p1->coef*p1->expn;
	     p1->expn--;
	   }
	   *p=*p1;
	   i++;
   }
}*/


  
    

void DelPoly(P_Poly* P_PolyHead) //删除并释放多项式
{ 
 P_Poly p,prior; 
 p=prior=*P_PolyHead; 
  while (p->next) 
  { 
    p=p->next; 
    free(prior); 
    prior=p; 
  } 
 *P_PolyHead=NULL; 
}

status main() 
{ 
 P_Poly PolyHead[26]={0}; 
 char menu,name; 
  for (;;) 
  { 
	printf("================================================================\n");
	printf("                       一元稀疏多项式计算器                     \n");
	printf("================================================================\n");
	printf("-----制作人:黄子健\n");
	printf("-----班别:04信息安全2班\n");
	printf("-----学号:3104009066\n");
	printf("================================================================\n");
	printf("******功能选择******\n");
    printf ("---1.建立多项式\n"); 
    printf ("---2.输出多项式\n"); 
    printf ("---3.求两个多项式之和并输出(必须先创建)\n"); 
    printf ("---4.求两个多项式之差并输出(必须先创建)\n"); 
    printf ("---5.删除多项式\n"); 
    printf ("---6.退出程序\n"); 
	//printf ("---7.求多项式的导数并输出(必须先创建)\n");
    printf ("请选择指令:"); 
    READ(menu) 
  switch (menu) 
	{ 
      case '1': 
		  { 
           int n; 
           printf ("请输入要创建的多项式名称(单个小写字母表示):"); 
           READ(name) 
           if (NULL!=PolyHead[name-'a']) 
		   { 
            printf ("此多项式已经存在!\n"); 
            break; 
		   } 
           printf ("请输入项数:"); 
           scanf ("%d",&n); 
           if(CreatPoly(&PolyHead[name-'a'],n)) 
			  printf ("多项式%c创建完毕!\n",name); 
              
		  } break; 
      case '2': 
           printf ("请输入要输出的多项式的名称:"); 
           READ(name) 
           if (NULL==PolyHead[name-'a']) 
		   { 
            printf ("此多项式不存在!\n"); 
            break; 
		   } 
           OutPutPoly(PolyHead[name-'a']); 
           break; 
      case '3': 
		  { 
           char name1,name2; 
           printf ("请输入加式一的名称:"); 
           READ(name1) 
           if (NULL==PolyHead[name1-'a']) 
		   { 
            printf ("此多项式不存在!请先创建\n"); 
            break; 
		   } 
           printf ("请输入加式二的名称:"); 
           READ(name2) 
           if (NULL==PolyHead[name2-'a']) 
		   { 
            printf ("此多项式不存在!请先创建\n"); 
            break; 
		   } 
           printf ("请输入要创建的和式的名称:"); 
           READ(name) 
           if (NULL!=PolyHead[name-'a']) 
		   { 
            printf ("此多项式已经存在!\n"); 
            break; 
		   } 
           AddPoly(&PolyHead[name-'a'],PolyHead[name1-'a'],PolyHead[name2-'a']); 
           OutPutPoly(PolyHead[name-'a']); 
           break; 
		  } 
      case '4': 
		  { 
           char name1,name2; 
           printf ("请输入被减式的名称:"); 
           READ(name1) 
           if (NULL==PolyHead[name1-'a']) 
		   { 
            printf ("此多项式不存在!请先创建\n"); 
            break; 
		   } 
           printf ("请输入减式的名称:"); 
           READ(name2) 
           if (NULL==PolyHead[name2-'a']) 
		   { 
            printf ("此多项式不存在!请先创建\n"); 
            break; 
		   } 
           printf ("请输入要创建的差式的名称:"); 
           READ(name) 
           if (NULL!=PolyHead[name-'a']) 
		   { 
            printf ("此多项式已经存在!\n"); 
            break; 
		   } 
           DecPoly(&PolyHead[name-'a'],PolyHead[name1-'a'],PolyHead[name2-'a']); 
           OutPutPoly(PolyHead[name-'a']); 
           break; 
		  } 
      case '5': 
          printf ("请输入要删除的多项式名称:"); 
          READ(name) 
          if (NULL==PolyHead[name-'a']) 
		  { 
           printf ("此多项式不存在!\n"); 
           break; 
		  } 
          DelPoly(&PolyHead[name-'a']); 
          printf ("多项式%c已删除!\n",name); 
          break; 
     case '6': 
          return OK; 
	 /*case '7':
		 {
			 char name1;
			 printf("请输入求导数多项式的名称:");
			 READ(name1);
             if (NULL==PolyHead[name1-'a']) 
			 { 
              printf ("此多项式不存在!请先创建\n"); 
              break; 
			 } 
			 /*printf("请输入乘式二的名称:");
			 READ(name2);
			 if (NULL==PolyHead[name2-'a']) 
			 { 
              printf ("此多项式不存在!请先创建\n"); 
              break; 
			 } 
			 printf ("请输入要创建的导数多项式的名称:"); 
             READ(name) 
             if (NULL!=PolyHead[name-'a']) 
			 { 
              printf ("此多项式已经存在!\n"); 
              break; 
			 }
			 Derivation(&PolyHead[name-'a'],PolyHead[name1-'a']);
			 OutPutPoly(PolyHead[name-'a']);
			 break;
	      } */
     } 
  }
}

⌨️ 快捷键说明

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