多项式的四则运算(数据结构)

合集下载

多项式运算初中数学知识点之多项式的四则运算法则

多项式运算初中数学知识点之多项式的四则运算法则

多项式运算初中数学知识点之多项式的四则运算法则多项式是数学中一个重要的概念,也是初中数学中需要掌握的知识点之一。

在多项式的学习中,四则运算是必不可少的一部分。

本文将介绍多项式的四则运算法则,以及它们的应用。

一、多项式的基本概念首先,我们来回顾一下多项式的基本概念。

多项式是由一系列代数式通过加法和减法运算组合而成的表达式。

它的形式可以表示为:P(x) = anxn + an-1xn-1 + … + a2x2 + a1x + a0其中,P(x)为多项式的表示形式,an, an-1, …, a1, a0为常数项,n为多项式的次数,x为变量。

二、多项式的四则运算法则1. 多项式的加法运算多项式的加法运算规则非常简单,只需要将对应的系数相加即可。

例如,对于两个多项式 P(x) = 3x^2 + 2x + 1 和 Q(x) = 2x^2 + 4x + 3,它们的和为:P(x) + Q(x) = (3x^2 + 2x + 1) + (2x^2 + 4x + 3)= 3x^2 + 2x^2 + 2x + 4x + 1 + 3= 5x^2 + 6x + 42. 多项式的减法运算多项式的减法运算也遵循类似的规则,即将对应的系数相减。

例如,对于两个多项式 P(x) = 3x^2 + 2x + 1 和 Q(x) = 2x^2 + 4x + 3,它们的差为:P(x) - Q(x) = (3x^2 + 2x + 1) - (2x^2 + 4x + 3)= 3x^2 - 2x^2 + 2x - 4x + 1 - 3= x^2 - 2x - 23. 多项式的乘法运算多项式的乘法运算是比加法和减法复杂一些的运算。

多项式的乘法运算需要使用分配律的原理,将每一项相乘后再进行合并。

例如,对于两个多项式 P(x) = 3x + 2 和 Q(x) = 2x^2 + 4x + 3,它们的乘积为:P(x) * Q(x) = (3x + 2) * (2x^2 + 4x + 3)= 3x * 2x^2 + 3x * 4x + 3x * 3 + 2 * 2x^2 + 2 * 4x + 2 * 3= 6x^3 + 12x^2 + 9x + 4x^2 + 8x + 6= 6x^3 + 16x^2 + 17x + 64. 多项式的除法运算多项式的除法运算是最为复杂的一种运算,需要使用长除法的方法进行计算。

多项式的四则运算(数据结构)

多项式的四则运算(数据结构)

数据结构07082018用链表实现多项式的四则运算——数据结构第二次上机作业班级07082姓名丁敏学号07082018上机时间2011年3月31日报告时间:2011年4月5日实验目的:熟练使用指针,熟悉链表及其操作;利用链表解决实际问题要求:能够实现任意项有理多项式的加、减、乘、除、求模以及幂运算多项式的除法注意除不尽的处理测试用例尽可能多,且说明用例的必要性用例必须包含一个自己系数为自己的学号摘要:多项式的四则运算问题是个很有趣的问题,它类似于有理数的四则运算,但又不仅仅于此.本篇课程论文重点研究了数据结构中多项式的四则运算问题。

本论文的程序是通过Microsoft Visual Studio 2010编译,来解决多项式的加、减、乘、除四则运算问题,从而达到了解数据结构的实用性及程序语言对于数学问题研究的重要性的目的。

正文:0需求分析:0.1问题描述编写程序来实现多项式的四则运算。

0.2基本要求⑴输入多项式的系数与指数,输入值为float型,输出值为float型;⑵能够完成多项式之间的四种计算方式(+、-、*、/)。

0.3函数说明typedef struct PolyNode:结构体变量,定义 int型指数和float 系数;PolyList CreatePolyList():创建多项式列表,返回头指针;DisplayPolyList(PolyList Poly):显示多项式;DestroyPolyList(PolyList L):释放链表所用存储空间;MergePoly(PolyList Poly):将多项式合并同类项;SortPoly(PolyList Poly):将多项式按升序排列;PolyList PolyAdd(PolyList PolyA , PolyList PolyB):多项式相加,返回和多项式链表头指针;PolyList PolySub(PolyList polyA , PolyList polyB):多项式相减,返回差多项式链表头指针;PolyList PolyMutiply(PolyList PolyA , PolyList PolyB):多项式相乘,结果由Poly c返回;PolyList PolyDivide(PolyList PolyA , PolyList PolyB):多项式相除,商和余数用系数为0的结点分开。

四则运算 数据结构

四则运算  数据结构

//用数据结构编写简单四则运算(+,-,*,/)//整体思路(可带多个括号,及小数)//建立一个单向链表//运算过程中运算符优先级# = ) + - * / (// 0 0 1 2 2 3 3 4// while(p->data && GetTop(OPTR))// { (p->data)// if(数字) 进栈OVS// else if(GetTop(OPTR)!='(' && p->data!=')')// {// if(GetTop(OPTR) 低于p->data 优先级)// 进栈OPTR// else// while(GetTop(OPTR) 高于p->data 优先级) // 运算// }// else 删去左右括号// }//字符转换为数字(用一个数组表示数字)//#include<stdio.h>#include<math.h>#include<conio.h>#include<io.h>#include<ctype.h>#include<stdlib.h>#include<string.h>#define N 5#define M 60typedef char ElemType;typedef struct node{ElemType data;struct node *next;}*LinkList, Node;typedef struct fnode{float data;struct fnode *next;}*FLinkList, FNode;LinkList BuildLink(char str[M]); //建立链表LinkList Push_char(LinkList L, ElemType data); //进入符号栈int IsEmpty(LinkList L); //栈是否为空ElemType GetTop(LinkList L); //取出符号栈顶栈不删除ElemType Pop_char(LinkList L, ElemType *x); //取出符号栈顶栈删除float Pop_float(FLinkList L, float *x); //取出数字栈顶栈删除int BracketMatch(char *e); //判断括号匹配float Execute(float m, char op, float n); //进行简单运算int Compare(char a); //比较运算符优先级float ExpEvaluation(LinkList L); //进行(可以括号,小数)的运算int Get_number(char ch); //字符转换为数字int GetNumber_1(int b[N], int i); //取整数部分float GetNumber_2(int b[N], int i); //取小数部分void Start(){LinkList L;float x;char str[M];printf("请输入运算式('='结束)\n");gets(str); //puts(str);BracketMatch(str);L = BuildLink(str);// BracketMatch(L); printf("ok2");x = ExpEvaluation(L);printf("上式运算结果为wei:");printf("%f\n", x);}LinkList BuildLink(char str[M]){LinkList L;Node *p,*s;int i;L = (LinkList)malloc(sizeof(Node));L->next=NULL;p = L;for(i=0; str[i]; i++){s = (Node*)malloc(sizeof(Node));s->data = str[i];p->next = s;p = s;}return L;}LinkList Push_char(LinkList L, ElemType data) {Node *temp;temp = (Node*)malloc(sizeof(Node));temp->data = data;temp->next = L->next;L->next = temp;return L;}FLinkList Push_float(FLinkList OVS, float data) {FNode *temp;temp = (FNode*)malloc(sizeof(FNode));temp->data = data;temp->next = OVS->next;OVS->next = temp;return OVS;}int IsEmpty(LinkList L){if(L->next == NULL)return 1;elsereturn 0;}ElemType GetTop(LinkList L){ElemType *x;Node *p;p = L->next;x = &p->data;*x = p->data;return *x;}ElemType Pop_char(LinkList L, ElemType *x){Node *p;p = L->next;*x = p->data;L->next = p->next;free(p);return *x;}float Pop_float(FLinkList L, float *x){FNode *p;p = L->next;*x = p->data;L->next = p->next;free(p);return *x;}int BracketMatch(char *e){int i,count=0,flag=1;char c;for(i=0;c=e[i];i++){if((c>='0'&&c<='9')||c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='.'||c=='#' || c=='=');else{system("cls");printf("表达式中含非法字符,请重新输入:");Start();}if(count==0&&c==')'){system("cls");printf("右括号多余,请重新输入:");Start();}else if(c=='(')count++;else if(c==')')count--;}if(count!=0){system("cls");printf("左括号多余,请重新输入:");Start();}return flag;}float Execute(float m, char op, float n){float x;switch(op){case'+': x = m + n; break;case'-': x = n - m; break;case'*': x = m * n; break;case'/':{if(m)x = n / m;else{system("cls");printf("式中除数为零!!请重新输入\n");Start();}break;}default: break;}return x;}int Compare(char a){if(a == '#' || a == '=') return 0;else if(a == ')') return 1;else if(a == '+' || a == '-') return 2;else if(a == '*' || a == '/') return 3;else if(a == '(') return 4;else{system("cls");printf("输入运算符错误!!请重新输入\n");Start();return -1;}}int Get_number(char ch){int x;switch(ch){case'0': x = 0; break;case'1': x = 1; break;case'2': x = 2; break;case'3': x = 3; break;case'4': x = 4; break;case'5': x = 5; break;case'6': x = 6; break;case'7': x = 7; break;case'8': x = 8; break;case'9': x = 9; break;default: break;}return x;}int GetNumber_1(int b[N], int i) {int j,k,t;int x=0;for(k=0; k<=i; k++){t = 1;for(j=1; j<i-k; j++)t = 10*t;x = x+b[k]*t;}return x;}float GetNumber_2(int b[N], int i) {int j,k;float x=0,t;for(k=0; k<=i; k++){t = (float)(0.1);for(j=0; j<i; j++)t = (float)(0.1*t);x = x+b[k]*t;}return x;}float ExpEvaluation(LinkList L) {LinkList OPTR;FLinkList OVS;int Dkey=0,key=1;int i,j;int x_1;float x,x_2,m,n;int b[N],a[N];Node *p;char op,ch;p = L->next;OPTR = (LinkList)malloc(sizeof(Node));OVS = (FLinkList)malloc(sizeof(FNode));OVS->next=NULL;Push_char(OPTR,'#');while(p->data!= '=' || GetTop(OPTR)!= '#'){if('0'<=p->data && p->data<='9'){i = 0;while('0'<=p->data && p->data<='9'){a[i] = Get_number(p->data);p = p->next;i++;}a[i] = 0;x_1 = GetNumber_1(a,i);if(p->data == '.'){j = 0;Dkey = 1;p = p->next;while('0'<=p->data && p->data<='9'){b[j] = Get_number(p->data);p = p->next;j++;}b[j] = 0;x_2 = GetNumber_2(b,j);}if(Dkey)Dkey = 0;elsex_2 = 0;x = x_1 + x_2;Push_float(OVS, x);}else{if(GetTop(OPTR)!='(' || p->data!=')'){if(GetTop(OPTR) == '(')Push_char(OPTR, p->data);else if((Compare(p->data) - Compare(GetTop(OPTR))) > 0)Push_char(OPTR, p->data);elseif((Compare(p->data) - Compare(GetTop(OPTR))) <= 0){key=0;Pop_char(OPTR, &op);Pop_float(OVS, &m);Pop_float(OVS, &n);x = Execute(m, op, n);Push_float(OVS, x);}}else if(OVS->next != NULL)Pop_char(OPTR,&ch);else{system("cls");printf("输入错误!! 括号中无数字请重新输入\n");Start();}if(key==1)p = p->next;if(key==0)key=1;}}Pop_float(OVS,&x);return x;}void main(){Start();}。

