多项式四则混合运算(链表法)

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#define LEN1 sizeof(struct Queue1)
#define LEN2 sizeof(struct Queue2)
#define LEN3 sizeof(struct Queue3)
using namespace std;


struct Queue1{
 double xishu;
 char zimu[10];
 double cishu[10];
 struct Queue1 *next;
};//第一个多项式


struct Queue2{
 double xishu;
 char zimu[10];
 double cishu[10];
 int mark;
 struct Queue2 *next;
};//第二个多项式

struct Queue3{
 double xishu;
 char zimu[10];
 double cishu[10];
 int mark;
    struct Queue3 *next;
};用来存储的多项式

int main()
{
 void AddQueue(struct Queue1 *A,struct Queue2 *B);//多项式加法
 void DecQueue(struct Queue1 *C,struct Queue2 *D);//多项式减法
 void MulQueue(struct Queue1 *E,struct Queue2 *F);//多项式乘法 
 void DivQueue(struct Queue1 *G,struct Queue2 *H);//多项式除法
 int n,m,n1,m1;
 struct Queue1 *head1,*p1;
 struct Queue2 *head2,*p2;

    printf("欢迎使用本多项式计算系统\n");
 printf("-----------------------------------------------------\n");
 while(1)
 {
  head1=p1=(struct Queue1 *)malloc(LEN1);
     head2=p2=(struct Queue2 *)malloc(LEN2);
  printf("请输入第一个多项式的各项信息\n");
  printf("请输入该多项式的项数n\n");
  cin>>n;
  n1=n;
  while(n1--)
  {
           
         printf("请输入第%d项的内容\n",n-n1);
   printf("系数   各元\n");
   scanf("%lf%s",&p1->xishu,&p1->zimu);
      for(int j=0;j<strlen(p1->zimu);j++)
   {
   printf("第%d项次数\n",j+1);
   cin>>p1->cishu[j];
   }
            p1->next=(struct Queue1 *)malloc(LEN1);
   p1=p1->next;
   }
      p1->next=NULL;
  
   
  printf("请输入第二个多项式的各项信息:\n");
  printf("请输入该多项式的项数:\n");
  cin>>m;
        m1=m;
  while(m1--)
        {
            printf("请输入第%d项的内容\n",m-m1);
   printf("系数   各元\n");
   scanf("%lf%s",&p2->xishu,&p2->zimu);
   for(int j=0;j<strlen(p2->zimu);j++)
   {
   printf("第%d项的次数\n",j+1); 
   cin>>p2->cishu[j];
   }
   p2->next=(struct Queue2 *)malloc(LEN2);
   p2=p2->next;
  }
         p2->next=NULL;
    while(1)
    {
       printf("-----------------------------------------------------\n");
    printf("                多项式加法,请按“1”                \n");
    printf("                多项式减法,请按“2”                \n");
    printf("                多项式乘法,请按“3”                \n");
       printf("                多项式除法,请按“4”                \n");
    printf("              重新输入多项式,请按“5”              \n");
    printf("-----------------------------------------------------\n");
    int ch,mark=0;
    cin>>ch;
    switch(ch)
    {
                   case 1:AddQueue(head1,head2);break;
                   case 2:DecQueue(head1,head2);break;
    case 3:MulQueue(head1,head2);break;
    case 4:DivQueue(head1,head2);break;
    case 5:mark=1;break;
    default:printf("输入错误\n");break;
    }
    if(mark==1)
     break;
    }
  printf("您是否要结束操作,如果是,请输入“YES”,否则的话请输入“NO”\n");
     char end[10];
  scanf("%s",end);
  if(strcmp(end,"YES")==0)
  {
   printf("感谢您的使用,再见!!!\n");
      break;
 }
 }
 return 0;
}

