一元多项式求和

写了半天就写这么个东西,大家有兴趣看看........

#include<stdio.h>

#include<malloc.h>

typedef struct Polynomial{

 float coef;

 int expn;

 struct Polynomial *next;

}*Polyn,Polynomial;               //Polyn为结点指针类型

void Insert(Polyn p,Polyn h){     

 if(p->coef==0) free(p);       //系数为0的话释放结点

 else{

  Polyn q1,q2;

  q1=h;q2=h->next;

  while(q2&&p->expn<q2->expn){   //查找插入位置

   q1=q2;

   q2=q2->next;

  }

  if(q2&&p->expn==q2->expn){     //将指数相同相合并

   q2->coef+=p->coef;

   free(p);

   if(!q2->coef){             //系数为0的话释放结点

    q1->next=q2->next;

    free(q2);

   }

  }

  else{                          //指数为新时将结点插入

   p->next=q2;

   q1->next=p;

  }

 }

}//Insert

Polyn CreatePolyn(Polyn head,int m){//建立一个头指针为head、项数为m的一元多项式

 int i;

 Polyn p;

 p=head=(Polyn)malloc(sizeof(struct Polynomial));

 head->next=NULL;

 for(i=0;i<m;i++){

  p=(Polyn)malloc(sizeof(struct Polynomial));//建立新结点以接收数据

  printf("请输入第%d项的系数与指数:",i+1);

  scanf("%f %d",&p->coef,&p->expn);

  Insert(p,head);   //调用Insert函数插入结点

 }

 return head;

}//CreatePolyn

void DestroyPolyn(Polyn p){//销毁多项式p

 Polyn q1,q2;

 q1=p->next;

 q2=q1->next;

 while(q1->next){

  free(q1);

  q1=q2;//指针后移

  q2=q2->next;

 }

}

void PrintPolyn(Polyn P){ 

 Polyn q=P->next; 

 int flag=1;//项数计数器

 if(!q) { //若多项式为空,输出0

  putchar('0'); 

  printf("/n");

  return;

 }   

 while (q){

  if(q->coef>0&&flag!=1) putchar('+'); //系数大于0且不是第一项

  if(q->coef!=1&&q->coef!=-1){//系数非1或-1的普通情况

   printf("%g",q->coef); 

   if(q->expn==1) putchar('X');

   else if(q->expn) printf("X^%d",q->expn);

  }

  else{

   if(q->coef==1){

    if(!q->expn) putchar('1'); 

    else if(q->expn==1) putchar('X'); 

    else printf("X^%d",q->expn);

   }

   if(q->coef==-1){

    if(!q->expn) printf("-1"); 

    else if(q->expn==1) printf("-X"); 

    else printf("-X^%d",q->expn);

   }

  }

  q=q->next; 

  flag++;

 }//while

 printf("/n");

}//PrintPolyn

int compare(Polyn a,Polyn b){

 if(a&&b){

  if(!b||a->expn>b->expn) return 1;

  else if(!a||a->expn<b->expn) return -1;

  else return 0;

 }

 else if(!a&&b) return -1;//a多项式已空,但b多项式非空

 else return 1;//b多项式已空,但a多项式非空

}//compare

Polyn AddPolyn(Polyn pa,Polyn pb){//求解并建立多项式a+b,返回其头指针

 Polyn qa=pa->next;

 Polyn qb=pb->next;

 Polyn headc,hc,qc;

 hc=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点

 hc->next=NULL;

 headc=hc;

 while(qa||qb){

  qc=(Polyn)malloc(sizeof(struct Polynomial));

  switch(compare(qa,qb)){

  case 1:

   {

   qc->coef=qa->coef;

   qc->expn=qa->expn;

   qa=qa->next;

   break;

   }

  case 0:

   { 

   qc->coef=qa->coef+qb->coef;

   qc->expn=qa->expn;

   qa=qa->next;

   qb=qb->next;

   break;

   }

  case -1:

   {

   qc->coef=qb->coef;

   qc->expn=qb->expn;

   qb=qb->next;

   break;

   } 

  }//switch

  if(qc->coef!=0){

   qc->next=hc->next;

   hc->next=qc;

   hc=qc;

  }

  else free(qc);//当相加系数为0时,释放该结点

 }//while

 return headc;

}//AddPolyn

Polyn SubtractPolyn(Polyn pa,Polyn pb){//求解并建立多项式a+b,返回其头指针

 Polyn h=pb;

 Polyn p=pb->next;

 Polyn pd;

 while(p){           //将pb的系数取反

  p->coef*=-1;

  p=p->next;

 }

 pd=AddPolyn(pa,h);

 for(p=h->next;p;p=p->next)    //恢复pb的系数

  p->coef*=-1;

 return pd;

}//SubtractPolyn

int main(){

 int m,n,flag=0;

 float x;

 Polyn pa=0,pb=0,pc,pd,pe,pf;//定义各式的头指针,pa与pb在使用前付初值NULL

 printf("请输入a的项数:");

 scanf("%d",&m);

 pa=CreatePolyn(pa,m);//建立多项式a

 printf("请输入b的项数:");

 scanf("%d",&n);

 pb=CreatePolyn(pb,n);//建立多项式a

 //输出菜单

 printf("**********************************************/n");

 printf("操作提示:/n/t1.输出多项式a和b/n/t2.建立多项式a+b/n/t3.建立多项式a-b/n");

 printf("/t4.退出/n**********************************************/n");

 for(;;flag=0){

  printf("执行操作:");

  scanf("%d",&flag);

  if(flag==1){

   printf("多项式a:");PrintPolyn(pa);

   printf("多项式b:");PrintPolyn(pb);continue;

  }

  if(flag==2){

   pc=AddPolyn(pa,pb);

   printf("多项式a+b:");PrintPolyn(pc);

   DestroyPolyn(pc);continue;

  }

  if(flag==3){

   pd=SubtractPolyn(pa,pb);

   printf("多项式a-b:");PrintPolyn(pd);

   DestroyPolyn(pd);continue;

  }

  if(flag==4) break;

  if(flag<1||flag>4) printf("Error!!!/n");continue;

 }//for

 DestroyPolyn(pa);

 DestroyPolyn(pb);

 return 0;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值