我是靠谱客的博主 激情火,最近开发中收集的这篇文章主要介绍一元多项式的各种操作,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

历时一个星期,时间确实也花了不少。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,   %dn",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,%dn",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);

}

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

 

最后

以上就是激情火为你收集整理的一元多项式的各种操作的全部内容,希望文章能够帮你解决一元多项式的各种操作所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(32)

评论列表共有 0 条评论

立即
投稿
返回
顶部