一元多项式加和乘

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define  null 0
#define  MAX 0x3f3f3f
typedef struct//系数和指数 
{
float coef;
 int expn;
}term;
typedef struct Lnode//链表 
{
term data;
Lnode *next;
}
*Link,*Linklist;


int cmp(term a,term b)
{
if (a.expn==b.expn) 
return 0;
  else 
return (a.expn-b.expn)/abs(a.expn-b.expn);
}


void Orderinsert(Linklist &L,term e,int (*comp)(term,term))
{
Link o,p,q;
q=L;
p=q->next;
while (p&&comp(p->data,e)<0)//当到链表尾部或者比加入项小的项时结束! 
{
q=p;p=p->next;
}
o=(Link)malloc(sizeof(Lnode));
o->data=e;//将该项赋给中间变量o! 
q->next=o;//将比它大的一项指向它! 
o->next=p;//该项指向链表的剩余部分! 
}


int LocateElem(Linklist L,term e,Link &s,Link &q,int (*comp)(term,term))
{
Link p;s=L;
p=s->next;
while (p&&comp(p->data,e)!=0)//寻找是否有相同的指数项 
{
s=p;p=p->next;
}
if(!p)//判断p是否为空! 
{
s=q=null;
return 0;
}
else 
{
q=p;//将找到和加入元素指数相同的元素时,将其赋给q! 
return 1;
    }
}


void Delnext(Linklist &L,Link s)//将链表中的参与运算的项去掉! 
{Link q=s->next;
 s->next=q->next;
 free(q);
}


void Orderinsertmerge(Linklist L,term e,int (*compara)(term,term))
{
Link q,s;
if (LocateElem(L,e,s,q,compara))//判断是否有指数相同的项! 
{
q->data.coef+=e.coef;
if (!q->data.coef)//判断是否系数相加,和为零! 
{
Delnext(L,s);//将链表中的参与运算的项去掉! 
   }
}
else  Orderinsert(L,e,compara);//把新的项加入链表中! 
}


void Creatpolyn (Linklist &p,int m)//建立链表或把元素加入链表 
{
 term e;
 int i;
 p=(Link)malloc(sizeof(Lnode));p->next=null;
 printf("\n请输入%d个系数和指数用空格符间隔:\n",m);
 for(i=1;i<=m;i++)
 {
  scanf("%f%d",&e.coef,&e.expn);
  Orderinsertmerge(p,e,cmp);
 }
}


void  merge(Linklist La,Linklist Lb, Linklist &head)
{
Link qa, qb;
term s;
head=(Link)malloc(sizeof(Lnode));
head->next=null;


qb = Lb -> next ;
while(qb)
{ qa = La -> next;
while(qa)
{
s.coef = qa->data.coef * qb ->data.coef; 
s.expn = qa -> data.expn + qb -> data.expn;
Orderinsertmerge(head, s, cmp);
   qa = qa -> next;
}
qb = qb -> next;
}
}
void printpolyn(Linklist p)
{
    Link q;
q=p->next;
printf("    系数    指数\n");
while(q)
{
 if(q->data.coef !=0)
 printf("%8.2f  %-d\n",q->data.coef,q->data.expn);
 q=q->next;
}
}


int calsize(Linklist  q)//看全部项和是否为零! 
{
int k=0;
Link p;
p=q->next ;
while(p)
{
k++;
p=p->next ;
}
return k;
}


int  printpolyn2(Linklist p)
{
Link q;
int k=0,t=0;
q=p->next ;
while(q)

        if(q->data.coef !=0)
{
t++;
if(t>1)
{
if(q->data.coef >0)//当大于零时,输出+! 
{
if(q->data.expn!=0)
printf("+%fx^%d",q->data.coef ,q->data.expn );
else
printf("+%f",q->data.coef );
}
else//否则输出该项即可! 
{
if(q->data.expn!=0)
printf("%fx^%d",q->data.coef ,q->data.expn );
else
printf("%f",q->data.coef );
}

}
else//第一项时,不输出+! 
 if(q->data.expn!=0)
printf("%fx^%d",q->data.coef ,q->data.expn );
else
printf("%f",q->data.coef );

   else
   k++;//记录 
   q=q->next;
}
return  k;//判断是否全部和为零! 
}


