JAVA实现多项式相加

来源:互联网 发布:redis cli 端口 编辑:程序博客网 时间:2024/05/16 07:36

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define   LEN   sizeof(node)

typedef struct polynode    /*用单链表存储多项式的结点结构*/
{
       int coef;   /*多项式的系数*/
       int exp;    /*指数*/
       struct polynode *next; /*next是struct polynode类型中的一个成员,它又指向
                          struct polynode类型的数据,以此建立链表*/
}node;/*若定为"node,*list;",意即node*与list同为结构指针类型*/

node * create(void)   /*指针函数,返回指针类型;用尾插法建立一元多项式的链表的函数*/
{
      node *h,*r,*s;
      int c,e;
      h=(node *)malloc(LEN);   /*建立多项式的头结点,为头结点分配存储空间*/
      r=h; /*r指针始终动态指向链表的当前表尾,以便于做尾插入,其初值指向头结点*/
      printf("coef:");
      scanf("%d",&c); /*输入系数*/
      printf("exp: ");
      scanf("%d",&e); /*输入指针*/
      while(c!=0)   /*输入系数为0时,表示多项式的输入结束*/
     {
           s=(node *)malloc(LEN); /*申请新结点*/
           s->coef=c;   /*申请新结点后赋值*/
           s->exp=e;    /*申请新结点后赋值*/
           r->next=s; /*做尾插,插入新结点*/
           r=s;   /*r始终指向单链表的表尾*/
           printf("coef:");
           scanf("%d",&c);
           printf("exp: ");
           scanf("%d",&e);
     }
     r->next=NULL; /*将表的最后一个结点的next置NULL,以示表结束*/
     return(h);
}

void polyadd(node *polya, node *polyb)/*一元多项式相加函数,用于将两个多项式相加,然后将和多项式存放在多项式polya中,并将多项式ployb删除*/
{
        node *p,*q,*pre,*temp;
        int sum;
        p=polya->next;/*令p和q分别指向polya和polyb多项式链表中的第一个结点*/
        q=polyb->next;
        pre=polya;     /*位置指针,指向和多项式polya*/
        while(p!=NULL&&q!=NULL) /*当两个多项式均未扫描结束时,执行以下操作*/
       {
             if(p->exp<q->exp)            /*若p指向的多项式指数小于q指的指数*/
             {
                    pre->next=p;       /*将p结点加入到和多项式中*/
                    pre=pre->next;
                    p=p->next;
             }
             else if(p->exp==q->exp)     /*若指数相等,则相应的系数相加*/
             {
                    sum=p->coef+q->coef;
                    if(sum!=0)
                    {
                         p->coef=sum;
                         pre->next=p;pre=pre->next;p=p->next;
                         temp=q;q=q->next;free(temp);
                     }
                   else      /*如果系数和为零,则删除结点p与q,并将指针指向下一个结点*/
                  {
                        temp=p->next;free(p);p=temp;
                        temp=q->next;free(q);q=temp;
                  }
            }
           else                       /*若p指数大于q指数*/
           {
                 pre->next=q;   /*p结点不动,将q结点加入到和多项式中*/
                 pre=pre->next;
                 q=q->next;
           }
     }
     if(p!=NULL)   /*多项式A中还有剩余,则将剩余的结点加入到和多项式中*/
            pre->next=p;
     else         /*否则将B的结点加入到和多项式中*/
            pre->next=q;                                                        
}

void print(node * p) /*输出函数,打印出一元多项式*/
{                                                                                                     
     while(p->next!=NULL)
     {  
         p=p->next;
         printf("      %d*x^%d",p->coef,p->exp);  
          
     }
}  

main()        /*主函数*/
{
       node * polya,* polyb;
       printf("Welcome to use!/n");
       printf("/nPlease input the ploya include coef && exp:/n");
       polya=create();   /*调用建立链表函数,创建多项式A*/
       print(polya);
       printf("/nPlease input the ployb include coef && exp:/n");
       polyb=create();   /*同理,创建B*/
       print(polyb);
       printf("/nSum of the poly is:/n");
       polyadd(polya,polyb);     /*调用一元多项式相加函数*/
       print(polya);             /*调用输出函数,打印结果*/
       printf("/n");
}

原创粉丝点击