一元多项式相加

描述:

对于两个一元多项式,如果需要对他们进行多项式相加操作,常见的两种思路如下:(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\n",Sum->HighPower);
57     for(k = 0; k <= 10; k++)
58     {
59         printf("The Coeff of power %d is %d\n",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\n",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("*****************************************\n");
124     TraversePolynomial(Poly2);
125     AddPolynomial(Poly1,Poly2,Poly3);
126     printf("*****************************************\n");
127     TraversePolynomial(Poly3);
128     return 0;
129 }

原文链接

时间: 2024-10-09 09:38:23

一元多项式相加的相关文章

【链表的应用】一元多项式相加及相乘 和对问题的分析

一元多项式相乘,需要将一个多项式的每一项的指数与另一个多项式的每一项的指数相乘. 代码实现: 头文件以及函数声明: #ifndef _POLYN_H #define _POLYN_H #include<iostream> #include <malloc.h> #include <stdio.h> using namespace std; #define _CRT_SECURE_NO_DEPRECATE #define NULL 0 typedef struct NOD

链表实现一元多项式相加

一元多项式相加,多项式相加 #include<stdlib.h> #include<stdio.h> typedef struct pnode { float coef; //系数域 int exp; //指数域 struct pnode *next; //指针域 }PolyNode; PolyNode *PolyAdd(PolyNode *A,PolyNode *B) { int i,j,k; float x; PolyNode *q1,*q2,*ptr,*q; /*q1指向A,

线性表之单链表实现一元多项式相加

一元多项式定义: 设a0,a1,a2,-,an-1,an都是数域F中的数(注:1,2,--,n-1,n均为a的下角标),n是非负整数,那么表达式 anx^n +an-1x^(n-1)+-+a2x^2 +a1x + a0(an≠0) (1) 叫做数域F上一个文字x的多项式或一元多项式.在多项式(1)中,a0叫做零次多项式或常数项,a1x叫做一次项,一般,aix叫做i次项,ai叫做i次项的系数.一元多项式用符号f(x),g(x),-来表示. 说一下思路,利用带有两个数据元素的链表实现加法运算,数据域

一元多项式相加(链式实现)

1 #include<stdio.h> 2 #include<stdlib.h> 3 4 typedef struct LNode //结点类型 5 { 6 int index; //指数 7 int coe; //系数 8 struct LNode *next; 9 }LNode,*Link; 10 typedef struct //列表类型 11 { 12 Link head,tail; //头指针和尾指针 13 int len; 14 }LinkList; 15 16 int

两个一元多项式相加

程序运行结果如下: <span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;"># include<stdio.h></span> # include<stdlib.h> struct node { int exp; float coef; struct node *next; /*指向结构体指

一元多项式的表示及相加

符号多项式的操作,已经成为表处理的典型用例,在数学上,一个一元多项式Pn(x)可按升幂写成: Pn(x)=p0+p1x1+p2x2+p3x3+…+pnxn 它由n+1个系数惟一确定.因此,在计算机里,它可用一个线性表P来表示: P=(p0,p1,p2,p3,…,pn) 每一项的指数i隐含在其系数pi的序号里. 本节内容将主要讨论如何利用线性链表的基本操作为实现一元多项式的运算. 利用线性链表的基本操作来实现一元稀疏多项式的运算,实现抽象数据类型Polynomial. ADT Polynomial

一元多项式的加减乘法

输入一元多项式的参数,然后根据一元多项式加法减法乘法的计算法则,求解最终结果.用到了结构体,指针,操作的时候要注意. 不多说,上代码: 1 #include <stdio.h> 2 #include <malloc.h> 3 4 typedef struct node{ 5 float coef; 6 int expn; 7 struct node *next; 8 }PLOY; 9 10 void start(){ 11 printf("****************

数据结构课程设计之一元多项式的计算

数据结构不是听会的,也不是看会的,是练会的,对于写这么长的代码还是心有余也力不足啊,对于指针的一些操作,也还是不熟练,总出现一些异常错误,对于数据结构掌握还是不够啊,还是要多练,这个课程设计做的还是有点粗糙,还有待改进啊!! 对代码有进行了一下改进,增加了排序的模块:可能还存在着一下小bug,发现了再更新:减法还可以写的更简便一点. <pre name="code" class="cpp">#include <stdio.h> #includ

线性表在一元多项式运算中的应用

实验题1-1 多项式运算 [问题描述]有两个指数递减的一元多项式,写一程序先求这两个多项式的和,再求它们的积. [提示] 用带表头结点的单链表作为多项式的存储表示:要建立两个单链表:多项式相加就是要把一个单链表中的结点插入到另一个单链表中去,要注意插入.删除操作中指针的正确修改. #include <iostream> using namespace std; int k = 1; typedef struct { float coef; //系数 int expn; //指数 }term;