void AddQueue(struct Queue1 *A,struct Queue2 *B)//多项式加法
{
 struct Queue1 *head1,*p1;
 struct Queue2 *head2,*p2;
 struct Queue3 *head3,*p3;
 head3=p3=(struct Queue3 *)malloc(LEN3);
    head1=p1=A;
 head2=p2=B;
 int n1=0,m1=0;
 while(p2->next!=NULL)//设立标志位,计入该项是否使用过
 {  
  p2->mark=0;
  p2=p2->next;
 }

 
 
 p2=head2;
 while(p1->next!=NULL)//多项式加法运算
 {
  int jishu=0,jishu2;
   p2=head2;
  while(p2->next!=NULL)
  {
            jishu2=0;
   if(strcmp(p1->zimu,p2->zimu)==0)
    {
     for(int i=0;i<strlen(p1->zimu);i++)
       if(p1->cishu[i]!=p2->cishu[i])
      {
       jishu2=1;
                      break;
      }
     
     if(jishu2==0)
     {
       p3->xishu=p1->xishu+p2->xishu;
          for(int i=0;i<strlen(p1->zimu);i++)
          p3->cishu[i]=p1->cishu[i];
       p2->mark=1;
       strcpy(p3->zimu,p1->zimu);
       jishu=1;
       n1++;

      
     }
    }
         
    p2=p2->next;
  }
  
  
  if(jishu==0)
   {
    p3->xishu=p1->xishu;
       for(int i=0;i<strlen(p1->zimu);i++)
    p3->cishu[i]=p1->cishu[i];
             strcpy(p3->zimu,p1->zimu);
    n1++;
    }
    p3->next=(struct Queue3 *)malloc(LEN3);
    p3=p3->next;
    p1=p1->next;
 }
 p3->next=NULL;
 
 
 

 p2=head2;
 while(p2->next!=NULL)//处理第二个多项式的剩余项
 {
  if(p2->mark==0)
  {
   p3->xishu=p2->xishu;
      for(int i=0;i<strlen(p2->zimu);i++)
   p3->cishu[i]=p2->cishu[i];
   strcpy(p3->zimu,p2->zimu);
   n1++;
   p3->next=(struct Queue3 *)malloc(LEN3);
      p3=p3->next;
  }
     p2=p2->next;
 }
 p3->next=NULL;
    p3=head3;
 int num=1;
  printf("两个多项式相加的结果为:\n");
  while(p3->next!=NULL)
 {
  
    printf("%.0lf*",p3->xishu);
    for(int i=0;i<strlen(p3->zimu);i++)
    {
     cout<<p3->zimu[i]<<"("<<p3->cishu[i]<<")";
    }
    if(num!=n1)
    cout<<"+";
    p3=p3->next;
    num++;
 }
cout<<endl;
}

void DecQueue(struct Queue1 *C,struct Queue2 *D)//多项式减法
{
 struct Queue1 *head1,*p1;
 struct Queue2 *head2,*p2;
 struct Queue3 *head3,*p3;
 head3=p3=(struct Queue3 *)malloc(LEN3);
    head1=p1=C;
 head2=p2=D;
 int n1=0,m1=0;
 while(p2->next!=NULL)//设立标志位
 {  
  p2->mark=0;
  p2=p2->next;
 }

 
 
 p2=head2;
 while(p1->next!=NULL)//多项式减法运算
 {
  int jishu=0,jishu2;
   p2=head2;
  while(p2->next!=NULL)
  {
            jishu2=0;
   if(strcmp(p1->zimu,p2->zimu)==0)
    {
     for(int i=0;i<strlen(p1->zimu);i++)
       if(p1->cishu[i]!=p2->cishu[i])
      {
       jishu2=1;
                      break;
      }
     
     if(jishu2==0)
     {
       p3->xishu=p1->xishu-p2->xishu;
          for(int i=0;i<strlen(p1->zimu);i++)
          p3->cishu[i]=p1->cishu[i];
       p2->mark=1;
       strcpy(p3->zimu,p1->zimu);
       jishu=1;
       n1++;

      
     }
    }
         
    p2=p2->next;
  }
  
  
  if(jishu==0)
   {
    p3->xishu=p1->xishu;
       for(int i=0;i<strlen(p1->zimu);i++)
    p3->cishu[i]=p1->cishu[i];
             strcpy(p3->zimu,p1->zimu);
    n1++;
    }
    p3->next=(struct Queue3 *)malloc(LEN3);
    p3=p3->next;
    p1=p1->next;
 }
 p3->next=NULL;
 
 
 

 p2=head2;
 while(p2->next!=NULL)
 {
  if(p2->mark==0)
  {
   p3->xishu=p2->xishu;
      for(int i=0;i<strlen(p2->zimu);i++)
   p3->cishu[i]=p2->cishu[i];
   strcpy(p3->zimu,p2->zimu);
   n1++;
   p3->next=(struct Queue3 *)malloc(LEN3);
      p3=p3->next;
  }
     p2=p2->next;
 }
 p3->next=NULL;
    p3=head3;
 int num=1;
  printf("两个多项式相减的结果为:\n");
  while(p3->next!=NULL)
 {
  
    printf("%.0lf*",p3->xishu);
    for(int i=0;i<strlen(p3->zimu);i++)
    {
     cout<<p3->zimu[i]<<"("<<p3->cishu[i]<<")";
    }
    if(num!=n1&&p3->next->xishu>0)
    cout<<"+";
    p3=p3->next;
    num++;
 }
cout<<endl;
}


