首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

问一个一元多项式计算器的加减有关问题,

2014-01-12 
问一个一元多项式计算器的加减问题,,这是整个程序,用VC6.0编译的:#includestdio.h#includemalloc.h#in

问一个一元多项式计算器的加减问题,,
这是整个程序,用VC6.0编译的:#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include <conio.h>
#define null 0
typedef struct polynode
{
      int coef;
      int exp;
      struct polynode *next;
}node;

node *create()
{
     node *h,*r,*s;
     int c,e;
     h=(node*)malloc(sizeof(node));
     r=h;
     printf("coef:");
     scanf("%d",&c);
     printf("exp: ");
     scanf("%d",&e);
     while(c!=0)
    {
          s=(node*)malloc(sizeof(node));
          s->coef=c;
          s->exp=e;
          r->next=s;
          r=s;
          printf("coef:");
          scanf("%d",&c);
          printf("exp: ");
          scanf("%d",&e);
    }
    r->next=NULL;
    return(h);
}
void arrange(node *pa) 

    node *h=pa,*p,*q,*r; 
    for(p=pa;p->next!=NULL;p=p->next); 
    r=p; 
    for(h=pa;h->next!=r;)
    { 
        for(p=h;p->next!=r&&p!=r;p=p->next) 
            if((p->next)->exp>(p->next->next)->exp) 
            { 
                q=p->next->next; 
                p->next->next=q->next; 
                q->next=p->next; 
                p->next=q; 
            } 
            r=p;    
    } 
}  
void neipai(node *head)
{ node *p,*q,*r,*Q;
   p=head; 
    if(head->next->next!=NULL) 
       { 
        for(q=p->next;q!=NULL;q=q->next)
            for(p=q->next,r=q;p!=NULL;) 
                if(q->exp==p->exp) 
                  { 
                    q->coef=q->coef+p->coef; 
                    r->next=p->next; 
                    Q=p;p=p->next; 
                    free(Q); 
                  } 
                else 
                 { 
                    r=r->next; 
                    p=p->next; 
                 } 
      } }
void insert(node *head,node *s) 

    node *pre,*p;
    pre=head;         
    p=pre->next;       
    while(p!=NULL) 
    { 
        if(p->exp > s->exp) break; 
        pre=p;     
        p=p->next; 
    } 


    s->next=p;    
    pre->next=s; 

node *copyList(node *head)
{
    node *l = NULL, *newHead;
    newHead = (node *) malloc(sizeof(node));
    newHead->next = NULL;
    head = head->next;
    while (head != NULL)
    {
l = (node *) malloc(sizeof(node));
l->coef = head->coef;
l->exp = head->exp;
insert(newHead, l);
        head = head->next;
    }
    return newHead;
}
void print(node *p) 
{                                                                                                      
    while(p->next!=NULL)
    {   
        p=p->next;
        printf("     %d*x^%d",p->coef,p->exp);   
           
    }
}  

void polyadd(node *ha, node *hb)
{
       node *p,*q,*pre,*temp;
       int sum;
       p=ha->next;
       q=hb->next;
       pre=ha;    
       while(p!=NULL&&q!=NULL) 
      {
           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     
                 {
                       temp=p->next;free(p);p=temp;
                       temp=q->next;free(q);q=temp;
                 }
           }
          else if(p->exp<q->exp)           
            {
                   pre->next=p;      
                   pre=pre->next;
                   p=p->next;
            }                     
          else
            {
                pre->next=q;  
                pre=pre->next;
                q=q->next;
          }
    }


    if(p!=NULL)  
           pre->next=p;
    else       
           pre->next=q;  
}  
void polysub(node *ha,node *hb) 
{
       node *p,*q,*pre,*temp,*x;
       int sum;
       p=ha->next;
       q=hb->next;
       x=q;
       pre=ha;
       while(x!=null)
{ x->coef=-x->coef;
          x=x->next;}
       while(p!=NULL&&q!=NULL)
      {
           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
                 {
                       temp=p->next;free(p);p=temp;
                       temp=q->next;free(q);q=temp;
                 }
           }
          else if(p->exp<q->exp)
            {
                   pre->next=p;
                   pre=pre->next;
                   p=p->next;
            }
          else
            {
                pre->next=q;
                pre=pre->next;
                q=q->next;
          }
    }
    if(p!=NULL)
           pre->next=p;
    else
           pre->next=q;
}
void main()      
{
      node *ha,*hb,*hc,*hd;
      printf("please input the coef and exp of ha:\n");
      ha=create(); 
      arrange(ha);
      neipai(ha);
      hc=copyList(ha);
      print(ha);
      printf("\n");
      printf("please input the coef and exp of hb:\n");
      hb=create();
      arrange(hb);
      neipai(hb);
      hd=copyList(hb);
      print(hb);
      printf("\n");
      printf("add is :\n");
      polyadd(ha,hb);
      print(ha);
      printf("\n");
      printf("sub is :\n");
      polysub(hc,hd);
      print(hc);
      getch();


}
我只看得懂加法我是怎么弄得,,减法是怎么操作的,求来个大神给我指导一下。。。
[解决办法]
抱歉,第一种方案是

一种方案,不管某一项系数,是否为零,都存储该项,不存储任何指数,
项数 =  最高项的指数 + 1
各项按照升序,或者降序存储。
同次项顺次相加,相减。
如果是项数少的减多的,那么较长的多项式,高次项,直接取相反数。其他项顺序相减

   an x^n + .... + am x^m      +....+ a1     x    + a0
+)                 bm x^m      +....+ b1     x    + b0 
---------------------------------------------------------     
   an x^n+.......+ (am+bm) x^m +.....(a1+b1) x +(a0+b0)
================================================================
   an x^n + .... + am x^m      +....+ a1     x    + a0
-)                 bm x^m      +....+ b1     x    + b0 
---------------------------------------------------------     
  an x^n+.......+ (am-bm) x^m +.....(a1-b1) x +(a0-b0) 
===============================================================
                   am x^m      +....+ a1     x    + a0
-) bn x^n+.......+ bm x^m      +....+ b1     x    + b0 
---------------------------------------------------------     
  -bn x^n+.......+(am-bm) x^m +.....+(a1-b1) x +(a0-b0)

另一种方案,同时存储指数和系数
如果存储时候已经排序,病合并同类项,
那么可以顺序比较指数,相同者系数相加,相减。

如果减数指数较高,减数中,没有和被减数相减的项,系数取为相反数,作为差的同一指数的项
计算中,结果为零的项,直接删除。
   

热点排行