第二章线性表—— 一元多项式的表示和相加(7)

1 一元多项式的表示

 一元多项式  p(x)=p0+p1x+p2x2+ … +pnxn ,由n+1个系数唯一确定。

则在计算机中可用线性表(p0 ,p1 ,p2 ,… ,pn )表示。

既然是线性表,就可以用顺序表和链表来实现。两种不同实现方式的元素类型定义如下

 1 (1)顺序存储表示的类型
 2 typedef struct
 3 {  float  coef;   /*系数部分*/
 4 int    expn;   /*指数部分*/
 5 } ElemType ;
 6 
 7 
 8 
 9 (2)链式存储表示的类型
10 typedef struct ploy
11 {   float coef ;    /*系数部分*/
12 int   expn ;   /*指数部分*/
13 struct ploy  *next ;
14 } Ploy ;

2 一元多项式的相加

不失一般性,设有两个一元多项式: P(x)=p0+p1x+p2x2+ … +pnxn ,

Q(x)=q0+q1x+q2x2+ … +qmxm (m<n) R(x)=P(x)+ Q(x) R(x)

由线性表R((p0+q0) ,(p1+q1) ,(p2+q2) , … ,(pm+qm) , … , pn)唯一表示。

⑴ 顺序存储表示的相加 线性表的定义

1 typedef  struct 
2 {   ElemType  a[MAX_SIZE] ; 
3 int    length ;
4 }Sqlist  ;

用顺序表示的相加非常简单。

访问第5项可直接访问:L.a[4].coef , L.a[4].expn (2) 链式存储表示的相加

 

(2) 链式存储表示的相加

当采用链式存储表示时,根据结点类型定义,

凡是系数为0的项不在链表中出现,从而可以大大减少链表的长度。

 

一元多项式相加的实质是:

指数不同: 是链表的合并。

指数相同: 系数相加,和为0,去掉结点,和不为0,修改结点的系数域。

算法之一: 就在原来两个多项式链表的基础上进行相加,相加后原来两个多项式链表就不在存在。

当然再要对原来两个多项式进行其它操作就不允许了。

 1 算法描述
 2 Ploy  *add_ploy(ploy  *La, ploy  *Lb)
 3    /*  将以La ,Lb为头指针表示的一元多项式相加  */
 4 {   ploy  *Lc , *pc , *pa , *pb ,*ptr ;   float  x ;
 5 Lc=pc=La ; pa=La->next ; pb=Lb->next ;
 6 while (pa!=NULL&&pb!=NULL)
 7 {  if  (pa->expn<pb->expn)
 8    {  pc->next=pa ; pc=pa ; pa=pa->next ;    }
 9        /*  将pa所指的结点合并,pa指向下一个结点  */
10 if  (pa->expn>pb->expn)
11    {  pc->next=pb ; pc=pb ;  pb=pb->next ;    }
12         /*  将pb所指的结点合并,pb指向下一个结点  */
13 else
14     {  x=pa->coef+pb->coef ;
15         if  (abs(x)<=1.0e-6)
16              /*  如果系数和为0,删除两个结点  */
17             {  ptr=pa ; pa=pa->next ;  free(ptr) ;
18                 ptr=pb ; pb=pb->next ;  free(ptr) ;  }
19         else      /*  如果系数和不为0,修改其中一个结点的系数域,删除另一个结点  */ 
20              {   pc->next=pa ; pa->coef=x ;
21                  pc=pa ; pa=pa->next ;
22                  ptr=pb ; pb=pb->next ; free(pb) ;   
23              }
24 }
25 }     /* end of while */ 
26 if  (pa==NULL)  pc->next=pb ;
27 else  pc->next=pa ;
28 return (Lc) ;  
29 }

 

算法之二:

对两个多项式链表进行相加,生成一个新的相加后的结果多项式链表,

原来两个多项式链表依然存在,不发生任何改变,如果要再对原来两个多项式进行其它操作也不影响。

 1 算法描述
 2   Ploy  *add_ploy(ploy  *La, ploy  *Lb)
 3      /*  将以La ,Lb为头指针表示的一元多项式相加,生成一个新的结果多项式  */
 4   {   ploy  *Lc , *pc , *pa , *pb , *p ;   float  x ;
 5   Lc=pc=(ploy *)malloc(sizeof(ploy)) ; 
 6  pa=La->next ; pb=Lb->next ;
 7   while (pa!=NULL&&pb!=NULL)
 8   {  if  (pa->expn<pb->expn)
 9      {  p=(ploy *)malloc(sizeof(ploy)) ;
10         p->coef=pa->coef ; p->expn=pa->expn ;
11         p->next=NULL ; 
12     /*  生成一个新的结果结点并赋值  */
13         pc->next=p ; pc=p ; pa=pa->next ;
14      }
15         /*  生成的结点插入到结果链表的最后,pa指向下一个结点  */
16 if  (pa->expn>pb->expn)
17     {  p=(ploy *)malloc(sizeof(ploy)) ;
18        p->coef=pb->coef ; p->expn=pb->expn ;
19        p->next=NULL ; 
20               /*  生成一个新的结果结点并赋值  */
21         pc->next=p ; pc=p ; pb=pb->next ;    
22       }     /*  生成的结点插入到结果链表的最后,pb指向下一个结点  */
23  if  (pa->expn==pb->expn) 
24      {  x=pa->coef+pb->coef ;
25          if  (abs(x)<=1.0e-6)
26               /*  系数和为0,pa, pb分别直接后继结点  */
27              {  pa=pa->next ; pb=pb->next ;   }
28          else    /*  若系数和不为0,生成的结点插入到结果链表的最后, pa, pb分别直接后继结点  */
29               {  p=(ploy *)malloc(sizeof(ploy)) ;
30                   p->coef=x ; p->expn=pb->expn ;
31                  p->next=NULL ; 
32                          /*  生成一个新的结果结点并赋值  */
33                   pc->next=p ; pc=p ; 
34                   pa=pa->next ; pb=pb->next ;  
35             } 
36       }
37  }     /* end of while */ 
38 if  (pb!=NULL)  
39  while(pb!=NULL)
40  {   p=(ploy *)malloc(sizeof(ploy)) ;
41       p->coef=pb->coef ; p->expn=pb->expn ;
42      p->next=NULL ; 
43               /*  生成一个新的结果结点并赋值  */
44          pc->next=p ; pc=p ; pb=pb->next ;
45  } 
46 if  (pa!=NULL)  
47 while(pa!=NULL)
48 {   p=(ploy *)malloc(sizeof(ploy)) ;
49      p->coef=pb->coef ; p->expn=pa->expn ;
50      p->next=NULL ; 
51              /*  生成一个新的结果结点并赋值  */
52         pc->next=p ; pc=p ; pa=pa->next ;
53 } 
54 return (Lc) ;  
55 }

 

上一篇:Node: 将时间戳转换成日期并分组


下一篇:$.ajaxSettings.async = false 讲ajax设置为同步