zoukankan      html  css  js  c++  java
  • 一元多项式相加

    描述:

    对于两个一元多项式,如果需要对他们进行多项式相加操作,常见的两种思路如下:(1)对于一个多项式,保存其最高项次数HighPowder,以及一个该多项式对应次数分别为0-HighPowder的各项的系数的数组()。(2)多项式中系数不为零的每一项,保存其系数与该项的次数。下面分别用这两种思路实现一元多项式加法操作。

    思路一(数组实现):

    数据结构定义:

    1 typedef struct Poly
    2 {
    3     int CoeffArray[11];
    4     int HighPower;
    5 } *Polynomial;

    实现:

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 typedef struct Poly
     5 {
     6     int CoeffArray[11];
     7     int HighPower;
     8 } *Polynomial;
     9 
    10 void ZeroPolynomial(Polynomial Poly)
    11 {
    12     int i;
    13     for(i = 0; i < 11; i++)
    14     {
    15         Poly->CoeffArray[i] = 0;
    16     }
    17     Poly->HighPower = 0;
    18 }
    19 
    20 void AddPolynomial(Polynomial Poly1,Polynomial Poly2, Polynomial PolySum)
    21 {
    22     int i;
    23     ZeroPolynomial(PolySum);
    24     PolySum->HighPower = Poly1->HighPower > Poly2->HighPower?
    25         Poly1->HighPower:Poly2->HighPower;
    26     for(i = PolySum->HighPower; i >= 0 ; i--)
    27     {
    28         PolySum->CoeffArray[i] = Poly1->CoeffArray[i] + Poly2->CoeffArray[i];
    29     }
    30 }
    31 
    32 int main(void)
    33 {
    34     int i,j,k;
    35     Polynomial P1,P2,Sum;
    36     P1 = malloc(sizeof(struct Poly));
    37     P2 = malloc(sizeof(struct Poly));
    38     Sum = malloc(sizeof(struct Poly));
    39     //初始化
    40     ZeroPolynomial(P1);
    41     ZeroPolynomial(P2);
    42     P1->HighPower = 10;
    43     for(i = 10; i >= 0; i--)
    44     {
    45         P1->CoeffArray[i] = i;
    46     }
    47     
    48     P2->HighPower = 8;
    49     for(j = 8; j >=0; j--)
    50     {
    51         P2->CoeffArray[j] = j;
    52     }
    53     P2->CoeffArray[8] = 8;
    54     AddPolynomial(P1,P2,Sum);
    55 
    56     printf("The high power of the Polynomial is %d
    ",Sum->HighPower);
    57     for(k = 0; k <= 10; k++)
    58     {
    59         printf("The Coeff of power %d is %d
    ",k,Sum->CoeffArray[k]);
    60     }
    61 
    62     return 0;
    63 }

    它适合大部分项都有的稠密多项式。

    思路二(单链表实现):

    数据结构定义:

    1 typedef struct PolyNode *PtrToNode;
    2 
    3 //定义链表节点,也就是多项式中的某一项;
    4 typedef struct PolyNode
    5 {
    6     int Coeff;
    7     int Exponent;
    8     PtrToNode Next;
    9 } PolyNode;

     

    实现:

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 
      4 typedef struct PolyNode *PtrToNode;
      5 
      6 //定义链表节点,也就是多项式中的某一项;
      7 typedef struct PolyNode
      8 {
      9     int Coeff;
     10     int Exponent;
     11     PtrToNode Next;
     12 } PolyNode;
     13 
     14 
     15 typedef PtrToNode Polynomial;
     16 
     17 /************************************************************
     18 *多项式相加的函数:
     19 *P、Q为存储两个多项式各项的单链表(含头结点)
     20 *Sum为多项式相加结果存放的单链表
     21 *
     22 ************************************************************/
     23 void AddPolynomial(Polynomial P,Polynomial Q,Polynomial Sum)
     24 {
     25     Polynomial PIndex,QIndex,SumIndex;
     26     PIndex = P->Next;
     27     QIndex = Q->Next;
     28     SumIndex = Sum;
     29     while(!(PIndex == NULL && QIndex == NULL))
     30     {
     31         if(PIndex==NULL)
     32         {
     33             SumIndex->Next = QIndex;
     34             QIndex = QIndex->Next;
     35             SumIndex = SumIndex->Next;
     36         }
     37         else if(QIndex == NULL)
     38         {
     39             SumIndex->Next = PIndex;
     40             PIndex = PIndex->Next;
     41             SumIndex = SumIndex->Next;
     42         }
     43         else
     44         {
     45             if(PIndex->Exponent > QIndex->Exponent)
     46             {
     47                 SumIndex->Next = PIndex;
     48                 PIndex = PIndex->Next;
     49                 SumIndex = SumIndex->Next;
     50                 //continue在判断下面if条件时会有异常,类似Java
     51                 //的空引用异常
     52                 continue;
     53             }
     54             if(PIndex->Exponent == QIndex->Exponent)
     55             {
     56                 Polynomial PP = malloc(sizeof(struct PolyNode));
     57                 PP->Exponent = PIndex->Exponent;
     58                 PP->Coeff = PIndex->Coeff + QIndex->Coeff;
     59                 SumIndex->Next = PP;
     60                 PIndex = PIndex->Next;
     61                 QIndex = QIndex->Next;
     62                 SumIndex = SumIndex->Next;
     63                 continue;
     64             }
     65             if(PIndex->Exponent < QIndex->Exponent)
     66             {
     67                 SumIndex->Next = QIndex;
     68                 QIndex = QIndex->Next;
     69                 SumIndex = SumIndex->Next;
     70                 continue;
     71             }
     72         }
     73     }
     74     SumIndex->Next = NULL;
     75 }
     76 
     77 /************************************************************
     78 *遍历单链表(含头结点)函数:
     79 *P:待遍历的链表
     80 *************************************************************/
     81 void TraversePolynomial(Polynomial P)
     82 {
     83     Polynomial Tmp = P->Next;
     84     while(Tmp != NULL)
     85     {
     86         printf("Coeff is %d and Exponent is %d
    ",Tmp->Coeff,Tmp->Exponent);
     87         Tmp = Tmp->Next;
     88     }
     89 }
     90 
     91 
     92 
     93 int main(void)
     94 {
     95     Polynomial Poly1,Poly2,Poly3,Poly11,Poly22;
     96     int i,j;
     97     Poly1 = malloc(sizeof(struct PolyNode));
     98     Poly2 = malloc(sizeof(struct PolyNode));
     99     Poly3 = malloc(sizeof(struct PolyNode));
    100     Poly11 = Poly1;
    101     Poly22 = Poly2;
    102 
    103     //创建两个链表时,需要保证是按照指数递减的方式构造的
    104     for(i = 5;i >= 1;i--)
    105     {
    106         Polynomial Tmp  = malloc(sizeof(struct PolyNode));
    107         Tmp->Coeff = i;
    108         Tmp->Exponent = i;
    109         Poly11->Next = Tmp;
    110         Poly11 = Poly11->Next;
    111     }
    112     Poly11->Next = NULL;
    113     for(j = 11;j >= 3;j--)
    114     {
    115         Polynomial Tmp  = malloc(sizeof(struct PolyNode));
    116         Tmp->Coeff = j;
    117         Tmp->Exponent = j;
    118         Poly22->Next = Tmp;
    119         Poly22 = Poly22->Next;
    120     }
    121     Poly22->Next = NULL;
    122     TraversePolynomial(Poly1);
    123     printf("*****************************************
    ");
    124     TraversePolynomial(Poly2);
    125     AddPolynomial(Poly1,Poly2,Poly3);
    126     printf("*****************************************
    ");
    127     TraversePolynomial(Poly3);
    128     return 0;
    129 }

     

     

    原文链接

     

  • 相关阅读:
    今天的赢在中国推迟了,给大家推荐个视频,看看什么是真正的中华武术
    赢在中国080312
    盛大(上海)诚聘软件测试人员
    jQuery入门[2]-选择器
    阿里巴巴诚信通成为《赢在中国》的实战项目,要花多少钱?--《赢在中国》(20080408)
    唐僧晒书
    用于生成网页、WAP、JS中文编码的Unicode编码工具
    jQuery入门[5]-AJAX
    中国哲学(一)
    20071212公映的《色即是空2》(sex is zero 2)字幕文件
  • 原文地址:https://www.cnblogs.com/xjtuchenpeng/p/4977779.html
Copyright © 2011-2022 走看看