多项式乘法与加法运算(链表实现)
来源:互联网 发布:淘宝联盟无法注册 编辑:程序博客网 时间:2024/05/16 05:39
#include<iostream>using namespace std;typedef struct PolyNode *Polynomial;struct PolyNode{ int coef; int expon; Polynomial link;};void Attach(int c, int e, Polynomial *pRear){ Polynomial P;//这里有点小问题,按理说应该动态申请一块空间,可是加上P=new PolyNode后编译错误...也没太弄懂 P->coef = c; P->expon = e; P->link = NULL; (*pRear)->link = P; (*pRear) = P;}Polynomial Polyread(){ int N,c,e; Polynomial Rear, P,t; cin >> N; P = new PolyNode; P->link = NULL; Rear = P; while (N--){ cin >> c >> e; Attach(c, e, &Rear); } t = P; P = P->link; delete t;//删除临时生成的头结点 return P;}Polynomial Add(Polynomial P1, Polynomial P2){ Polynomial t1, t2, Rear, P; t1 = P1; t2 = P2; P = new PolyNode; P->link = NULL; Rear = P; while (t1&&t2){ if (t1->expon > t2->expon){ Attach(t1->coef, t1->expon, &Rear); t1 = t1->link; } if (t1->expon < t2->expon){ Attach(t1->coef, t2->expon, &Rear); } if (t1->expon == t2->expon){ if (t1->expon + t2->expon){ Attach(t1->coef + t2->coef, t1->expon, &Rear); t1 = t1->link; t2 = t2->link; } } } return P;}Polynomial Mult(Polynomial P1, Polynomial P2){ Polynomial t1, t2, Rear, P,t; int c, e; if (!P1 || !P2) return NULL; t1 = P1; t2 = P2; P = new PolyNode; P->link = NULL; Rear = P; while (t2){ Attach(t1->coef*t2->coef, t1->expon + t2->expon, &Rear); t2 = t2->link; } t1 = t1->link; while (t1){ t2 = P2; Rear = P; while (t2){ e = t1->expon + t2->expon; c = t1->coef*t2->coef; while (Rear->link&&Rear->link->expon > e) Rear = Rear->link; if (Rear->link->expon == e){ if (Rear->link->coef + c) Rear->link->coef += c; else{ t = Rear->link; Rear->link = t->link; free(t); } } else{ t = new PolyNode; t->coef = c; t->expon = e; t->link = Rear->link; Rear->link = t; Rear = Rear->link; } t2 = t2->link; } t1 = t1->link;} t2 = P; P->link = t2->link; delete t2; return P;}void PrintPoly(Polynomial P){ int flag = 0; if (!P) cout << 0 << 0 << endl; while (P){ if (!flag) flag = 1; else cout << " "; cout << P->coef << P->expon; P = P->link; }}int main(){ Polynomial P1, P2, PP, PS; P1 = Polyread(); P2 = Polyread(); PP = Add(P1, P2); PrintPoly(PP); PS = Mult(P1, P2); PrintPoly(PS); return 0;}
代码并没有在编译器中实现,新手渣渣还在学习中,欢迎指正…
在网上看到的正确答案:
#include <iostream>#include <algorithm>#include <vector>using namespace std;typedef struct Term{ int coe;//系数 int exp;//指数 }Term;bool compare(Term a,Term b){ return a.exp>b.exp;}/*Term Mul(Term a,Term b){ a.coe = a.coe*b.coe; a.exp = a.exp+b.exp; return a;}*//*Term Add(Term a,Term b){ a.coe +=b.coe; return a;}*/void print(Term a){ cout<<a.coe<<" "<<a.exp<<" ";}int main(){ vector<Term> vec1; vector<Term> vec2; vector<Term> vec; vector<Term>::iterator it1,it2; int N1,N2; int coe,exp; bool flag = false; Term t; cin>>N1; while(N1--) { cin>>coe>>exp; t.coe = coe; t.exp = exp; vec1.push_back(t); } //for_each(vec1.begin(),vec1.end(),print); //system("pause"); cin>>N2; while(N2--) { cin>>coe>>exp; t.coe = coe; t.exp = exp; vec2.push_back(t); } //for_each(vec2.begin(),vec2.end(),print); //system("pause"); for (it1=vec1.begin();it1!=vec1.end();it1++) for (it2=vec2.begin();it2!=vec2.end();it2++) { t.coe = it1->coe * it2->coe; t.exp = it1->exp + it2->exp; if (t.coe!=0) vec.push_back(t); } sort(vec.begin(),vec.end(),compare); for (it1 = vec.begin();it1!=vec.end();it1=it2) { for (it2 = it1+1;it2!=vec.end() &&it1->exp==it2->exp;it2++) it1->coe += it2->coe; if (it1->coe!=0) { if (flag) cout<<" "; else flag = true; cout<<it1->coe<<" "<<it1->exp; } } if (vec1.size()==0) { cout<<"0 0"; } cout<<endl; flag = false; for (it1=vec1.begin(),it2=vec2.begin();it1!=vec1.end()&&it2!=vec2.end();) { if (it1->exp >it2->exp) { if (flag) cout<<" "; else flag = true; cout<<it1->coe<<" "<<it1->exp; it1++; } else if (it1->exp < it2->exp) { if (flag) cout<<" "; else flag = true; cout<<it2->coe<<" "<<it2->exp; it2++; } else { if ((it1->coe+it2->coe)) { if (flag) cout<<" "; else flag = true; cout<<it1->coe+it2->coe<<" "<<it1->exp; } it1++; it2++; } } if (it1==vec1.end()) { while(it2!=vec2.end()) { if (flag) cout<<" "; else flag = true; cout<<it2->coe<<" "<<it2->exp; it2++; } } if (it2==vec2.end()) { while(it1!=vec1.end()) { if (flag) cout<<" "; else flag = true; cout<<it1->coe<<" "<<it1->exp; it1++; } } if (flag==false) cout<<"0 0"; cout<<endl; //for_each(vec.begin(),vec.end(),print); //system("pause"); return 0;}
1 0
- 多项式乘法与加法运算(链表实现)
- 一元多项式加法与乘法运算链表实现
- 多项式乘法与加法运算
- 5-2 一元多项式的乘法与加法运算 (20分) (单向链表)
- 链表实现多项式加法和乘法
- 一元多项式的乘法与加法运算【Java实现--通过单项链表实现队列】
- 一元多项式的乘法与加法运算(20 分)
- 一元多项式的乘法与加法运算(20 分)
- 一元多项式的乘法与加法运算 (模拟)
- 一元多项式的乘法与加法运算(20 分)
- 一元多项式的乘法与加法运算(20 分)
- 一元多项式的乘法与加法运算
- 一元多项式的乘法与加法运算
- 一元多项式的乘法与加法运算
- 一元多项式的加法与乘法运算
- 一元多项式的乘法与加法运算
- 一元多项式的乘法与加法运算
- 一元多项式的乘法与加法运算
- 《View的事件体系》(三)弹性滑动
- J2SE-1 Java语言概述
- 【题解】dutoj1082 埃蒙的时空航道
- Linux Kernel设备驱动模型之绑定驱动到设备
- unity5怎样正确导入FBX,模型大小为什么会发生变化
- 多项式乘法与加法运算(链表实现)
- spring boot应用启动原理分析
- 华为oj初级 放苹果
- HTTP协议知识重点
- cer证书转换.p12文件
- leetcode_middle_95_105. Construct Binary Tree from Preorder and Inorder Traversal
- JDBC连接mysql数据库
- spark数据倾斜调优(二)
- 在linux下为mysql创建新的用户