#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;
}
}
}
}
#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;
}
}
}
}