3.数据结构--线性表之一元多项式的加法与乘法运算
2016-06-05 22:45
375 查看
设计一个函数,分别求出两个一元多项式的和与乘积
##输入样例
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
#输出结果
5 20 -4 4 -5 2 9 1 -2 0
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
##输入样例
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
#输出结果
5 20 -4 4 -5 2 9 1 -2 0
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
#include <iostream> using namespace std; typedef struct PolyNode *Polynomial; struct PolyNode { int coef; //系数 int expon; //指数 Polynomial next; }; int compare(int c1, int c2) { if (c1 > c2) return 1; else if (c1 < c2) return -1; else return 0; } void Attach(int c, int e, Polynomial &pRear) { Polynomial Tmp = new struct PolyNode; Tmp->coef = c; Tmp->expon = e; Tmp->next = NULL; pRear->next = Tmp; pRear = Tmp; } Polynomial ReadPoly() { int N; //读入项数 cin >> N; Polynomial L = new struct PolyNode; //生成头结点 L->next = NULL; Polynomial rear = L; while (N--) { int c, e; cin >> c >> e; Attach(c, e, rear); } Polynomial head = L->next; delete L; return head; } Polynomial ReadPoly_Decrease() //如果输入的不是按照递减的顺序,通过这个函数可以实现构造多项式是按照系数递减的顺序构造的 { int N; //读入项数 cin >> N; Polynomial L = new struct PolyNode; //生成头结点 L->next = NULL; while (N--) { int c, e; cin >> c >> e; Polynomial p = L; Polynomial Tmp = new struct PolyNode; Tmp->coef = c; Tmp->expon = e; Tmp->next = NULL; while (p->next && p->next->expon > e) //按照指数递减的顺序寻找读入的元素应该插入的位置 p = p->next; Tmp->next = p->next; p->next = Tmp; } Polynomial head = L->next; delete L; return head; } Polynomial Add(Polynomial P1, Polynomial P2) { Polynomial P3 = new struct PolyNode; P3->next = NULL; Polynomial rear = P3; while (P1 && P2) { switch (compare(P1->expon,P2->expon)) { case -1: //P2的指数较大 Attach(P2->coef, P2->expon, rear); P2 = P2->next; break; case 1: //P1的指数较大 Attach(P1->coef, P1->expon, rear); P1 = P1->next; break; case 0: if (P1->coef + P2->coef != 0) Attach(P1->coef + P2->coef, P1->expon, rear); P1 = P1->next; P2 = P2->next; break; default: break; } } rear->next = P1 ? P1 : P2; Polynomial head = P3->next; delete P3; return head; } Polynomial Mult(Polynomial P1, Polynomial P2) { Polynomial P3 = new struct PolyNode; P3->next = NULL; Polynomial rear = P3; Polynomial t1 = P1; Polynomial t2 = P2; while (t2) { Attach(t1->coef*t2->coef, t1->expon + t2->expon, rear); t2 = t2->next; } t1 = t1->next; while (t1) { t2 = P2; while (t2) { int c = t1->coef * t2->coef; int e = t1->expon + t2->expon; //找到正确的插入位置 Polynomial p = P3; while (p->next && p->next->expon > e) //按照指数递减的顺序寻找读入的元素应该插入的位置 p = p->next; Polynomial q = p->next; if(q && q->expon == e) //指数相等的情况 { if (q->coef + e != 0) //系数相加不为0 { q->coef += c; } else //系数的结果相加为0 { p->next = q->next; delete q; } } else { Polynomial Tmp = new struct PolyNode; //构造新的结点 Tmp->coef = c; Tmp->expon = e; Tmp->next = q; p->next = Tmp; } t2 = t2->next; } t1 = t1->next; } Polynomial head = P3->next; delete P3; return head; } void PrintPoly(Polynomial P) { int flag = 0; //标记是否为第一项 while (P) { if (!P) cout << "0 0" << endl; if (flag == 0) flag = 1; else cout << " "; cout << P->coef << " " << P->expon; P = P->next; } cout << endl; } int main() { Polynomial P1 = ReadPoly(); Polynomial P2 = ReadPoly(); PrintPoly(P1); PrintPoly(P2); Polynomial add_p1_p2 = Add(P1, P2); PrintPoly(add_p1_p2); Polynomial mult_p1_p2 = Mult(P1, P2); PrintPoly(mult_p1_p2); }
相关文章推荐
- Redis部分数据结构方法小结
- Redis中5种数据结构的使用场景介绍
- C 链式栈
- Java数据结构源码分析-Vector
- C单链表
- Java 数据结构之队列
- Java数据结构源码分析-LinkedList
- 数据结构之poj2388
- list_head数据结构分析
- 2.数据结构--线性表之链表实现
- 数据结构中的各种排序---总结篇
- Java 数据结构之栈的基本实现
- 数据结构实验之链表五:单链表的拆分
- Java数据结构源码分析-ArrayList
- Java 数据结构之数组的操作三:实现各种排序方法
- Java 数据结构之数组的操作二:数据插入与二分查找法
- uva11995 I Can Guess the Data Structure!(基本数据结构)
- 赫夫曼树和赫夫曼编码
- 赫夫曼树和赫夫曼编码
- 算法与数据结构 - 堆