41多项式四则运算

41多项式四则运算

4-1多項式的四則運算例1. 下列何者為x 的多項式: (A)12++x x (B)62132+-x x (C)2122++xx (D)2sin +x (E)20。

類1. 下列何者表x 的多項式? (A)π+x 3 (B)2312++x x (C)4+x(D)532++x yx (E)43122+++x x 。

Ans: 1. (A)(B)(D)。

例2. 設e dx cx bx ax x f ++++=234)(為整係數多項式,若11413=-+++c b a 求)(x f 之次數及領導係數。

類1. 設f ex dx cx bx ax x p ++++++=2345)(為整係數多項式,若26514132=++-++++a b c d e f ,則)(x p 之領導係數為 ,次數為 次。

類2. 設25)3()2()(246-+-+++=x x r x q px x f 為x 的二次多項式,則數對=),(q p ,r 有何限制? Ans: 1. 1,3,2. 3),2,0(≠-r 。

例3. 設4)1(7)1(2)1(4)(23++-+-+=x x x x f ,d x c x x b x x x a x g ++++-+++-=)2()2)(1()2)(1)(1()(,求d c b a ,,,?類1. 設c x b x x a x x x m x x +-+--+---+=)1()2)(1()3)(2)(1)((4,則=+++m c b a 。

Ans: 1. 47。

例4. (1)754)(23+-=x x x f ,3656)(234-++-=x x x x x g ,求)(3)(x g x f -?(2) 52)(3-+=x x x f ,243)(x x x g +-=,求)()(x g x f ⋅與)1(2+x g 。

例5. )13223)(2322(234562345++++++--+-+x x x x x x x x x x x 展開式中,求:(1)7x 項係數,(2)9x 項係數,(3)各項係數和。

数据结构——四则运算

数据结构——四则运算

数据结构——四则运算要进⾏⼀个表达式的计算,⼀个关键的就是括号匹配问题,现在使⽤栈进⾏实现计算表达式的值,可以作为实现⼀个简单四则运算计算器核⼼部分。

根据栈的特性(先进后出),所以决定通过把输⼊的表达式转换为后缀表达式,通过后缀表达式进⾏计算。

实现⽅法:1.⾸先定义两个栈,⼀个⽤于存放操作符,⼀个⽤于存放操作数。

1 #include<stdio.h>2 #include<string>3 #include<conio.h>4#define MAXSIZE 1005 typedef float datatype;67 typedef struct8 {9 datatype a[MAXSIZE];10int top;11 }sequence_stack;1213 typedef struct14 {15char b[MAXSIZE];16int top;17 }SeqStack;2.需要两个数组,⼀个⽤于存放输⼊的中缀表达式,⼀个⽤于存放将中缀表达式转换后的后缀表达式。

将中缀表达式转换为后缀表达式的主要代码:1int operation(char op)//判断是否为操作符2 {3switch(op)4 {5case'+':6case'-':7case'*':8case'/':return1;9default:return0;10 }11 }12int priority(char op)//判断操作符的优先级13 {14switch(op)15 {16case'#':return -1;17case'(':return0;18case'+':19case'-':return1;20case'*':21case'/':return2;22default: return -1;23 }24 }25//将中缀表达式转换为后缀表达式26void postfix(char e[],char f[],SeqStack *s,sequence_stack *s1)27 {28int i=0,j=0;29int t;30 push_SeqStack(s,'#');31while(e[i]!='#')32 {33if((e[i]>='0'&&e[i]<='9')||e[i]=='.')34 f[j++]=e[i];35else if(e[i]=='(')36 {37 push_SeqStack(s,e[i]);38 }39else if(e[i]==')')40 {41 t=s->top-1;42while(s->b[t]!='(')43 {44 f[j++]=s->b[--s->top];45 t=s->top-1;46 }47 s->top--;48 }49else if(operation(e[i]))50 {51 f[j++]=' ';52while(priority(s->b[s->top-1])>=priority(e[i]))53 f[j++]=s->b[--s->top];54 push_SeqStack(s,e[i]);55 }56 i++;57 }58while (s->top)f[j++]=s->b[--s->top];59 {}60 evalpost(f,s1);61 }3.把存放后缀表达式的数组传递给计算后表达式的函数;计算后缀表达式的值主要代码:1float readnumber(char f[],int *i)//将数字字符串转变为数2 {3float x=0.0;4int k=0;5while(f[*i]>='0'&&f[*i]<='9')6 {7 x=x*10+(f[*i]-'0');8 (*i)++;9 }10if(f[*i]=='.')11 {12 (*i)++;13while(f[*i]>='0'&&f[*i]<='9')14 {15 x=x*10+(f[*i]-'0');16 (*i)++;17 k++;18 }19 }20while(k!=0)21 {22 x=x/10.0;23 k=k-1;24 }25return (x);26 }27void evalpost(char f[],sequence_stack *s)28 {29int i=0;30float x1,x2;31while(f[i]!='#')32 {33if(f[i]>='0'&&f[i]<='9')34 {35 push_sequence_stack(s,readnumber(f,&i));36 }37else if(f[i]==' ')38 i++;39else if(f[i]=='+')40 {41 x2=s->a[--s->top];42 x1=s->a[--s->top];43 push_sequence_stack(s,x1+x2);44 i++;45 }46else if(f[i]=='-')47 {48 x2=s->a[--s->top];49 x1=s->a[--s->top];50 push_sequence_stack(s,x1-x2);51 i++;52 }53else if(f[i]=='*')54 {55 x2=s->a[--s->top];56 x1=s->a[--s->top];57 push_sequence_stack(s,x1*x2);58 i++;59 }60else if(f[i]=='/')61 {62 x2=s->a[--s->top];63 x1=s->a[--s->top];64 push_sequence_stack(s,x1/x2);65 i++;66 }67 }68 }最后,只要调⽤计算后的结果将存放在操作数栈的第⼀个位置,并将结果传递给需要显⽰的地⽅(可以放到⾃⼰的程序中显⽰结果的地⽅),显⽰出结果就没问题了。

多项式的加减乘除运算

多项式的加减乘除运算

多项式的加减乘除运算多项式是数学中常见的代数表达式形式,由多个项组成。

每个项由系数和指数两部分组成,例如3x^2和5y表示两个多项式的项。

多项式的加减乘除运算是数学中重要的概念,本文将详细介绍多项式的加减乘除运算规则及相应的例子。

一、多项式的加法运算多项式的加法运算是将两个多项式按照相同指数的项进行合并。

在进行加法运算时,只需将对应指数的项的系数相加即可,而不同指数的项则需要保留原样。

例如,考虑以下两个多项式:P(x) = 3x^2 + 2x + 5Q(x) = 4x^2 - x + 3将两个多项式进行加法运算时,我们将对应指数的项的系数相加,不同指数的项保留原样。

按照这个规则,我们可以将上述两个多项式相加得到:P(x) + Q(x) = (3x^2 + 4x^2) + (2x - x) + (5 + 3)= 7x^2 + x + 8因此,P(x) + Q(x) = 7x^2 + x + 8。

二、多项式的减法运算多项式的减法运算是将两个多项式按照相同指数的项进行合并,并将减数的项的系数取负。

也就是说,我们将第二个多项式的各项的系数取相反数,然后按照相同指数的项进行合并。

考虑以下两个多项式:P(x) = 3x^2 + 2x + 5Q(x) = 4x^2 - x + 3我们将P(x) - Q(x)展开运算:P(x) - Q(x) = (3x^2 - 4x^2) + (2x + x) + (5 - 3)= -x^2 + 3x + 2所以, P(x) - Q(x) = -x^2 + 3x + 2。

三、多项式的乘法运算多项式的乘法运算是将两个多项式的各项进行配对相乘,并将同指数的各项相加。

例如,考虑以下两个多项式:P(x) = 3x^2 + 2x + 5Q(x) = 4x - 1我们将P(x) * Q(x)展开运算:P(x) * Q(x) = (3x^2 * 4x) + (3x^2 * -1) + (2x * 4x) + (2x * -1) + (5 * 4x) + (5 * -1)= 12x^3 - 3x^2 + 8x^2 - 2x + 20x - 5= 12x^3 + 5x^2 + 18x - 5所以,P(x) * Q(x) = 12x^3 + 5x^2 + 18x - 5。

多项式的加减乘除四则运算

多项式的加减乘除四则运算

多項式的加減乘除四則運算班級:座號:姓名:
五、多項式的除法運算
四、十字交乘法(三項式) 班級:座號:姓名:
2
2. x2項的係數「不是1」的十字交乘法
二、完全平方數:背1~20的平方
三、平方根的定義
四、利用方格紙畫圖,作出面積是2 平方單位、5 平方單位、18平方單位的正方形-----介紹無理數
五、非完全平方數的平方根:根號引入的必須
六、利用方格紙畫圖,作出1、2、3、4、5、……. 、n
七、正數、零、負數的平方根
(一)正數:
(二)零:
(三)負數:
八、利用標準分解式計算平方根
九、十分逼近法:求無理數的近似值
十、電算器求平方根
一元二次方程式班級:座號:姓名:
5. a x2+bx+c=0,a和b 和c是常數(、十字交乘法)
6. 綜合題
7. 應用問題。

数据结构 四则运算 C语言

数据结构 四则运算 C语言

void Merge(PolyList Poly){//和并同类项
PolyNode *p,*q,*rear,*pre,*temp;
rear=Poly;
p=Poly->next ;
while(rear->next!=NULL){
q=p->next;
pre=p;
temp=p;
while(q){
则合并
if((p->exp==q->exp)&&(p->exp1==q->exp1)&&(p->exp2==q->exp2)){ // 指 数 相 同
while(fabs(c)>1e-3){
s=(PolyNode*)malloc(sizeof(PolyNode));
s->exp=e;
s->coef=c;
s->exp1=e1;
rear->next=s;
rear=s;
if(getchar()==')')
break;
scanf("%fx^%dy^%d",&c,&e,&e1);
rear=head;
//输入多项式(含括号),出现系数为 0 强制退出
if(getchar()=='('){
scanf("%fx^%d",&c,&e);
while(fabs(c)>1e-3){
s=(PolyNode*)malloc(sizeof(PolyNode));
s->exp=e;
s->coef=c;
} printf("\n"); }

数据结构四则运算

数据结构四则运算

具体思路:根据书上的栈的四则运算的应用里的提示,是用逆波兰(后缀表达式)算法进行运算。

我们正常的四则运算式的是中缀表达式,如:3+2*4-6/3*(4-2),但是这种语言机器无法识别,必须转换成后缀表达式,如:324*+63/42-*-,然后再用栈去进行操作运算。

首先,一个四则运算式包含操作符和运算符,所以要建立两个栈去分别存储他们,存储的时候,数字可以直存储,但是运算符因为要部分先出栈进行运算,所以此时就要考虑什么时候出栈,什么时候直接进栈,此时优先级矩阵就应运而生:在运算到+,-,*,/运算符时,则用栈顶元素与当前运算符进行优先级比较:●若对应的数组元素为-1,则当前运算符(运算符编码)进栈,调整pp 指向下一个字符。

●若对应的数组元素为1,则取运算符栈顶运算符和操作数栈顶操作数进行运算,参与运算的运算符和操作数出栈,运算结果进操作数栈。

实现为:OPND[topNd-2]=OPND[topNd-2] op OPBD[topNd-1];topNd--;topTr--;如果此时topTr-1还是比此时进栈的运算符优先级大的话,则执行循环上述过程。

●若当前字符是左括号(: 则直接进栈,pp 指向下一个字符●若当前字符是右括号):进行一下情况的讨论:若栈顶是左括号,则左括号出栈,pp 指向下一个字符若栈顶是运算符,则取运算符栈顶运算符和操作数栈顶操作数进行运算,参与运算的运算符和操作数出栈,运算结果进操作数栈。

实现为:OPND[topNd-2]=OPND[topNd-2] op OPBD[topNd-1];topNd--;topTr--;Op为topTr-1的运算符。

重复该操作,直到栈顶出现左括号“(”。

若栈顶是#,则左括号和右括号不配对,结束处理,返回出错标志(0)●若当前字符为#:依次从运算符栈取出运算符和从操作数栈取出操作数进行计算,直到运算符栈的栈顶为#为止。

此时就是把运算符栈里的运算符全部输出和操作数进行运算。

多项式的定义及四则运算

多项式的定义及四则运算

多项式的定义及四则运算多项式是数学中常见的一种函数。

它由若干个单项式组成,每个单项式都是由常数项和变量的一次或多次幂组成。

例如,$x^3+3x^2+2x+1$就是一个多项式。

本文将介绍多项式的定义及其四则运算。

1. 多项式的定义在数学中,多项式的定义如下:一个多项式$f(x)$是由若干单项式相加或相减而成的。

每个单项式可以有系数和一个或多个变量的一次或多次幂。

多项式的次数是最高次单项式的次数,并且多项式中所有单项式的次数都不能超过最高次数。

例如,$x^3+3x^2+2x+1$的次数是3。

2. 多项式的四则运算(1) 加法多项式加法是指将两个多项式的各项系数对应相加,形成一个新的多项式。

例如,$(x^2+3x-4)+(2x^2+5x+1)=3x^2+8x-3$。

(2) 减法多项式减法是指将两个多项式的各项系数对应相减,形成一个新的多项式。

例如,$(x^2+3x-4)-(2x^2+5x+1)=-x^2-2x-5$。

(3) 乘法多项式乘法是指将两个多项式的每一项相乘,并将结果相加,形成一个新的多项式。

例如,$(x^2+3x-4)\times(2x^2+5x+1)=2x^4+11x^3-5x^2-7x-4$。

(4) 除法多项式除法是指将一个多项式整除另一个多项式并得到商和余数。

例如,$(2x^2+3x-4)\div(x-2)=2x+7$,余数是$-10$。

3. 多项式的常见形式多项式有几种常见的形式。

例如:(1) 一般式:$a_nx^n+a_{n-1}x^{n-1}+...+a_1x+a_0$。

(2) 二次式:$ax^2+bx+c$,其中$a,b,c$都是实数且$a\neq0$。

(3) 因式分解式:$a(x-p_1)(x-p_2)...(x-p_n)$,其中$a$是常数,$p_1,p_2,...,p_n$是不同的实数。

(4) 标准式:$y=a(x-h)^2+k$,其中$a,h,k$是实数,$a\neq0$。

多项式的四则运算

多项式的四则运算

摘要在算法程序的设计与编写过程中,根据对本题的要求分析,结合设计对象的特点,实现一元多项式的加、减、乘、除以及对多项式求导、求值的相关计算。

根据一元多项式的结构特点和运算规则。

本程序中采用了链表的存储与实现,采用链表可以很方便的对其中的结点进行插入、删除等操作。

通过链表的合并即可完成多项式的四则运算。

1 引言:1.1 待处理问题的问题背景:本题要求对从键盘上输入的任意两个一元多项式,能够分别对每个多项式进行降幂排序并输出,实现对这两个多项式的加、减、乘、除等相关运算。

在具体实现时,可采用链式存储结构将多项式中的每一项连接起来,从而表达出整个多项式,其中每一项是一个一元多项式,通过每一项系数与指数的输入设定,可以实现对整个多项式的设定,再通过建立单链表,结点来存储每一项的系数与指数,通过链表完成多项式的存储,对每个多项式分别建立一个链表,通过链表的加减乘除运算规则实现连标的合并,最终得到计算结果。

2需要完成的任务:根据题目要求,本程序需要实现对两个一元多项式的四则运算以及对多项式进行赋值求值运算、求导运算等相关计算,要求正确输出运算结果,对不满足输入要求的数据有一定的反应。

3设计:3.1核心算法的设计与说明:3.1.1 一元多项式的定义:有多个单项式的代数和就构成了多项式,一元多项式就是只含有一个变元的多项式。

所以由定义可知有n个单项式组成的一元多项式来说,它的运算是满足交换率的,所以可进行降幂排序,只需将它的所有指数相比较,然后将指数大的放前面,小的放后面即可完成排序。

3.1.2本题的核心算法:首先调用建表函数,CreatePolyn建立两个一元多项式,然后对两个一元多项式进行降幂排序,该过程的实现主要由insert()函数实现,然后调用相应的计算函数: 加(AddPolyn)、减(SubtractPolyn)、(MultiplyPolyn)、除(DevicePolyn)、导数(Derivative)、求值(ValuePolyn)。

数据结构程序设计作业——《一元多项式的四则运算》

数据结构程序设计作业——《一元多项式的四则运算》

数据结构程序设计作业——《⼀元多项式的四则运算》数据结构实验报告题⽬⼀元多项式四则运算学⽣姓名王某某专业班级测控120X班学号U2012XXXXX1 问题描述利⽤已学过的数据结构来构造⼆个存储多项式的结构,接着把输⼊,加,减,乘,除运算分成四个主要的模块:实现多项式输⼊模块、实现加法的模块、实现减法的模块、实现乘法的模块、实现除法的模块,然后各个模块⾥⾯还要分成若⼲种情况来考虑并通过函数的嵌套调⽤来实现其功能。

最后,编写main主函数以实现对多项式输⼊输出以及加、减、乘、除。

2 相关函数介绍说明(1)程序定义的数据结构类型为线性表的链式存储结构类型变量:typedef struct linknode(2)程序定义的其它函数:linnode *Sort(linnode *S);//多项式按指数从⼤到⼩排序linnode *CreateList();//创建多项式Void ShowList(linnode *head) ;//显⽰多项式linnode *Copy(linnode *copy);//拷贝多项式(因为做减法运算时会破坏原来输⼊的多项式)linnode *SearchList(linnode *head,int x);//查找函数Linnode *Mulr(linnode *s,linnode *p)//⽤⼀个节点去乘与⼀个多项式(辅助除法运算)Linnode *AddSame(linnode *head);//和并多项式的同类项linnode *Add(linnode *head1,linnode *head2);// 加法linnode *Mul(linnode *head1,linnode *head2);// 乘法linnode *Sub(linnode *head1,linnode *head2);// 减法//除法int main( )//主函数3 程序设计3.1 多项式存储的实现多项式是由若⼲项构成的⼀个数学式⼦,其每⼀项包含系数与指数。

数据结构实验报告——四则运算表达式求值

数据结构实验报告——四则运算表达式求值

数据结构实验报告——四则运算表达式求值实验五四则运算表达式求值一.问题描述:四则运算表达式求值,将四则运算表达式用中缀表达式,然后转换为后缀表达式,并计算结果。

二.基本要求:使用二叉树来实现。

三.实现提示:利用二叉树后序遍历来实现表达式的转换,同时可以使用实验二的结果来求解后缀表达式的值。

输入输出格式:输入:在字符界面上输入一个中缀表达式,回车表示结束。

输出:如果该中缀表达式正确,那么在字符界面上输出其后缀表达式,其中后缀表达式中两相邻操作数之间利用空格隔开;如果不正确,在字符界面上输出表达式错误提示。

测试实例:输入:21+23* (12-6 )输出:21 23 12 6 -*+四.设计概要用二叉树表示表达式:若表达式为数或简单变量,则相应二叉树中仅有一个根结点,其数据域存放该表达式信息若表达式= (第一操作数)(运算符)(第二操作数),则相应的二叉树中以左子树表示第一操作数,右子树表示第二操作数,根结点的数据域存放运算符(若为一元算符,则左子树空)。

操作数本身又为表达式.后缀遍历二叉树码实现和静态检查上机调试及测试数据的调试五.源程序:#include#include#include#include#include#include#define STACK_INIT_SIZE 100#define DATA_SIZE 10#define STACKINCREMENT 10#define OK 1#define TRUE 1#define FALSE 0#define ERROR 0#define OVERFLOW -2using namespace std;typedef float SElemtype;typedef int Status;typedef char * TElemType;typedef struct BiTNode {TElemType data;int len; //data字符串中字符的个数struct BiTNode * lchild, * rchild;}BiTNode, *BiTree;typedef struct{SElemtype *base;SElemtype *top;int stacksize;} SqStack;Status IsDigital(char ch)if(ch>='0'&&ch<='9'){return 1; //是数字字母}return 0; //不是数字字母}int CrtNode(stack &PTR, char *c){BiTNode * T;int i=0;T = (BiTNode *)malloc(sizeof(BiTNode));T->data = (char *)malloc(DATA_SIZE*sizeof(char));while(IsDigital(c[i])){T->data [i] = c[i];i++;}T->len = i;T->lchild = T->rchild = NULL;PTR.push (T);return i;}void CrtSubTree(stack &PTR, char c){BiTNode * T;T = (BiTNode *)malloc(sizeof(BiTNode));T->data = (char *)malloc(DATA_SIZE*sizeof(char));T->data [0] = c;T->len = 1;T->rchild = PTR.top(); //先右子树,否则运算次序反了PTR.pop ();T->lchild = PTR.top();PTR.pop ();PTR.push (T);}char symbol[5][5]={{'>', '>', '<', '<', '>'}, //符号优先级{'>', '>', '<', '<', '>'},{'>', '>', '>', '>', '>'},{'>', '>', '>', '>', '>'},{'<', '<', '<', '<', '='}};int sym2num(char s) //返回符号对应优先级矩阵位置{switch(s){case '+': return 0; break;case '-': return 1; break;case '*': return 2; break;case '/': return 3; break;case '#': return 4; break;}}char Precede(char a, char b) //返回符号优先级{return(symbol[sym2num(a)][sym2num(b)]);void CrtExptree(BiTree &T, char exp[]){//根据字符串exp的内容构建表达式树Tstack PTR;//存放表达式树中的节点指针stack OPTR;//存放操作符char op;int i=0;OPTR.push ('#');op = OPTR.top();while( !((exp[i]=='#') && (OPTR.top()=='#')) ) //与{ if (IsDigital(exp[i])){//建立叶子节点并入栈PTRi+=CrtNode(PTR, &exp[i]);}else if (exp[i] == ' ')i++;else{switch (exp[i]){case '(': {OPTR.push (exp[i]);i++;break;}case ')': {op = OPTR.top (); OPTR.pop ();while(op!='('){CrtSubTree(PTR, op);op = OPTR.top (); OPTR.pop ();}//end whilei++;break;}default: //exp[i]是+ - * /while(! OPTR.empty ()){op = OPTR.top ();if (Precede(op, exp[i])=='>'){CrtSubTree(PTR, op);OPTR.pop ();}if(exp[i]!='#'){OPTR.push (exp[i]);i++;}break;}}//end switch}//end else}//end whileT = PTR.top();PTR.pop ();}void PostOrderTraverse(BiTree &T, char * exp ,int &count){//后序遍历表达式树T,获取树中每个结点的数据值生成逆波兰表达式exp //T是表达式树的根节点;字符串exp保存逆波兰表达式;count保存exp中字符的个数//后序遍历中,处理根结点时,依据T->len的值,把T->data中的字符依次添加到当前exp字符串的尾端//添加完T->data后,再添加一个空格字符,同时更新count计数器的值。

线性表的链式存储,多项式的加减乘除四则运算报告

线性表的链式存储,多项式的加减乘除四则运算报告

多项式实验报告2011-4-9实验题目:一元多项式的表示及四则运算实验目的:1.了解线性表的链式存储结构,熟悉掌握链表2.了解作为链表的多项式存储方式3.熟悉掌握多项式加减乘除四则运算的算法实验内容:一、抽象数学模型:ADT Polynomial{数据对象:D={ai|ai∈TermSet,i=1,2,···,m, m>=0TermSet中的每个元素包含一个表示系数的实数和表示指数的整数} 数据关系:R1={<ai-1,ai>|ai-1,ai∈D,且ai-1中的指数值<ai中的指数值,i=2,···,n}基本操作:Insert(p,h);初始条件:多项式p与h已存在操作结果:合并指数相同的项CreatePolyn(& head, m)操作结果:建立一个头指针为head、项数为m的一元多项式DestroyPolyn(& p)初始条件:一元多项式P已存在操作结果:销毁多项式pPrintPolyn( P)初始条件:一元多项式P已存在操作结果:打印输出一元多项式PAddPolyn(&pa,& pb)初始条件:一元多项式Pa和Pb已存在操作结果:求解并建立多项式Pa=Pa+Pb, 返回其头指针SubtractPolyn(& pa,& pb)初始条件:一元多项式Pa和Pb已存在操作结果:求解并建立多项式Pa=Pa-Pb,返回其头指针MultiplyPolyn(& pa,& pb)初始条件:一元多项式Pa和Pb已存在操作结果:求解并建立多项式Pa=Pa*Pb,返回其头指针DevicePolyn(& pa,& pb)初始条件:一元多项式Pa和Pb已存在操作结果:求解并建立多项式Pa=Pa/Pb,返回其头指针}ADT Polynomial二、算法描述:为了实现上述程序功能,根据一元多项式的特点,可以构造链式存储的线性表存放一元多项式各式的信息。

数据结构课程设计—一元多项式加法、减法、乘法运算的实现Word版

数据结构课程设计—一元多项式加法、减法、乘法运算的实现Word版

1.一元多项式加法、减法、乘法运算的实现1.1设计内容及要求1)设计内容(1)使用顺序存储结构实现多项式加、减、乘运算。

例如:10321058)(2456+-+-+=x x x x x x f ,x x x x x x g +--+=23451020107)(求和结果:102220128)()(2356++-+=+x x x x x g x f(2)使用链式存储结构实现多项式加、减、乘运算,10305100)(1050100+-+=x x x x f ,x x x x x x g 320405150)(10205090+++-=求和结果:1031040150100)()(102090100++-++=+x x x x x x g x f2)设计要求(1)用C 语言编程实现上述实验内容中的结构定义和算法。

(2)要有main()函数,并且在main()函数中使用检测数据调用上述算法。

(3)用switch 语句设计如下选择式菜单。

***************数据结构综合性实验***********************一、多项式的加法、减法、乘法运算***************** 1.多项式创建 ***************** 2.多项式相加 ***************** 3.多项式相减 ***************** 4.多项式相乘 ***************** 5.清空多项式 ***************** 0.退出系统 ***************** 请选择(0—5) ************************************************************请选择(0-5):1.2数据结构设计根据下面给出的存储结构定义:#define MAXSIZE 20 //定义线性表最大容量//定义多项式项数据类型typedef struct{float coef; //系数int expn; //指数}term,elemType;typedef struct{term terms[MAXSIZE]; //线性表中数组元素int last; //指向线性表中最后一个元素位置}SeqList;typedef SeqList polynomial;1.3基本操作函数说明polynomial*Init_Polynomial();//初始化空的多项式int PloynStatus(polynomial*p)//判断多项式的状态int Location_Element(polynomial*p,term x)在多项式p中查找与x项指数相同的项是否存在int Insert_ElementByOrder(polynomial*p,term x)//在多项式p中插入一个指数项xint CreatePolyn(polynomial*P,int m)//输入m项系数和指数,建立表示一元多项式的有序表pchar compare(term term1,term term2)//比较指数项term1和指数项term2polynomial*addPloyn(polynomial*p1,polynomial*p2)//将多项式p1和多项式p2相加,生成一个新的多项式polynomial*subStractPloyn(polynomial*p1,polynomial*p2) //多项式p1和多项式p2相减,生成一个新的多项式polynomial*mulitPloyn(polynomial*p1,polynomial*p2)//多项式p1和多项式p2相乘,生成一个新的多项式void printPloyn(polynomial*p)//输出在顺序存储结构的多项式p1.4程序源代码#include<stdlib.h>#include<stdio.h>#include<iostream.h>#define NULL 0#define MAXSIZE 20typedef struct{float coef;int expn;}term,elemType;typedef struct{term terms[MAXSIZE];int last;}SeqList;typedef SeqList polynomial;void printPloyn(polynomial*p);int PloynStatus(polynomial*p){if(p==NULL){return -1;}else if(p->last==-1){return 0;}else{return 1;}}polynomial*Init_Polynomial(){polynomial*P;P=new polynomial;if(P!=NULL){P->last=-1;return P;}else{return NULL;}}void Reset_Polynomial(polynomial*p){if(PloynStatus(p)==1){p->last=-1;}}int Location_Element(polynomial*p,term x){int i=0;if(PloynStatus(p)==-1)return 0;while(i<=p->last && p->terms[i].expn!=x.expn) {i++;}if(i>p->last){return 0;}else{return 1;}}int Insert_ElementByOrder(polynomial*p,term x) {int j;if(PloynStatus(p)==-1)return 0;if(p->last==MAXSIZE-1){cout<<"The polym is full!"<<endl;return 0;}j=p->last;while(p->terms[j].expn<x.expn && j>=0){p->terms[j+1]=p->terms[j];j--;}p->terms[j+1]=x;p->last++;return 1;}int CreatePolyn(polynomial*P,int m){float coef;int expn;term x;if(PloynStatus(P)==-1)return 0;if(m>MAXSIZE){printf("顺序表溢出\n");return 0;}else{printf("请依次输入%d对系数和指数...\n",m);for(int i=0;i<m;i++){scanf("%f%d",&coef,&expn);x.coef=coef;x.expn=expn;if(!Location_Element(P,x)){Insert_ElementByOrder(P,x);}}}return 1;}char compare(term term1,term term2){if(term1.expn>term2.expn){return'>';}else if(term1.expn<term2.expn){return'<';}else{return'=';}}polynomial*addPloyn(polynomial*p1,polynomial*p2){int i,j,k;i=0;j=0;k=0;if((PloynStatus(p1)==-1)||(PloynStatus(p2)==-1)){return NULL;}polynomial*p3=Init_Polynomial();while(i<=p1->last && j<=p2->last){switch(compare(p1->terms[i],p2->terms[j])){case'>':p3->terms[k++]=p1->terms[i++];p3->last++;break;case'<':p3->terms[k++]=p2->terms[j++];p3->last++;break;case'=':if(p1->terms[i].coef+p2->terms[j].coef!=0){p3->terms[k].coef=p1->terms[i].coef+p2->terms[j].coef;p3->terms[k].expn=p1->terms[i].expn;k++;p3->last++;}i++;j++;}}while(i<=p1->last){p3->terms[k++]=p1->terms[i++];p3->last++;}return p3;}polynomial*subStractPloyn(polynomial*p1,polynomial*p2){int i;i=0;if((PloynStatus(p1)!=1)||(PloynStatus(p2)!=1)){return NULL;}polynomial*p3=Init_Polynomial();p3->last=p2->last;for(i=0;i<=p2->last;i++){p3->terms[i].coef=-p2->terms[i].coef;p3->terms[i].expn=p2->terms[i].expn;}p3=addPloyn(p1,p3);return p3;}polynomial*mulitPloyn(polynomial*p1,polynomial*p2){int i;int j;int k;i=0;if((PloynStatus(p1)!=1)||(PloynStatus(p2)!=1)){return NULL;}polynomial*p3=Init_Polynomial();polynomial**p=new polynomial*[p2->last+1];for(i=0;i<=p2->last;i++){for(k=0;k<=p2->last;k++){p[k]=Init_Polynomial();p[k]->last=p1->last;for(j=0;j<=p1->last;j++){p[k]->terms[j].coef=p1->terms[j].coef*p2->terms[k].coef;p[k]->terms[j].expn=p1->terms[j].expn+p2->terms[k].expn;}p3=addPloyn(p3,p[k]);}}return p3;}void printPloyn(polynomial*p){int i;for(i=0;i<=p->last;i++){if(p->terms[i].coef>0 && i>0)cout<<"+"<<p->terms[i].coef;elsecout<<p->terms[i].coef;cout<<"x^"<<p->terms[i].expn;}cout<<endl;}void menu(){cout<<"\t\t*******数据结构综合性实验*********"<<endl;cout<<"\t\t***一、多项式的加、减、乘法运算***"<<endl;cout<<"\t\t******* 1.多项式创建 *********"<<endl;cout<<"\t\t******* 2.多项式相加 *********"<<endl;cout<<"\t\t******* 3.多项式相减 *********"<<endl;cout<<"\t\t******* 4.多项式相乘 *********"<<endl;cout<<"\t\t******* 5.清空多项式 *********"<<endl;cout<<"\t\t******* 0.退出系统 *********"<<endl;cout<<"\t\t****** 请选择(0-5) ********"<<endl;cout<<"\t\t***********************************"<<endl; }void main(){int sel;polynomial*p1=NULL;polynomial*p2=NULL;polynomial*p3=NULL;while(1){menu();cout<<"\t\t*请选择(0-5):";cin>>sel;switch(sel){case 1:p1=Init_Polynomial();p2=Init_Polynomial();int m;printf("请输入第一个多项式的项数:\n");scanf("%d",&m);CreatePolyn(p1,m);printf("第一个多项式的表达式为p1=");printPloyn(p1);printf("请输入第二个多项式的项数:\n");scanf("%d",&m);CreatePolyn(p2,m);printf("第二个多项式的表达式为p2=");printPloyn(p2);break;case 2:printf("p1+p2=");if((p3=subStractPloyn(p1,p2))!=NULL)printPloyn(p3);break;case 3:printf("\np1-p2=");if((p3=subStractPloyn(p1,p2))!=NULL)printPloyn(p3);break;case 4:printf("\np1*p2=");if((p3=mulitPloyn(p1,p2))!=NULL)printPloyn(p3);case 5:Reset_Polynomial(p1);Reset_Polynomial(p2);Reset_Polynomial(p3);break;case 0:return;}}return;}1.5程序执行结果2.迷宫问题实现2.1设计内容及要求1)设计内容以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。

多项式的四则运算

多项式的四则运算

1§多項式的四則運算z ,y ,x 等,經過加、減、乘的運算後所形成之式子,就叫多項式。

2.定義:形如∑=--=++++=nk k k n n nn x a a x a xa x a x p 0111...)( ,其中n 是正整數或零;a a a a n n ,,...,,11-都是數,此式子稱為x 的多項式,此時k a 稱為k 次項的係數, a 稱為常數項。

係數可以是整數、有理數、實數或複數。

3.所有整係數多項式所成集合稱為整係數多項式集,以][x Z 表示。

同理,以][],[],[x C x R x Q 分別表有理係數多項式集、實係數多項式集、複係數多項式集。

4.次數:當0≠n a 時,n 叫做多項式)(x p 的次數,以n x p =)(deg 表示,而n a 稱為)(x p 的領導(首項)係數。

5.常數多項式:只有0a 項的多項式稱之,有兩種:(1)零多項式:即為0,沒有次數。

(2)零次多項式:除零多項式外之常數多項式,其次數為0。

6.排列方式:多項式之次數由小而大的排列方式稱為升冪排列,反之則稱為降冪排列。

7.多項式相等:設n n x a x a x a a x p ++++= 2210)(,m m x b x b x b b x q ++++= 2210)(為兩多項式,其中0,≠m n b a ,則)()(x q x p =的充要條件為n m =且i b a i i ∀=,。

※0111)(a x a x a x a x f n n n n ++++=-- ,0 N n ∈,0≠n a ,n x f =))(deg(,n a :領導係數若0))(deg(=x f ⎩⎨⎧≠=:零次多項式,:零多項式,)(0)(00x f a x f a※多項式之文字符號不可在絕對值,分母,根號。

2(A)x + 3 (B) 2x + 1 (C) x 2 +3x + 1 (D)x1(E) | x |。

数据结构多项式运算的程序(加减法和乘法)C语言版

数据结构多项式运算的程序(加减法和乘法)C语言版

数据结构多项式运算的程序(加减法和乘法)C语言版#include#includetypedef struct node{//定义节点类型float coef;int expn;struct node * next;}PLOY;void start()//用户选择界面{printf("************************************\n");printf(" 两个一元多项式的相加/相减,相乘:\n");printf("************************************\n");printf("请选择操作:\n");printf("0.退出\n");printf("1.两个一元多项式相加\n");printf("2.两个一元多项式相乘\n");printf("3.两个一元多项式相减\n");}void insert(PLOY *head,PLOY *inpt)//查找位置插入新链节程序{PLOY *pre,*now;int signal=0;pre=head;//pre定义为现在的前一个链节if(pre->next==NULL) {pre->next=inpt;}else {now=pre->next;while(signal==0){if(inpt->expnexpn)//当新链节小于现在的连接时向后移一个链节{if(now->next==NULL){now->next=inpt;signal=1;}else{pre=now;now=pre->next;}}elseif(inpt->expn>now->expn)//如果发现比现在的链节大了就插入到这个连接的前面{inpt->next=now;pre->next=inpt;signal=1;}else{now->coef=now->coef+inpt->coef;signal=1;free(inpt);//与当前链节相等指数if(now->coef==0){pre->next=now->next;free(now);}}}}}PLOY *creat(char ch)//输入多项式{PLOY *head,*inpt;float x;int y;head=(PLOY *)malloc(sizeof(PLOY));//创建链表头head->next=NULL;printf("请输入一元多项式%c:(格式是:系数指数;以0 0 结束!)\n",ch);scanf("%f %d",&x,&y);while(x!=0){inpt=(PLOY *)malloc(sizeof(PLOY));//创建新链节inpt->coef=x;inpt->expn=y;inpt->next=NULL;insert(head,inpt);//不然就查找位置并且插入新链节printf("请输入一元多项式%c的下一项:(以0 0 结束!)\n",ch);scanf("%f %d",&x,&y);}return head;}PLOY *addPLOY(PLOY *head,PLOY *pre)//多项式相加{PLOY *inpt;int flag=0;while(flag==0){if(pre->next==NULL)flag=1;//当现在指向空时跳出循环else{pre=pre->next;inpt=(PLOY *)malloc(sizeof(PLOY));//创建新链节inpt->coef=pre->coef;inpt->expn=pre->expn;inpt->next=NULL;insert(head,inpt);}//否则把当前"g(x)"的链节插入到"y(x)"中}return head;}PLOY *minusPLOY(PLOY *head,PLOY *pre)//多项式相加{PLOY *inpt;int flag=0;while(flag==0){if(pre->next==NULL)flag=1;//当现在指向空时跳出循环else{pre=pre->next;inpt=(PLOY *)malloc(sizeof(PLOY));//创建新链节inpt->coef=0-pre->coef;inpt->expn=pre->expn;inpt->next=NULL;insert(head,inpt);}//否则把当前"g(x)"的链节插入到"y(x)"中}return head;}PLOY *byPLOY(PLOY *head1,PLOY *head2)//多项式相乘{PLOY *inpt,*res,*pre;int flag=0;res=(PLOY *)malloc(sizeof(PLOY));//创建链表头res->next=NULL;head1=head1->next;pre=head2;while(flag==0){if(pre->next==NULL){pre=head2;//当现在指向空时跳出循环head1=head1->next;continue;}if(head1==NULL){flag=1;//当现在指向空时跳出循环continue;}pre=pre->next;inpt=(PLOY *)malloc(sizeof(PLOY));//创建新链节inpt->coef=pre->coef*head1->coef;inpt->expn=pre->expn+head1->expn;inpt->next=NULL;insert(res,inpt);//把当前"g(x)"的链节插入到"y(x)"中}return res;}void print(PLOY *fun)//输出多项式{PLOY *printing;int flag=0;printing=fun->next;//正在被打印的链节if(fun->next==NULL)//如果函数为空打印0{printf("0\n");return;}while(flag==0){if(printing->coef>0&&fun->next!=printing) printf("+");//为正数时打印"+"号if(printing->coef==1);//如果为"1"就不用打印系数了else if(printing->coef==-1)printf("-");//如果为"-1"就打印"-"号就行了elseprintf("%f",printing->coef);//其余情况都得打印if(printing->expn!=0) printf("x^%d",printing->expn);//如果指数为"0"不打印指数项else if((printing->coef==1)||(printing->coef==-1))printf("1");if(printing->next==NULL)flag=1;//如果现在的链节没有下一个就结束elseprinting=printing->next;}printf("\n");}void main(){PLOY *f,*g;int sign=-1;//设置标志start();while(sign!=0){scanf("%d",&sign);switch(sign){case 0:break;//退出case 1:printf("你选择的操作是多项式相加:\n"); f=creat('f');//输入多项式f(x)printf("f(x)=");print(f);g=creat('g');//输入多项式g(x)printf("g(x)=");print(g);printf("F(x)=f(x)+g(x)=");f=addPLOY(f,g);//两个多项式相加print(f);sign=-1;//复位标志start();//回复用户选择界面break;}case 2:{printf("你选择的操作是多项式相乘:\n"); f=creat('f');//输入多项式f(x)printf("f(x)=");print(f);g=creat('g');//输入多项式g(x)printf("g(x)=");print(g);printf("F(x)=f(x)*g(x)=");f=byPLOY(f,g);//两个多项式相加print(f);sign=-1;//复位标志start();//回复用户选择界面break;case 3:{printf("你选择的操作是多项式相减:\n");f=creat('f');//输入多项式f(x)printf("f(x)=");print(f);g=creat('g');//输入多项式g(x)printf("g(x)=");print(g);printf("F(x)=f(x)-g(x)=");f=byPLOY(f,g);//两个多项式相加print(f);sign=-1;//复位标志start();//回复用户选择界面break;}default:{printf("输入有误!请重新选择操作!\n");//选择错误,返回选择界面start();break;}}}}。

数据结构(C语言)-案例分析(顺序表实现多项式运算)

数据结构(C语言)-案例分析(顺序表实现多项式运算)

数据结构(C语⾔)-案例分析(顺序表实现多项式运算)顺序表实现多项式运算//多项式基本运算#include"stdio.h"#include"stdlib.h"#define MAX 100typedef int Data;typedef struct{Data data[MAX];int Length;}SeqList;SeqList A;SeqList B;SeqList C;void InitList(SeqList *A,SeqList *B,SeqList *C){A->Length=0;B->Length=0;C->Length=0;}void CreateList(SeqList *A,SeqList *B,int n,int x){int i;printf("输⼊多项式A的系数:");for(i=0;i<n;i++){scanf("%d",&A->data[i]);}A->Length=i;printf("\n输⼊多项式B的系数:");for(i=0;i<x;i++){scanf("%d",&B->data[i]);}B->Length=i;printf("\n多项式A的系数:");for(i=0;i<A->Length;i++){printf("%3d",A->data[i]);}printf("\n多项式B的系数:");for(i=0;i<B->Length;i++){printf("%3d",B->data[i]);}}void Addition(SeqList *A,SeqList *B,SeqList *C){int i;if(A->Length>B->Length){C->Length=A->Length;for(i=0;i<A->Length;i++){if(i!=B->Length){C->data[i]=A->data[i]+B->data[i];}else{C->data[i]=A->data[i];}}}else if(B->Length>A->Length){C->Length=B->Length;for(i=0;i<B->Length;i++){if(i!=A->Length){C->data[i]=A->data[i]+B->data[i];}else{C->data[i]=B->data[i];}C->Length=A->Length;for(i=0;i<A->Length;i++){C->data[i]=A->data[i]+B->data[i];}}printf("A+B得:");for(i=0;i<C->Length;i++){printf("%3d",C->data[i]);}}void Division(SeqList *A,SeqList *B,SeqList *C){int i;if(A->Length>B->Length){C->Length=A->Length;for(i=0;i<A->Length;i++){if(i!=B->Length){C->data[i]=A->data[i]/B->data[i];}else{C->data[i]=A->data[i];}}}else if(B->Length>A->Length){C->Length=B->Length;for(i=0;i<B->Length;i++){if(i!=A->Length){C->data[i]=A->data[i]/B->data[i];}else{C->data[i]=B->data[i];}}}else{C->Length=A->Length;for(i=0;i<A->Length;i++){C->data[i]=A->data[i]/B->data[i];}}printf("A/B得:");for(i=0;i<C->Length;i++){printf("%3d",C->data[i]);}}void Multiplication(SeqList *A,SeqList *B,SeqList *C){ int i;if(A->Length>B->Length){C->Length=A->Length;for(i=0;i<A->Length;i++){if(i!=B->Length){C->data[i]=A->data[i]*B->data[i];}else{C->data[i]=A->data[i];}}}else if(B->Length>A->Length){C->Length=B->Length;for(i=0;i<B->Length;i++){if(i!=A->Length){C->data[i]=A->data[i]*B->data[i];}else{C->data[i]=B->data[i];C->Length=A->Length;for(i=0;i<A->Length;i++){C->data[i]=A->data[i]*B->data[i];}}printf("A*B得:");for(i=0;i<C->Length;i++){printf("%3d",C->data[i]);}}void Menu(){printf("\n 多项式计算");printf("\n--------------------------------------");printf("\n 1--创建多项式 ");printf("\n 2--加法计算 ");printf("\n 3--除法计算 ");printf("\n 4--乘法计算 ");printf("\n 0--退出 ");printf("\n--------------------------------------");printf("\n请输⼊菜单号(0-4):");}int main(){SeqList A;SeqList B;SeqList C;int n,x,loc;char ch1,ch2,a;ch1='y';while(ch1=='y'||ch1=='Y'){Menu();scanf("%c",&ch2);getchar();switch(ch2){case'1':InitList(&A,&B,&C);printf("输⼊第⼀个多项式系数的个数:");scanf("%d",&n);printf("输⼊第⼆个多项式系数的个数:");scanf("%d",&x);CreateList(&A,&B,n,x);break;case'2':Addition(&A,&B,&C);break;case'3':Division(&A,&B,&C);break;case'4':Multiplication(&A,&B,&C);break;case'0':ch1='n';break;default:printf("输⼊有误");}if(ch2!='0'){printf("\n按回车键继续,按任意键返回主菜单!\n"); a=getchar();if(a!='\xA'){getchar();}。

数据结构课程设计《一元多项式的四则运算》

数据结构课程设计《一元多项式的四则运算》

数据结构课程设计《一元多项式的四则运算》一元多项式的四则运算学生姓名:XX 指导老师:XX摘要本课程设计主要解决一元多项式的运算问题,通过链表的使用,实现对一元多项式的构建、录入、存储、打印、以及之间的运算。

在本课程设计中,程序设计语言为C++语言,程序运行平台为Windows/98/2000/XP,程序采用了链表存储方法以及结构化和模块化的设计方法,通过调试运行,可以进行多项式的加、减、乘运算,勉强实现了设计目标,并且经过适当完善后,将可应用到实际中解决某些问题。

关键词程序设计;C++ ;一元多项式;运算1 引言一般来说,我们只知道数学上的一元多项式的运算,这一般都是用笔来进行运算的,然而此课程设计将一元多项式的运算用电脑来进行,只需要将多项式输入,然后就可以出结果,速度快,省去了认为计算的环节,在现实中带来不少方便。

1.1 课题背景一元多项式的运算,虽然无法直接在除数学外的其他领域作出贡献,但是在数学上,它可以为人们解决一些自己动笔动手很难解决的问题,比如说那些很长很长的多项式,用笔算可能要算半天,但是用该程序,只需短短的几秒钟,所以它给人们带来了不少方便,同时相信它也能间接地为其他领域做出贡献。

1.2 课程设计目的个人觉得,该数据结构课程设计一方面可以让自己更加熟悉那些些常用的数据结构,掌握数据结构内在的逻辑关系,以及它们在计算机中的存储表示,和对它们实行的各种运算;另一方面,可以让自己对于整体和局部,以及结构化和模块化编程有一个更深层次的了解。

作为网络工程的学生,虽然之前有过一次C语言课程设计,但是深知自己编程能力尚为欠缺,所以这一次数据结构课程设计是对我的编程能力和组织能力的又一次考验。

1.3课程设计内容本课程设计是用链表实现一元多项式的存储及运算,其中包括多项式系数及指数的录入(即一元多项式的录入),以及储存、一元多项式的显示、一元多项式之间的加、减、乘法运算。

2 设计思路与方案2.1设计思路该系统使用C++语言进行开发和实现,程序中的各个功能分别由不同的的函数实现,然后在main 函数中调用实现。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构07082018用链表实现多项式的四则运算——数据结构第二次上机作业班级07082姓名丁敏学号07082018上机时间2011年3月31日报告时间:2011年4月5日实验目的:熟练使用指针,熟悉链表及其操作;利用链表解决实际问题要求:能够实现任意项有理多项式的加、减、乘、除、求模以及幂运算多项式的除法注意除不尽的处理测试用例尽可能多,且说明用例的必要性用例必须包含一个自己系数为自己的学号摘要:多项式的四则运算问题是个很有趣的问题,它类似于有理数的四则运算,但又不仅仅于此.本篇课程论文重点研究了数据结构中多项式的四则运算问题。

本论文的程序是通过Microsoft Visual Studio 2010编译,来解决多项式的加、减、乘、除四则运算问题,从而达到了解数据结构的实用性及程序语言对于数学问题研究的重要性的目的。

正文:0需求分析:0.1问题描述编写程序来实现多项式的四则运算。

0.2基本要求⑴输入多项式的系数与指数,输入值为float型,输出值为float型;⑵能够完成多项式之间的四种计算方式(+、-、*、/)。

0.3函数说明typedef struct PolyNode:结构体变量,定义 int型指数和float 系数;PolyList CreatePolyList():创建多项式列表,返回头指针;DisplayPolyList(PolyList Poly):显示多项式;DestroyPolyList(PolyList L):释放链表所用存储空间;MergePoly(PolyList Poly):将多项式合并同类项;SortPoly(PolyList Poly):将多项式按升序排列;PolyList PolyAdd(PolyList PolyA , PolyList PolyB):多项式相加,返回和多项式链表头指针;PolyList PolySub(PolyList polyA , PolyList polyB):多项式相减,返回差多项式链表头指针;PolyList PolyMutiply(PolyList PolyA , PolyList PolyB):多项式相乘,结果由Poly c返回;PolyList PolyDivide(PolyList PolyA , PolyList PolyB):多项式相除,商和余数用系数为0的结点分开。

1程序执行结果及分析:1.1执行结果⑴*******多项式的创建*******请输入多项式的第1项的系数和指数(用逗号分开):3,2请输入多项式的第2项的系数和指数:2,0请输入多项式的第3项的系数和指数:0,0输入的多项式A: 3.000000*x^2 + 2.000000*x^0请输入多项式的第1项的系数和指数(用逗号分开):2,2请输入多项式的第2项的系数和指数:3,1请输入多项式的第3项的系数和指数:0,0输入的多项式B: 2.000000*x^2 + 3.000000*x^1合并排序后的多项式A: 3.000000*x^2 + 2.000000*x^0合并排序后的多项式B: 2.000000*x^2 + 3.000000*x^1*******多项式的四则运算*******A+B: 5.000000*x^2 + 3.000000*x^1 + 2.000000*x^0A-B: 1.000000*x^2 + -3.000000*x^1 + 2.000000*x^0A*B: 6.000000*x^4 + 9.000000*x^3 + 4.000000*x^2 + 6.000000*x^1 A/B: 1.500000*x^0 ......-4.500000*x^1 + 2.000000*x^0请按任意键继续. . .⑵*******多项式的创建*******请输入多项式的第1项的系数和指数(用逗号分开):1,1请输入多项式的第2项的系数和指数:0,0输入的多项式A: 1.000000*x^1请输入多项式的第1项的系数和指数(用逗号分开):0,0输入的多项式B: 0合并排序后的多项式A: 1.000000*x^1合并排序后的多项式B: 0*******多项式的四则运算*******A+B: 1.000000*x^1A-B: 1.000000*x^1A*B: 0Error:除项为空!A/B:请按任意键继续. . .⑶*******多项式的创建*******请输入多项式的第1项的系数和指数(用逗号分开):2,3请输入多项式的第2项的系数和指数:2/3,1(出现乱码)1.2测试用例(1)(2)(3)(4)输入:输出:1.3结果分析通过三次的运行,一二两次成功,但第三次乱码。

从第三次的运行来看由于输入与所要求的不一样二出现乱码,故非程序的问题,所以本程序符合多项式的运算要求,是正确的。

2程序的评价:⑴程序符合需求,能够有效地运行多项式之间的运算;⑵程序结构合理,具有层次性,易读;⑶程序运行界面友好,且不与别的程序相冲突⑷由于程序会出乱码现象,所以还有一定的缺陷;3总结:本文的重点是对多项式的各种关系通过编程进行处理。

笔者通过通过Microsoft Visual Studio 2010编译完成了所要求的内容。

值得指出的是:本程序层次性较强,易读,且具有较高的精度,如进一步改善,将会有很强的适用性。

笔者当然也碰到许多的问题,比如算法设计上仍有很大不足,流程图画的不是很熟练,全局变量不会定义,main函数的顺序位置等。

这些问题都可以通过实践来解决,总之,一句话熟能生巧。

附录#include<stdio.h>#include<stdlib.h>#include<math.h>//结点定义typedef struct PolyNode{int exp; //指数float coef; //系数PolyNode* next;}PolyNode , * PolyList;PolyList CreatePolyList(); //创建多项式链表,返回头指针void DisplayPolyList(PolyList Poly);//显示多项式void DestroyPolyList(PolyList L);//释放链表所用存储空间void MergePoly(PolyList Poly);//将多项式和并同类项void SortPoly(PolyList Poly);//将多项式按升序排列PolyList PolyAdd(PolyList PolyA , PolyList PolyB);//多项式相加,返回和多项式链表头指针PolyList PolySub(PolyList polyA , PolyList polyB);//多项式相减,返回差多项式链表头指针PolyList PolyMutiply(PolyList PolyA , PolyList PolyB);//多项式相乘,结果由PolyC返回PolyList PolyDivide(PolyList PolyA , PolyList PolyB);//多项式相除,结果存到PolyC中,商和余数用系数为0的结点分开PolyList CreatePolyList(){PolyNode *s,*rear,*head;int e; //指数float c; //系数int n=1; //计数器head =(PolyNode *)malloc(sizeof(PolyNode));rear = head;//输入多项式的系数和指数,若输入系数为0退出printf("请输入多项式的第%d项的系数和指数(用逗号分开):" , n++);scanf("%f,%d" , &c , &e);while(fabs(c) > 1e-6){ s = (PolyNode*)malloc(sizeof(PolyNode));s->exp = e;s->coef = c;rear->next = s;rear = s;printf("请输入多项式的第%d项的系数和指数:" , n++);scanf("%f,%d" , &c , &e);}rear->next = NULL;return head;}//计算两个多项式(可不按顺序排列),结果存到链表PolyC中,并返回PolyList PolyAdd(PolyList PolyA , PolyList PolyB){PolyList PolyC ;SortPoly(PolyA);SortPoly(PolyB);float sum=0;//存储两项系数和PolyNode *pa , *pb , *rear , *s ;PolyC = (PolyNode*)malloc(sizeof(PolyNode));pa = PolyA->next;pb = PolyB->next;rear = PolyC;rear->next = NULL;while(pa && pb){if(pa->exp == pb->exp){sum = pa->coef+pb->coef;if(fabs(sum)>1e-6) //如果两两系数不为0,则将两项和存入s中,并插入PolyC尾部{s = (PolyNode*)malloc(sizeof(PolyNode));s->coef = sum;s->exp = pa->exp;rear->next = s;rear = s;}//pa,pb指针后移pa = pa->next;pb = pb->next;}else if(pa->exp>pb->exp) //若pa指数大于pb指数,将pa结点副本插入到PolyC尾部{s = (PolyNode*)malloc(sizeof(PolyNode));s->coef = pa->coef;s->exp = pa->exp;rear->next = s ;rear = s ;pa = pa->next;}else //若pb指数大于pa指数,将pb结点副本插入到PolyC尾部{s = (PolyNode*)malloc(sizeof(PolyNode));s->coef = pb->coef;s->exp = pb->exp;rear->next = s;pb = pb->next;rear = s ;}}while(pa){s = (PolyNode*)malloc(sizeof(PolyNode));s->coef = pa->coef;s->exp = pa->exp;rear->next = s;pa = pa->next;rear = s ;}while(pb){s = (PolyNode*)malloc(sizeof(PolyNode));s->coef = pb->coef;s->exp = pb->exp;rear->next = s;pb = pb->next;rear = s ;}rear->next = NULL;return PolyC;}void DestroyPolyList(PolyList L){PolyNode * p , *temp;p = L;while(p!=NULL){temp = p ; p = p->next;free(temp); }}//将多项式和并同类项void MergePoly(PolyList Poly){PolyNode * p , *q , * rear ,*pre ,* temp;rear = Poly;p = Poly->next ;while(rear->next!=NULL){q = p->next;pre = p;temp = p;while(q){if(p->exp == q->exp){p->coef+=q->coef;if(fabs(p->coef)>1e-6){pre->next =q->next;temp = q;q = temp->next;free(temp);}else //两项系数和为0,释放结点p和q{rear->next =p->next;temp = p;p = temp->next;free(temp);pre->next =q->next;temp = q;q = temp->next;free(temp);}}else{pre= q ; q = q->next;} //指数不等,指针q后移}//与p指数相同的节点合并完毕,或者没有找到,p后移rear = p;p = rear->next;}rear->next = NULL;}//将多项式按升序排列void SortPoly(PolyList Poly){PolyList rear , p ,temp , prior;if(!Poly->next) return; //若多项式为空,返回MergePoly(Poly);rear = Poly;int exp;//记录当前啊搜索项中的最小指数while(rear->next!=NULL){exp = rear->next->exp;p = rear->next ;prior = rear;temp = prior->next ;while(p!=NULL){if(p->exp > exp){exp = p->exp ;temp = p ;p = temp->next ;}else{p = p->next ;if(rear->next->next ==NULL) return; //p为最后一个元素且指数最小,提前返回}}while(prior->next != temp) prior = prior->next ;prior->next = temp->next;temp->next = rear->next ;rear->next = temp;rear = rear->next ;}}//多项式相减,返回差多项式链表头指针PolyList PolySub(PolyList PolyA , PolyList PolyB){PolyList PolyC ;SortPoly(PolyA);SortPoly(PolyB);float sum =0 ;//存储两项系数差PolyNode *pa , *pb , *rear , *s ;PolyC = (PolyNode*)malloc(sizeof(PolyNode));pa = PolyA->next;pb = PolyB->next;rear = PolyC;rear->next = NULL;while(pa && pb){if(pa->exp == pb->exp){sum = pa->coef-pb->coef;if(fabs(sum)>1e-6) //如果两两系数不为0,则将两项和存入s中,并插入PolyC尾部{s = (PolyNode*)malloc(sizeof(PolyNode));s->coef = sum;s->exp = pa->exp;rear->next = s;rear = s;}//pa,pb指针后移pa = pa->next;pb = pb->next;}else if(pa->exp>pb->exp) //若pa指数大于pb指数,将pa结点副本插入到PolyC尾部{s = (PolyNode*)malloc(sizeof(PolyNode));s->coef = pa->coef;s->exp = pa->exp;rear->next = s ;rear = s ;pa = pa->next;}else //若pb指数大于pa指数,将pb结点副本插入到PolyC尾部{s = (PolyNode*)malloc(sizeof(PolyNode));s->coef = -pb->coef;s->exp = pb->exp;rear->next = s;pb = pb->next;rear = s ;}}while(pa){s = (PolyNode*)malloc(sizeof(PolyNode));s->coef = pa->coef;s->exp = pa->exp;rear->next = s;pa = pa->next;rear = s ;}while(pb){s = (PolyNode*)malloc(sizeof(PolyNode));s->coef = -pb->coef;s->exp = pb->exp;rear->next = s;pb = pb->next;rear = s ;}rear->next = NULL;return PolyC;}//输出多项式void DisplayPolyList(PolyList Poly) {if(Poly == NULL){printf("\n");return;}PolyNode *p=Poly->next ;if(p == NULL){printf("0\n"); return;} //如果链表为空提前退出while(p->next!=NULL){if(fabs(p->coef)>1e-6){if(fabs(p->next->coef)>1e-6)printf("%f*x^%d + " , p->coef , p->exp);else printf("%f*x^%d " , p->coef , p->exp);}else printf("......");//输出分割点p = p->next ;}if(fabs(p->coef)>1e-6)printf("%f* x^%d" , p->coef , p->exp);printf("\n");}//多项式相乘,结果由PolyC返回PolyList PolyMutiply(PolyList PolyA , PolyList PolyB){PolyList PolyC;PolyNode *pa , *pb , *pc_pre , *pc , *s;if(PolyA==NULL || PolyB==NULL) return NULL; //若某一个多项式为空,返回PolyC =(PolyNode*)malloc(sizeof(PolyNode));pc = PolyC ;pc->next = NULL;if(PolyA->next==NULL ||PolyB->next==NULL) return PolyC;SortPoly(PolyA);SortPoly(PolyB);pa = PolyA->next ;pb = PolyB->next;s =(PolyNode*)malloc(sizeof(PolyNode));s->coef = pa->coef * pb->coef ;s->exp = pa->exp + pb->exp ;if(pc->next == NULL){pc->next = s ;pc =s ;pc->next = NULL ;} //直接插入第一个结点while(pa){pb = PolyB->next ;while(pb){//两项对应相乘,结果存入到s中pc = PolyC->next;if(pa == PolyA->next && pb==PolyB->next) //避免重复插入第一个结点{pb=pb->next;if(pb == NULL) break;}s =(PolyNode*)malloc(sizeof(PolyNode));s->coef = pa->coef *pb->coef ;s->exp = pa->exp + pb->exp ;//查找s合适的插入位置,使得插入后PolyC仍为升序排列while( pc && pc->exp >s->exp) { pc_pre = pc ;pc=pc_pre->next ;}if(pc==NULL){pc_pre->next=s ; s->next=NULL;pb=pb->next;}else if( pc->exp <s->exp){pc_pre->next = s ; s->next = pc ; pb=pb->next; }else if(s->exp == pc->exp ){pc->coef += s->coef ;free(s);if(fabs(pc->coef)<1e-6 ){pc_pre-> next = pc->next ; free(pc);}pb = pb->next;}}pa = pa->next;}return PolyC;}//多项式相除,结果存到PolyC中,商和余数用系数为0的结点分开PolyList PolyDivide(PolyList PolyA , PolyList PolyB){if(!PolyA || !PolyB) return NULL;if(PolyB->next ==NULL){printf("Error:除项为空!\n");return NULL;}PolyList PolyT1 , PolyT2 , pt , s , PolyC , p , s_pre;PolyC =(PolyList)malloc(sizeof(PolyNode));PolyC->next=NULL;if(PolyA->next==NULL) return PolyC;p = PolyA->next;PolyT1 =(PolyList)malloc(sizeof(PolyNode));pt = PolyT1;s_pre=(PolyList)malloc(sizeof(Pol yNode));while(p) //将PollyA复制到PolyT 中{s =(PolyList)malloc(sizeof(PolyNode));s->coef = p->coef ;s->exp = p->exp ;pt->next = s;pt = s;p = p->next ;}pt->next=NULL;//将商存入到PolyC中p = PolyC;多项式的四则运算while(PolyT1->next &&PolyT1->next->exp >= PolyB->next->exp) {s =(PolyList)malloc(sizeof(PolyNode)); s_pre->next = s; s->next=NULL; s->coef =PolyT1->next->coef/PolyB->next->coef; s->exp = PolyT1->next->exp - PolyB->next->exp; p->next = s; p = s; //PolyT2 =(PolyList)malloc(sizeof(PolyNode)); PolyT2 = PolySub(PolyT1 , PolyMutiply(PolyB , s_pre)); DestroyPolyList(PolyT1); PolyT1 = PolyT2; }//设置分隔结点 s=(PolyList)malloc(sizeof(PolyNode)); s->coef = 0; s->exp = 0; p->next = s; p = s;p->next = PolyT1->next; //将余项PolyT 复制到PolyC 中 free(PolyT1); return PolyC; }void main() {PolyList PolyA, PolyB , PolyC; //初始化PolyA ,PolyB ,以0结束 printf("*******多项式的创建*******\n");PolyA = CreatePolyList(); printf("输入的多项式A: "); DisplayPolyList(PolyA); printf("\n");PolyB = CreatePolyList();printf("输入的多项式B: "); DisplayPolyList(PolyB); printf("\n"); SortPoly(PolyA);printf("合并排序后的多项式A: "); DisplayPolyList(PolyA); SortPoly(PolyB);printf("合并排序后的多项式B: "); DisplayPolyList(PolyB);printf("*******多项式的四则运算*******\n");//PolyA + PolyBPolyC = PolyAdd(PolyA , PolyB); printf("A+B: ");DisplayPolyList(PolyC); DestroyPolyList(PolyC);//PolyA - PolyBPolyC = PolySub(PolyA , PolyB); printf("A-B: ");DisplayPolyList(PolyC); DestroyPolyList(PolyC);//PolyA*PolyBPolyC = PolyMutiply(PolyA , PolyB); printf("A*B: ");DisplayPolyList(PolyC); DestroyPolyList(PolyC); //PolyA/PolyBPolyC = PolyDivide(PolyA , PolyB); printf("A/B: ");DisplayPolyList(PolyC); DestroyPolyList(PolyC); }。

相关文档
最新文档