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

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

📁 应急之用
💻 CPP
字号:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <conio.h>
#define MAX_LOADSTRING 100

#define TRUE       1
#define FALSE      0
#define OK         1
#define ERROR      0
#define INFEASIBLE -1
#define Null       0
typedef int  ElemType; 
typedef int  Status;


typedef struct  LNode{ 
    float coef;     
    int   expn;     
    struct  LNode *next;
}*polynomial;

polynomial CreatPolyn(char i);
void DestroyPolyn(polynomial L);
double vaulePolyn(polynomial s);
polynomial SortPolyn(polynomial k);
void PrintPolyn(polynomial s,char i);
void dPolyn(polynomial s);
polynomial AddPolyn(polynomial s,polynomial t);
polynomial Opposite(polynomial s);
polynomial SubtractPolyn(polynomial s,polynomial t);
polynomial MultiplyPolyn1(polynomial s,polynomial t);
void display1(polynomial s,polynomial t);
void display(polynomial &s,polynomial &t);
polynomial MultiplyPolyn1(polynomial s,polynomial t);

polynomial CreatPolyn(char i) 
 { 
  float pcoef=0;
  int   pexpn=0,m,j=0;
  polynomial p,q,t,head;
  printf("\t请输入多项式%c的项数:",i);
  scanf("%d",&m);
  if(m<0)
  {
   printf("\t多项式的项数不可为负数,请重新输入多项式%c的项数:",i);
   scanf("%d",&m);
  }
  head=new LNode;
  head->next=Null; 
  t=q=head;
  t=t->next;
  printf("\t请根据提示依次输入%c的系数和指数:\n\n",i);
  for(j=1;j<=m;j++)
  {
   
   printf("\t请输入第%d项的系数:",j);
   scanf("%f",&pcoef);
   while(pcoef==0){
	   printf("\t稀疏多项式的系数不可为零,请重新输入第%d项的系数:",j);
	   scanf("%f",&pcoef);
   }
   printf("\t请输入第%d项的指数:",j); 
   scanf("%d",&pexpn);
   printf("\n"); 
   while(t!=Null) 
        { 
          if(t->expn==pexpn){
	     t->coef+=pcoef;
             break;
          }
          else {q=t;t=t->next;} 
        }
   if(t==Null){
    p=new LNode;
    p->coef=pcoef;
    p->expn=pexpn; 
    q->next=p;
    p->next=Null;
   }     
   t=head;
   t=t->next;
   q=p;
  }
  system("cls");
  return head;
 }

 void DestroyPolyn(polynomial L)
 { /* 销毁线性链表L,L不再存在 */
   polynomial p,q,head;
   head=L;
   p=q=L;
   p=p->next;
   if(p!=Null)/* 不是空表 */
   {
     q=p;
     while(p!=Null)
     {
       p=q->next;
      delete(q);
       q=p;
     }
    delete(head);
   }
  head=Null;
 }

polynomial SortPolyn(polynomial k)
 {
  polynomial head,ha,qa;
  float pcoef=0;
  int   pexpn=0;
  head=ha=k;
  while(ha->next!=Null)
    {
	 ha=ha->next;
	 qa=ha->next;
     while(qa!=Null)
	  {
		 pcoef=ha->coef;pexpn=ha->expn;
         if(ha->expn<qa->expn){
           ha->expn=qa->expn;ha->coef=qa->coef;
           qa->expn=pexpn;qa->coef=pcoef;
		   qa=qa->next;
          }
	 }
		 
    }
  return head;
 }

void PrintPolyn(polynomial s,char i)
 { 
   polynomial q;
   q=s; 
   q=q->next;
   printf("\t%c=",i);
   if(q==Null) printf("0\n");
   while(q!=Null)
   { 
	 if(q->next==Null){
             if(q->expn!=1&&q->expn!=0){
               if(q->coef<0)printf("(%f)x^%d\n",q->coef,q->expn);
                 else if(q->coef==1)printf("x^%d\n",q->expn);
                      else printf("%fx^%d\n",q->coef,q->expn);
             }
           if(q->expn==1){
             if(q->coef<0)printf("(%f)x\n",q->coef);
             else if(q->coef==1)printf("x\n");
                   else printf("%fx\n",q->coef);
             } 
           if(q->expn==0.0){
             if(q->coef<0)printf("(%f)\n",q->coef);
             else if(q->coef==1)printf("1\n");
                   else printf("%f\n",q->coef);
             }        
           break;
	   }
	   if(q->next!=Null&&q->coef!=0){
             if(q->expn!=1&&q->expn!=0){
                if(q->coef<0)printf("(%f)x^%d+",q->coef,q->expn);
                else if(q->coef==1.0)printf("x^%d+",q->expn); 
	             else printf("%fx^%d+",q->coef,q->expn); 
               }
             if(q->expn==0){
                if(q->coef<0)printf("(%f)+",q->coef);
                else if(q->coef==1.0)printf("1+"); 
	             else printf("%f",q->coef); 
               }
             if(q->expn==1){
                if(q->coef<0)printf("(%f)x+",q->coef);
                else if(q->coef==1.0)printf("x+"); 
	             else printf("%fx+",q->coef); 
               }
	     q=q->next;
	   }
    
   }
   getch();
 }



