多项式的排列,两项相加(C语言)

#include < stdio.h>
#include < stdlib.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;
  }
 }
}
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++;
 }
 printf("/n");
}
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;
}

int main(){
 int m,n,flag=0;
 Polyn pa=0,pb=0,pc;//定义各式的头指针,pa与pb在使用前付初值NULL
 printf("       09计科2班  第十六组      /n");
 printf("**********************************************/n");
 printf("请输入a的项数:");
 scanf("%d",&m);
 pa=CreatePolyn(pa,m);//建立多项式a
 printf("请输入b的项数:");
 scanf("%d",&n);
 pb=CreatePolyn(pb,n);//建立多项式a
 printf("操作提示:/n/t1.输出多项式a和b/n/t2.建立多项式a+b/n");
 printf("/t3.退出/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) break;
  if(flag<1||flag>8) printf("Error!!!/n");continue;
 }
 DestroyPolyn(pa);
 DestroyPolyn(pb);
 return 0;
}

C语言中,你可以编写一个函数来进行一元多项式的加法,这个函数通常会接受两个结构体(例如`Polynomial`),其中包含多项式的系数和次数信息。下面是一个简单的例子: ```c #include <stdio.h> // 定义多项式结构体 typedef struct { int coefficient; // 系数 int degree; // 次数 } Term; // 结构体数组表示多项式 typedef struct { int count; Term terms[]; } Polynomial; // 助记符函数用于创建多项式的零实例 Polynomial zero_poly(int n) { Polynomial poly = {n, {0}}; return poly; } // 添加两个多项式 Polynomial add_polynomials(Polynomial poly1, Polynomial poly2) { Polynomial result = zero_poly(poly1.count + poly2.count); for (int i = 0; i < poly1.count; i++) { result.terms[i].coefficient += poly1.terms[i].coefficient; } for (int i = 0, j = poly1.count; i < poly2.count; i++, j++) { result.terms[j].coefficient += poly2.terms[i].coefficient; } // 对齐结果多项式的最高次项 while (result.terms[result.count - 1].degree == 0) { result.count--; } return result; } // 打印多项式 void print_polynomial(Polynomial poly) { printf("Poly: ["); for (int i = 0; i < poly.count; i++) { if (i > 0) { printf(", "); } printf("%d * x^%d", poly.terms[i].coefficient, poly.terms[i].degree); } printf("]\n"); } int main() { Polynomial p1 = {3, {5, 2}}, p2 = {2, {4, 1}}; Polynomial sum = add_polynomials(p1, p2); printf("p1: %d * x^2 + %d * x\n", p1.terms[0].coefficient, p1.terms[1].coefficient); printf("p2: %d * x^1 + %d * x^0\n", p2.terms[0].coefficient, p2.terms[1].coefficient); printf("Sum: %s\n", print_polynomial(sum).terms); // 输出合并后的多项式 return 0; } ``` 在这个示例中,我们首先定义了一个多项式的结构体和相关的辅助函数。然后,在`add_polynomials`函数中实现了两个多项式的加法。注意,这个代码假设输入的多项式已经按照非降序排列
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值