一元多项式的表示及相加(c语言实现)

  一元多项式顾名思义就是好多个式子相加减,显然想到的就是利用单链表来实现,我在此处只讨论一元多项式相加的情况,相减也是一样的做法。首先,两个一元多项式相加,可以把它转化为两个单链表的合并,这是首要,然后就是将相同指数的项合并,将不同指数的项从小到大的顺序排列,使得相加后的一元多项式更加美观。具体代码及注释如下:
#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(poly)
typedef struct term{
    float coef;
    int expn;
    struct term*next;
}poly,*link;
void creatpoly(link*p,int m);
void printpoly(link p);
int  cmp(link p1,link p2);
link addpoly(link pa,link pb);
link reverse(link p);
int main()
{
  link p1,p2;
  int L1,L2;
  printf("请输入第一个多项式的项数:");
  scanf("%d",&L1);
  creatpoly(&p1,L1);
  printf("第一个多项式为:");
  printpoly(p1);
  printf("请输入第二个多项式的项数:");
  scanf("%d",&L2);
  creatpoly(&p2,L2);
  printf("第二个多项式为:");
  printpoly(p2);
  printf("两个一元多项式相加的结果为:");
  printpoly(addpoly(p1,p2));
}
//创建带头节点的多项式
void creatpoly(link*p,int m)//此处*p为双重指针,此意就是改变指针
{
  link r,s;
  int i;
  *p=(link)malloc(LEN);
  r=*p;
  for(i=0;i<m;i++)
  {
      s=(link)malloc(LEN);
      printf("输入系数和指数:");
      scanf("%f %d",&s->coef,&s->expn);
      r->next=s;
      r=s;
  }
  r->next=NULL;
}
//打印多项式
void printpoly(link p)
{
 link s;
 s=p->next;
 while(s)
{
    printf("%.2f X^%d",s->coef,s->expn);
    s=s->next;
    if(s!=NULL)
       if(s->coef>=0)
    printf("+");
}
printf("\n");
}
//比较两项的指数大小,并返回特定的值
int cmp(link a,link b)
{
   if(a->expn<b->expn)
   return -1;
   else if(a->expn==b->expn)
   return 0;
   else    return 1;
}
//两个多项式相加得一个新多项式,并返回新多项式头结点的指针
link addpoly(link pa,link pb)//pa,pb是两个指向头结点的指针
{
  link newp,p,q,s,pc;
  float sum;
  p=pa->next;
  q=pb->next;
  newp=(link)malloc(LEN);
  pc=newp;//pc指向新多项式的头结点
  while(p&&q)
  {
     switch(cmp(p,q))//比较两多项式指数大小
    {
      case -1:
        s=(link)malloc(LEN);
        s->coef=p->coef;
       s->expn=p->expn;
       pc->next=s;
       pc=s;
       p=p->next;
       break;
       case 0://若两项的指数相等,则将两项系数相加后得到的项放入头结点中
       sum=p->coef+q->coef;
       if(sum!=0.0)
       {
           s=(link)malloc(LEN);
           s->coef=sum;
           s->expn=p->expn;
           pc->next=s;
           pc=s;
       }
       p=p->next;
       q=q->next;
       break;
       case 1:
       s=(link)malloc(LEN);
       s->coef=q->coef;
       s->expn=q->expn;
       pc->next=s;
       pc=s;
       q=q->next;
       break;
    }
  }
  pc->next=p?p:q;//将pa或者pb中的剩余项链入新的多项式中
  return newp;
}
//升幂排序函数,头插法逆置链表
link reverse(link p)
{
  link head=p;
  link q1,q2;
  q2=head->next;
  head->next=NULL;
while(q2)
{
    q1=q2;
    q2=q2->next;
    q1->next=head->next;
    head->next=q1;
}
return head;
}
  • 11
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
一元多项式可以通过构体来表示构体中包含两个成员变量,分别表示多项式的系数和指数。具体的C语言实现如下: ``` typedef struct PolyNode { int coef; // 系数 int expon; // 指数 struct PolyNode *next; // 指向下一个节点的指针 } PolyNode, *Polynomial; ``` 其中,Polynomial类型为指向PolyNode构体的指针。 多项式的相加可以通过遍历两个多项式的链表来实现。具体的实现步骤如下: 1. 定义一个新链表,作为相加后的果,初始化为NULL。 2. 遍历两个多项式的链表,依次进行以下操作: a. 如果当前节点的指数相同,则将系数相加,并将果插入到新链表中。 b. 如果当前节点的指数不同,则将指数小的节点插入到新链表中,并将指针向后移动一位。 3. 将剩余的节点依次插入到新链表中。 4. 返回新链表作为相加后的果。 具体的C语言实现如下: ``` Polynomial add(Polynomial p1, Polynomial p2) { Polynomial result = NULL, tail = NULL; // 定义新链表及其尾指针 // 遍历两个链表 while (p1 && p2) { PolyNode *temp = (PolyNode *)malloc(sizeof(PolyNode)); // 创建新节点 if (p1->expon == p2->expon) { // 如果指数相同 temp->coef = p1->coef + p2->coef; // 系数相加 temp->expon = p1->expon; p1 = p1->next; // 指针向后移动一位 p2 = p2->next; } else if (p1->expon > p2->expon) { // 如果p1的指数更大 temp->coef = p1->coef; temp->expon = p1->expon; p1 = p1->next; } else { // 如果p2的指数更大 temp->coef = p2->coef; temp->expon = p2->expon; p2 = p2->next; } temp->next = NULL; // 将新节点插入到新链表中 if (!result) { result = tail = temp; } else { tail->next = temp; tail = temp; } } // 将剩余的节点插入到新链表中 while (p1) { PolyNode *temp = (PolyNode *)malloc(sizeof(PolyNode)); temp->coef = p1->coef; temp->expon = p1->expon; temp->next = NULL; if (!result) { result = tail = temp; } else { tail->next = temp; tail = temp; } p1 = p1->next; } while (p2) { PolyNode *temp = (PolyNode *)malloc(sizeof(PolyNode)); temp->coef = p2->coef; temp->expon = p2->expon; temp->next = NULL; if (!result) { result = tail = temp; } else { tail->next = temp; tail = temp; } p2 = p2->next; } return result; // 返回新链表作为相加后的果 } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值