您的位置:首页 > 其它

一元多项式的相加、相乘

2014-02-19 19:16 260 查看
#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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: