一元多项式的各种操作

历时一个星期,时间确实也花了不少。VC++ 好蛋疼。

 

一元多项式的各种操作

一元多项式的各种操作

 

“a.h”
#include
#include
#include
#define TRUE 1
#define  FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;

 

typedef struct {
    float coef;  //系数
 int expn;  //指数
ElemType;


typedef struct LNode{
    ElemType data;
 struct LNode *next;
}LNode ,*Link,*Position;

typedef struct LinkList{
  Link head,tail;
  int len;
} LinkList;

 

"b.c"

见上两篇。

“c.h”

#include"a.h"
#include"b.c"
#include"c.c"

Status OrderInsertMerge(LinkList *L,ElemType e,int (*compare)(term,term)); 
//按有序函数compare()约定,将值为e的节点插入或合并到升序L的适当位置

int cmp(ElemType a,ElemType b);
//依a的指数值 <,=或>b的指数值,分别返回-1,0,+1

void CreatPolyn(polyn *p,int m);
//输入m项的系数和指数,建立表示一元多项式的有序链表p

void PrintPolyn(polyn p);
//打印输出一元多项式p

void AddPolyn1(polyn *pa,polyn *pb);
//多项式加法 pa=pa+pb,并销毁一元多项式pb

void AddPolyn2(polyn *pa,polyn *pb);
//另一种多项式加法 pa=pa+pb,并销毁一元多项式pb

void Opposite(polyn pa);
// 一元多项式系数取反

void SubtractPolyn(polyn *pa,polyn *pb);
// 多项式减法 pa=pa-pb,并销毁一元多项式pb

void MultiplyPolyn(polyn *pa,polyn *pb);

//多项式乘法pa=papb,并销毁一元多项式pb

 

"c.c"

 

typedef LinkList polyn;
#define DestroyPolyn DestroyList
#define PolynLength ListLength


Status OrderInsertMerge(LinkList *L,ElemType e,int (*compare)(ElemType,ElemType))
//按有序函数compare()约定,将值为e的节点插入或合并到升序L的适当位置
{
       Link q,s;
    if(LocateElemTypePosition((*L),e,&q,compare)){
             q->data.coef+=e.coef;
                if(!q->data.coef){
                    s=PriorPosition(L,q);
     if(!s)
      s=(*L).head;
     s->next=q->next;
     DelFirst(L,s,&q);
     Free(&q);
    }
    return OK;
    }
  else
  {
      if(MakeNode(&s,e))
   {
      InFirst(L,q,s);
      return OK;
   }
   else
    return ERROR;
   
   

}

int cmp(ElemType a,ElemType b)
//依a的指数值 <,=或>b的指数值,分别返回-1,0,+1
{
         if(a.expn==b.expn)
    return 0;
   else
   if(a.expn
    return -1;
   else
    return 1;
}

void CreatPolyn(polyn *p,int m)
//输入m项的系数和指数,建立表示一元多项式的有序链表p
{
       
  ElemType e;
  int i;
  InitList(p);
  printf("请输入 %d 个系数,先系数后指数\n",m);
  for(i=1;i<=m;i++){
     scanf("%f,%d",&e.coef,&e.expn);
   
    
      OrderInsertMerge(p,e,cmp);
  }
}
void PrintPolyn(polyn p)
//打印输出一元多项式p
{
     Link q;
  q=p.head->next;
  printf("系数      指数\n");
  while(q){
  printf("%f,   %d\n",q->data.coef,q->data.expn);
  q=q->next;
  }
  printf("*****************************\n");
}

void AddPolyn1(polyn *pa,polyn *pb)
//多项式加法 pa=pa+pb,并销毁一元多项式pb
{
   float sum;
      Link ha,hb,qa,qb;
   ElemType a,b;
   ha=GetHead(*pa);
   hb=GetHead(*pb);
   qa=NextPosition(ha);
   qb=NextPosition(hb);
   while(!ListEmpty(*pa)&&!ListEmpty(*pb)&&qa){
         a=qa->data;
   b=qb->data;
   switch(cmp(a,b)){
   case 0 :  sum=qa->data.coef+qb->data.coef;
         if(sum==0){
         DelFirst(pa,ha,&qa);
               Free(&qa);
      }
      else{
           qa->data.coef=sum;
        ha=qa;
                     }
                     qa=qa->next;
      DelFirst(pb,hb,&qb);
      Free(&qb);
      qb=NextPosition(hb);
       break;
   
   case -1: ha=qa;  
         qa=qa->next;
         break;

          
   case 1: DelFirst(pb,hb,&qb);
        InFirst(pa,ha,qb);
     ha=ha->next;
        qb=NextPosition(hb);
        break;
   }
   }
         DestroyList(pb);
}


void AddPolyn2(polyn *pa,polyn *pb)
//另一种多项式加法 pa=pa+pb,并销毁一元多项式pb
{
   ElemType e;
      Link qb;
 
   qb=pb->head->next;
      while(qb){
     e=qb->data;
  OrderInsertMerge(pa,e,cmp);
     qb=qb->next;
   }
      if(!pb)
  DestroyList(pb);
 
}
void Opposite(polyn pa)
// 一元多项式系数取反
{
  Link qa=pa.head->next;
     while(qa){
     qa->data.coef=(-1)*qa->data.coef;
  qa=qa->next;
  }
}
void SubtractPolyn(polyn *pa,polyn *pb)
// 多项式减法 pa=pa-pb,并销毁一元多项式pb
{
      Opposite((*pb));
   AddPolyn1(pa,pb);

}
void MultiplyPolyn(polyn *pa,polyn *pb)

//多项式乘法pa=papb,并销毁一元多项式pb
{
  polyn pc;
     ElemType e,c;
 
     Link qb=(*pb).head->next;
  Link qa;
  InitList(&pc);

  while(qb){
          e=qb->data;
          qa=(*pa).head->next;                                   //位置不要放在大循环的外面
    while(qa){
     c.coef=qa->data.coef*e.coef;
     c.expn=qa->data.expn+e.expn;
     printf("-------------------------%f,%d\n",c.coef,c.expn);
     OrderInsertMerge(&pc,c,cmp);     
     qa=qa->next;
            
    }
   qb=qb->next;
  
  }
   if(!pb)
       DestroyList(pb);
    ClearList(pa);
          (*pa).head=pc.head;
    (*pa).tail=pc.tail;
    (*pa).len=pc.len;
 
}
"main.c"

 

#include "c.h"

int main()
{
   polyn pa;
   polyn pb;
   CreatPolyn(&pa,2);
   PrintPolyn(pa);
   CreatPolyn(&pb,2);
   PrintPolyn(pb);

   

   MultiplyPolyn(&pa,&pb);
   PrintPolyn(pa);
  
   CreatPolyn(&pb,2);
   PrintPolyn(pb);
   SubtractPolyn(&pa,&pb);
   PrintPolyn(pa);

}

接下来开始下一章节,堆栈。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值