本文主要是介绍一元多项式的相加、相乘,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
#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;
}
这篇关于一元多项式的相加、相乘的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!