#define null 0
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
typedef struct
{
float coef;//系数
int expn;//指数
}term;//代表一元多项式的一项
typedef struct Lnode
{
term data;//链表的一个结点存放一项
Lnode * next;
}* Link,* Polynomial;//Polynomial代表一元多项式
int cmp(term a,term b)//比较a.b的指数
{
if (a.expn==b.expn) return 0;//如果两项指数相等,返回0
else return
(a.expn-b.expn)/abs(a.expn-b.expn);//如果a的指数 > b的指数返回一个大于0
的值,如果a的指数< b的指数返回一个小于0 的值,abs(a.expn-b.expn)本身大于0,
}
void PrintPolyn(Polynomial p)//输出显示一元多项式p
{
Link q;
q = p->next;
printf("\n##################
系数 指数
#################\n");
while(q)
{
printf("
%8.2f
%-d\n",q->data.coef,q->data.expn);
q = q->next;
}
}
void Orderinsert(Polynomial &L,term e)//在L的合适位置插入e
{
Link o,p,q;
q = L;//q指向L,存放L的地址
p=q->next;//p指向L第一个有效项
while ( p && cmp(p->data,e)<0
)//如果e的指数比p所指向的项的指数小,则指针p后移
{
q = p;//q跟踪p
p = p->next;
}
if( p && 0 == cmp(p->data,e) )
//如果e的指数和p所指向的项的指数相等,则将两项合并
{
p->data.coef += e.coef
;//系数相加,指数不变
return ;
}
else//当前p所指向的项指数比e的大,将新结点插入L
{
o =
(Link)malloc(sizeof(Lnode));//分配新结点
o->data = e;//为新结点赋值
q->next = o;//q指向新结点
o->next =
p;//新结点指向p所指向的项
return;
}
}
void CreatPolyn (Polynomial &L,int m)//创建p,里面含m项
{
term e;//定义一元多项式的一项e
int i;
L = (Link)malloc(sizeof(Lnode));//分配一个结点
L->next = null;
printf("\n请输入%d个系数和指数用空格符间隔:\n",m);
for(i=1;i<=m;i++)
{
scanf("%f%d",&e.coef,&e.expn);//得到e的系数和指数
Orderinsert(L,e);//将e插到一元多项式p的合适位置
}
}
void AddPolyn(Polynomial &La,Polynomial Lb)
{
Link pb;//指向Lb
term b;
pb = Lb->next;
while(pb)
{
b = pb->data;
//用来存放Lb每项数据
Orderinsert(La,b);//将b插入La中
pb = pb->next;
}
printf("\n***************两个多项式相加后的多项式为:***************\n");
PrintPolyn(La); //输出相加后的一元多项式/
free(pb); //销毁链表Lb
}
void MultiplyPolyn(Polynomial La,Polynomial Lb)
{
Polynomial Lc =
(Link)malloc(sizeof(Lnode));
Lc->next = null;//创建一个新的链表,存放相乘后的多项式
Link pa,pb;//pa,pb用来指向La,Lb
term temp;//存放临时项
for(pb = Lb->next; pb ; pb =
pb->next)
{ //Lb的每一项都与 多项式La相乘
for(pa = La->next; pa; pa =
pa->next )
{
temp.coef =
pa->data.coef * pb->data.coef;//系数相乘,指数相加
temp.expn =
pa->data.expn + pb->data.expn;
Orderinsert(Lc,temp);///相乘的每一项都放到Lc中
}
}
printf("\n***************两个多项式相乘后的多项式为:****************\n");
PrintPolyn(Lc); //输出相乘后的一元多项式/
free(Lb);//销毁La,Lb
free(La);
}
int main()
{
system("mode con cols=65
lines=35");//设置窗口大小
system("COLOR f1");//设置窗口颜色
int door=1,num;
while( door )
{
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("
如要对顺序表进行操作,请输入各项前面相应的数字\n");
printf("
************************************\n");
printf("
|
1、两个一元多项式相加
|\n");
printf("
|
2、两个一元多项式相乘
|\n");
printf("
|
0、退出
|\n");
printf("
************************************\n");
printf(" 请输入数字进行操作:");
scanf("%d",&num);
switch(num)
{
case
1: //加法
Polynomial
L1,L2;//定义两个链表代表两个一元多项式
CreatPolyn(L1,5);//创建L1,里面含5项
PrintPolyn(L1);//输出L1
CreatPolyn(L2,3);//创建L2,里面含3项
PrintPolyn(L2);//输出L2
AddPolyn(L1,L2); //两个一元多项式相加
break;
case
2: //乘法
Polynomial
L3,L4;//定义两个链表代表两个一元多项式
CreatPolyn(L3,5);//创建L3,里面含5项
PrintPolyn(L3);//输出L3
CreatPolyn(L4,3);//创建L4,里面含3项
PrintPolyn(L4);//输出L4
MultiplyPolyn(L3,L4); //两个一元多项式相乘
break;
case 0: door
= 0; break;
}
}
return 0;
}