void MulQueue(struct Queue1 *E,struct Queue2 *F)//多项式乘法
{
    struct Queue1 *head1,*p1;
 struct Queue2 *head2,*p2;
 struct Queue3 *head3,*p3;
 head3=p3=(struct Queue3 *)malloc(LEN3);
    head1=p1=E;
 head2=p2=F;
 int n1=0,m1=0;
 while(p2->next!=NULL)//设立标志位,在这里仅仅是为了初始化,没有什么实际作用!
 {  
  p2->mark=0;
  p2=p2->next;
 }

 
 
   p2=head2;
    while(p1->next!=NULL)//现将第一个多项式的每项都乘以第二个多项式
 {
  p2=head2;
  while(p2->next!=NULL)
  {  
   p3->mark=0;
   p3->xishu=p2->xishu*p1->xishu;
   strcpy(p3->zimu,p1->zimu);
   strcat(p3->zimu,p2->zimu);
   int length1=strlen(p1->zimu);
   int length2=strlen(p2->zimu);
   for(int i=0;i<length1;i++)
       p3->cishu[i]=p1->cishu[i];
   for(int j=0;j<length2;j++)
    p3->cishu[length1+j]=p2->cishu[j];
   for(i=0;i<length1;i++)//处理没个多项式乘完后的重复问题
   {   
    for(int j=length1;j<length1+length2;j++)
    
     if(p3->zimu[i]==p3->zimu[j])
     {
      p3->cishu[i]=p3->cishu[i]+p3->cishu[j];
      for(int k=j;k<strlen(p3->zimu)-1;k++)
      {
       p3->zimu[k]=p3->zimu[k+1];
       p3->cishu[k]=p3->cishu[k+1];
              
      }
       p3->mark++;
    }
   }
    
   p3->next=(struct Queue3 *)malloc(LEN3);
   p3=p3->next;
   p2=p2->next;
  }
  p1=p1->next;
 }
 p3->next=NULL;
   
 p3=head3;
 printf("两个多项式相乘的结果为:\n");
 while(p3->next!=NULL)
 {
  
    printf("%.0lf*",p3->xishu);
    for(int i=0;i<strlen(p3->zimu)-p3->mark;i++)
    {
     cout<<p3->zimu[i]<<"("<<p3->cishu[i]<<")";
    }
    if(p3->next->next!=NULL&&p3->next->xishu>0)
    cout<<"+";
    p3=p3->next;
 }
cout<<endl;
}


void DivQueue(struct Queue1 *G,struct Queue2 *H)//多项式除法
{
   struct Queue1 *head1,*p1;
   struct Queue2 *head2,*p2;
    head1=p1=G;
 head2=p2=H;
    printf("两个多项式相除的结果为:\n");
 while(p1->next!=NULL)
 {
  
    printf("%.0lf*",p1->xishu);
    for(int i=0;i<strlen(p1->zimu);i++)
    {
     cout<<p1->zimu[i]<<"("<<p1->cishu[i]<<")";
    }
    if(p1->next->next!=NULL&&p1->next->xishu>0)
    cout<<"+";
    p1=p1->next;
 }
    cout<<endl;
 printf("____________________________________\n");
 while(p2->next!=NULL)
 {
  
    printf("%.0lf*",p2->xishu);
    for(int i=0;i<strlen(p2->zimu);i++)
    {
     cout<<p2->zimu[i]<<"("<<p2->cishu[i]<<")";
    }
    if(p2->next->next!=NULL&&p2->next->xishu>0)
    cout<<"+";
    p2=p2->next;
 }
cout<<endl;
}

原文地址:https://www.cnblogs.com/xiohao/p/2995330.html