多项式四则混合运算(链表法)
#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;
}