void add(Linklist La,Linklist  Lb)
{
Link q;
term e;
q=Lb->next;
while(q)//将Lb中元素加入La中! 
{
e=q->data ;
Orderinsertmerge(La,e,cmp);
q=q->next ;
}

}


void printmainmune()
{
printf("\n\n");
printf("\t\t------------(第二次上机实验)-------------\t\t\t\n\n");
printf("\t\t功能介绍:一元多项式的加运算和乘运算\t\t\n\n\n");
printf("\t\t请输入你想要的操作:\t\t\t\t");
printf("\t\t\t\t\t1:一元多项式加法运算\n\n");
printf("\t\t\t2:一元多项式乘法运算\n\n");
printf("\t\t\t3:使用结束!\n"); 
}


void printplusmune()
{
printf("\n\n\n");
printf("\t\t\t是否继续执行相加运算?\t\t\t");
printf("\t\t\t\t\t\t1:继续执行\n");
printf("\t\t\t\t2:返回主菜单\n");
printf("\t\t\t\t3:结束使用\n");
}


void printmulitmune()
{
printf("\n\n\n");
printf("\t\t\t\t是否继续执行相乘运算?\t\t");
printf("\t\t\t\t\t\t1:继续执行\n");
printf("\t\t\t\t2:返回主菜单\n");
printf("\t\t\t\t3:结束使用\n");
}


int  main()
{
while(1)//为了多次使用 ! 
{
loop2:int x,n,m,t;
printmainmune();//输出主菜单 
scanf("%d",&n);//取用户的选项 
if(n==3)//结束! 
{
loop3:printf("\n\n"); 
printf("\t\t\t谢谢使用,886!\n"); 
break;
}
if(n==1)

loop1:Linklist L1,L2;
system("cls"); 
printf("\n请输入第一个一元多项式的项数:");
scanf("%d",&x);
Creatpolyn(L1,x);//建表 
printpolyn(L1);//竖向输出表 
m=printpolyn2(L1);//横向输出 

printf("\n请输入第二个一元多项式的项数:");
scanf("%d",&x);
Creatpolyn(L2,x);
printpolyn(L2);
m=printpolyn2(L2);

add(L1,L2);//相加 
printf("\n相加以后的一元多项式表达式为\n");
if(printpolyn2(L1)==calsize(L1))//当结果全部为零时,输出0! 
printf("0\n");

printplusmune();//加运算的副菜单!
scanf("%d",&t);
switch(t) 
{
case 1 : system("cls");goto loop1;  break;
case 2 : system("cls");goto loop2;  break;
case 3 : system("cls");goto loop3;  break;
   }
}
else if(n==2) 
{
loop4:Linklist L1,L2;
system("cls");
printf("\n请输入第一个一元多项式的项数:");
scanf("%d",&x);
Creatpolyn(L1,x);
printpolyn(L1);
m=printpolyn2(L1);

printf("\n请输入第二个一元多项式的项数:");
scanf("%d",&x);
Creatpolyn(L2,x);
printpolyn(L2);
m=printpolyn2(L2);

Linklist L3;//新建的链表,放置每次加的结果! 
merge(L1, L2, L3);
printf("\n相乘以后的一元多项式表达式为\n");
if(printpolyn2(L3)==calsize(L3))//横向输出,并判断是否全部为零! 
printf("0\n");

printmulitmune();//输出乘运算的副菜单! 
scanf("%d",&t);
switch(t) 
{
case 1 : system("cls");goto loop4;  break;
case 2 : system("cls");goto loop2;  break;
case 3 : system("cls");goto loop3;  break;
}
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值