polynomial AddPolyn(polynomial s,polynomial t) 
{ 
  polynomial ha,hb,qa,qb,pp,head,p;
  int c;
  head=ha=s;
  pp=ha;
  hb=t;
  qa=head->next;
  qb=hb->next;
  if(hb->next==Null) return(head);
  else
  {
   while(qb!=Null&&qa!=Null)
   { 
    if(qa->expn>qb->expn)c=1;
    else if(qa->expn<qb->expn)c=-1;
         else c=0;
    switch(c)
     {
       case 1:ha->next=qa;  /*如果qa的指数大于qb,qa指向a的下一节点*/
              ha=qa;
	          pp=qa;
              qa=qa->next; 
              break;
       case 0:qa->coef+=qb->coef; /*指数相等时*/
              if(qa->coef==0) 
               {
                pp->next=qa->next;
                delete qa;
                qa=pp->next;
				hb->next=qb->next;
			    delete qb;
                qb=hb->next;
				}
               else    /*当qa与qb的系数和不为零时*/
				{ 
				ha->next=qa;
			    ha=qa;
				pp=qa;
			    qa=qa->next;
			    hb->next=qb->next;
			    delete qb;
                qb=hb->next;
				}
               break;
       case -1:p=new LNode; /*如果qb的指数大于qa,pb插入到a中的合适位置*/
               p->coef=qb->coef;
               p->expn=qb->expn;
               ha->next=p;
               ha=p; 
			   hb->next=qb->next;
			   delete qb;
               qb=hb->next;
			   break;
     }
   }
   if(qa!=Null)
   { while(qa!=Null)
     {
	   ha->next=qa;
	   ha=qa;
	   qa=qa->next;
     }
   }
   if(qb!=Null)
   {
     while(qb!=Null)
      {  p=new LNode;
         p->coef=qb->coef;
         p->expn=qb->expn;
         ha->next=p;
         ha=p;
		 hb->next=qb->next;
		 delete qb;
         qb=hb->next;
      }
   }
   ha->next=Null;
   DestroyPolyn(hb);
   return head;
  }
}

polynomial Opposite(polynomial s)
 {  
   polynomial p,head;
   p=head=s;
   p=p->next;
   while(p!=Null)
   {
     p->coef*=(-1);
     p=p->next;
   }
   return head;
 }

polynomial SubtractPolyn(polynomial s,polynomial t)
 { 
   Opposite(t);
   AddPolyn(s,t);
   return s;
 }


polynomial MultiplyPolyn(polynomial s,polynomial t)
 {
  polynomial p,pc,pq,ahead,bhead,pp,head;
  float pcoef;
  int   pexpn;
  ahead=s;bhead=t;
  pp=ahead->next;
  pq=bhead->next;
  head=new LNode;// 生成头结点
  pc=head;   
  head->next=NULL;
  if(pq==Null||pp==Null)head->next=Null;
  else{
   while(pp!=Null)
    {
	  pq=bhead->next;
      while(pq!=Null)
        {
         pcoef=pp->coef*pq->coef;
         pexpn=pp->expn+pq->expn;
         while(pc->next!=NULL)
           {
               if(pexpn<pc->next->expn) pc=pc->next;
               else 
			   {  
				   if(pexpn>pc->next->expn)
				   {
				       p=new LNode;
                       p->expn=pexpn;p->coef=pcoef;
                       p->next=pc->next;
                       pc->next=p;
				       break;
				   }
			       else  
				   {
				        pc->next->coef+=pcoef;
			            if(pc->next->coef==0) /*当pc的系数和不为零时*/
						{
                          p=pc->next;
				          pc->next=pc->next->next;
			              delete p;
				          
						}
			            break;
				   }
			   }
           }//while
         if(pc->next==Null)
		 {
           p=new LNode;
           p->expn=pexpn;p->coef=pcoef;
           pc->next=p;
		   pc=p;
           pc->next=Null;
          }
         pq=pq->next;
		 pc=head;
        }//while
	  pp=pp->next;
    }//while
  }//else
  return head;
 }

polynomial MultiplyPolyn1(polynomial s,polynomial t)
{
	polynomial head,ha,pa,pb;
    head=s;
	ha=head->next;
	pa=MultiplyPolyn1(head,t);
	while(ha!=NULL)
	{
	  head->next=ha->next;
	  delete ha;
	  ha=head->next;
	  pb=MultiplyPolyn1(head,t);
	  pa=AddPolyn(pa,pb);
	}
	return pa;
}

 double vaulePolyn(polynomial s)
 {
   double sum1=0,sum2=0;
   int i, pexpn;
   float  pcoef;
   polynomial ha;
   printf("\t请输入x的值:");
   scanf("%d",&i);
   ha=s;
   ha=ha->next;
   while(ha!=Null){
        pcoef=ha->coef;
        pexpn=ha->expn;   
	sum1=pcoef*pow(i,pexpn);
        sum2+=sum1;
	ha=ha->next;
      }
  printf("\t多项式在x处的值为:%lf",sum2);
  getch();
  return sum2;
 }


 
