一元多项式的相加、相乘

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