void dPolyn(polynomial s)
 {
   polynomial ha,q;
   int   pexpn;
   float pcoef;
   ha=s;
   q=ha;
   ha=ha->next;
   while(ha!=Null)
   { 
           pcoef=ha->coef;
           pexpn=ha->expn;
	   if(ha->expn!=0)
            {
		   ha->coef=pcoef*pexpn;
		   ha->expn=pexpn-1;
		   q=ha;ha=ha->next;
	    }
	   else
            {
		   q->next=ha->next;
          delete(ha);
		   ha=q->next;
            } 
   }
   ha->next;
 }
void display(polynomial &s,polynomial &t)
{
char y,c1='A',c2='B';
polynomial pa,pb;
system("cls");
printf("                         欢迎使用一元稀疏多项式计算器                  \n");
printf("-------------------------------------------------------------------------------\n");
printf("                       软件4班     3104007083     陈景林                       \n");
printf("-------------------------------------------------------------------------------\n");
printf("                  [i]-->输入多项式               [q]-->退出系统                \n");
printf("-------------------------------------------------------------------------------\n");
printf("\n\t请选择您需要的功能:");
scanf("%c",&y);
 switch(y)
 {
    case 'i':system("cls");
			 pa=CreatPolyn(c1);
			 pb=CreatPolyn(c2);
			 SortPolyn(pa);
			 SortPolyn(pb);
			 display1(pa,pb);
			 break;
    case 'q':system("cls");
		     exit(0);
			 break;
   default:
	   {
	    system("cls");
	    display(s,t);
	   }
	  break;
 }
}

void display1(polynomial s,polynomial t)
{
char y,c1='A',c2='B';
system("cls");
printf("\n\n\n\n\n\n");
printf("\t                欢迎使用一元稀疏多项式计算器                  \n");
printf("\t==============================================================\n");
printf("\t|                * 一元稀疏多项式计算器 *                    |\n");
printf("\t|============================================================|\n");
printf("\t|                       |\n");
printf("\t|============================================================|\n");
printf("\t|        [1]-->多项式相加           [2]-->多项式相减         |\n");
printf("\t|        [3]-->多项式相乘           [4]-->多项式求值         |\n");
printf("\t|        [5]-->多项式求导           [6]-->显示多项式         |\n");
printf("\t|        [7]-->返回菜单             [8]-->退出系统           |\n");
printf("\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\n");
printf("\t请选择您需要的功能:");
scanf("%c",&y);
 switch(y)
 {
    case '1':system("cls");
		     printf("\t现在执行多项式的加法运算:\n");
			 AddPolyn(s,t);
			 printf("\tA+B得到的多项式A为:\n");
			 PrintPolyn(s,c1);
			 display1(s,t);
			 break;
    case '2':system("cls");
		      printf("\t现在执行多项式的减法运算:\n");
			 SubtractPolyn(s,t);
			 printf("\tA-B得到的多项式为:\n");
			 PrintPolyn(s,c1);	 
			 display1(s,t);
			 break;
    case '3':system("cls");
		     printf("\t现在执行多项式的乘法运算:\n");
			 s=MultiplyPolyn(s,t);
			 printf("\tA*B得到的多项式为:\n");			 
			 PrintPolyn(s,c1);
			 display1(s,t);
			 break;
    case '4':system("cls"); 
		     printf("\t现在执行多项式的求值运算:\n");
			 PrintPolyn(s,c1);
			 vaulePolyn(s);
			 display1(s,t);
			 break;
    case '5':system("cls"); 
		     printf("\t现在执行多项式的求导运算:\n");
             PrintPolyn(s,c1);
			 PrintPolyn(t,c2);
			 dPolyn(s);
			 dPolyn(t);
		     printf("\tA的导数A为:\n");
			 PrintPolyn(s,c1);
			 printf("\tA的导数B为:\n");
			 PrintPolyn(t,c2);
			 display1(s,t);
		     break;
    case '8':system("cls");
		     exit(0);
	case '7':system("cls");		 
		     display(s,t);
			 break;
    case'6':system("cls");
		    PrintPolyn(s,c1);
			PrintPolyn(t,c2);
			display1(s,t);
			break;
    default:
	  {
	    system("cls");
	    display1(s,t);
	  }
	break;
 }
}


main()
 {
  polynomial pa,pb;
  display(pa,pb);
  return 0;
 }

⌨️ 快捷键说明

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