1_简答的多项式运算
来源:互联网 发布:淘宝生意参谋标准版 编辑:程序博客网 时间:2024/03/29 12:49
2017-4-10 18:44:22 (转载)
最近再重新补上数据结构,看到数字的习题就练练手吧
书上要求的是用链表实现的,看着别人写的好的自己手打一遍,练练手
#include "stdafx.h"#include<conio.h> #include<stdlib.h>#include<iostream> using namespace std;struct Node {float coef; //系数 int exp; //指数 };typedef Node polynomial;//重命名 struct LNode{polynomial data;//链表类型 Node dataLNode *next;};typedef LNode* Link;void Create(Link &L, int n); //创建一个n项多项式函数 void Print(Link L); //输出链表函数 void Add(Link &pc, Link pa, Link pb); //多项式相加函数 void Substract(Link &pc, Link pa, Link pb);//多项式相减函数 void Copy(Link &pc, Link pa);//把一个链表的内容复制给另一个链表创建表函数 int Judge(Link pa, Link e);//判断指数是否与多项式中已存在的某项相同函数 void Destroy(Link& L){Link p;p = L->next;while (p != NULL){L->next = p->next;delete p;p = L->next;}delete L;L = NULL;}void Create(Link& L, int n)//创建有n个结点的多项式{if (L != NULL)Destroy(L);Link p, newp;//先定义两个链表L = new LNode();L->next = NULL;L->data.exp = -1;//头结点p = L;for (int i = 0; i < n; i++){newp = new LNode();cout << "请输入第" << i +1<< "项的系数和指数:" << endl;cout << "系数:";cin >> (newp->data).coef;cout << "指数:";cin >> (newp->data).exp;if (newp->data.exp<0) //判断指数是否为0,如果为0,销毁链表,从新输入 {cout << "您输入有误,指数不允许为负值!" << endl;delete newp;i--;continue;}newp->next = NULL;p = L;if (newp->data.coef == 0)//判断系数是否为0 {cout << "系数为零,重新输入!" << endl;delete newp;i--;continue;}while ((p->next != NULL) && ((p->next->data).exp<(newp->data).exp)) //利用while循环使p指向指数最小的项 {p = p->next;}if (!Judge(L, newp)){newp->next = p->next;p->next = newp;}else{cout << "输入的该项指数与多项式中已存在的某项相同,请重新创建一个正确的多项式" << endl;delete newp;Destroy(L);Create(L, n); //创建多项式没有成功,递归调用重新创建 break;}}}int Judge(Link L, Link e)//判断指数是否与多项式中已存在的某项相同 {Link p;p = L->next;while (p != NULL && (e->data.exp != p->data.exp))p = p->next;if (p == NULL)return 0;else return 1;}void Print(Link L)//输出链表 {Link p;if (L == NULL || L->next == NULL) //判断多项式是否为空 cout << "该一元多项式为空!" << endl;else{p = L->next;if ((p->data).coef>0) //项的系数大于的种情况 {if ((p->data).exp == 0) //输出指数为0项的系数 cout << (p->data).coef;else if ((p->data).coef == 1 && (p->data).exp == 1)cout << "x";else if ((p->data).coef == 1 && (p->data).exp != 1)cout << "x^" << (p->data).exp;else if ((p->data).exp == 1 && (p->data).coef != 1)cout << (p->data).coef << "x";else cout << (p->data).coef << "x^" << (p->data).exp;}//项的系数小于的种情况 if ((p->data).coef<0){if ((p->data).exp == 0)cout << (p->data).coef;else if (p->data.coef == -1 && p->data.exp == 1)cout << "-x";else if (p->data.coef == -1 && p->data.exp != 1)cout << "-x^" << p->data.exp;else if (p->data.exp == 1)cout << p->data.coef << "x";else cout << (p->data).coef << "x^" << (p->data).exp;}p = p->next;while (p != NULL){if ((p->data).coef>0){if ((p->data).exp == 0)cout << " " << (p->data).coef;else if ((p->data).exp == 1 && (p->data).coef != 1)cout << " " << (p->data).coef << "x";else if ((p->data).exp == 1 && (p->data).coef == 1)cout << " " << "x";else if ((p->data).coef == 1 && (p->data).exp != 1)cout << " " << "x^" << (p->data).exp;else cout << " " << (p->data).coef << "x^" << (p->data).exp;}if ((p->data).coef<0){if ((p->data).exp == 0)cout << (p->data).coef;else if (p->data.coef == -1 && p->data.exp == 1)cout << "-x";else if (p->data.coef == -1 && p->data.exp != 1)cout << "-x^" << p->data.exp;else if (p->data.exp == 1)cout << p->data.coef << "x";else cout << (p->data).coef << "x^" << (p->data).exp;}p = p->next;}}cout << endl;}void Copy(Link &pc, Link pa)//把一个链表的内容复制给另一个链表 {Link p, q, r;pc = new LNode;pc->next = NULL;r = pc;p = pa;while (p->next != NULL){q = new LNode;q->data.coef = p->next->data.coef;q->data.exp = p->next->data.exp;r->next = q;q->next = NULL;r = q;p = p->next;}}void Add(Link &pc, Link pa, Link pb)//两个一元多项式相加 {Link p1, p2, p, pd;Copy(p1, pa);Copy(p2, pb);pc = new LNode;pc->next = NULL;p = pc;p1 = p1->next;p2 = p2->next;while (p1 != NULL&&p2 != NULL){if (p1->data.exp<p2->data.exp)//比较指数大小,把两个一元多项式的项按指数递增序列排列 {p->next = p1;p = p->next;p1 = p1->next;}else if (p1->data.exp>p2->data.exp){p->next = p2;p = p->next;p2 = p2->next;}else //当指数相同时两系数相加 {p1->data.coef = p1->data.coef + p2->data.coef;if (p1->data.coef != 0)//找出系数为零的项并删除 {p->next = p1;p = p->next;p1 = p1->next;p2 = p2->next;}else{pd = p1;p1 = p1->next;p2 = p2->next;delete pd;}}}if (p1 != NULL){p->next = p1;}if (p2 != NULL){p->next = p2;}}void Substract(Link &pc, Link pa, Link pb)//两个多项式相减 {Link p, pt;Copy(pt, pb);//把pb复制在pt p = pt;while (p != NULL){(p->data).coef = (-(p->data).coef);//将系数取反 p = p->next;}Add(pc, pa, pt);//调用加法函数进行减法 Destroy(pt);}void Multiply(Link &pc, Link pa, Link pb)//将两个一元多项式相乘函数 {Link p1, p2, p, pd, newp, t;pc = new LNode;pc->next = NULL;p1 = pa->next;p2 = pb->next;while (p1 != NULL){pd = new LNode;pd->next = NULL;p = new LNode;p->next = NULL;t = p;while (p2){newp = new LNode;newp->next = NULL;newp->data.coef = p1->data.coef*p2->data.coef;newp->data.exp = p1->data.exp *p2->data.exp;t->next = newp;t = t->next;p2 = p2->next;}Add(pd, pc, p);Copy(pc, pd);p1 = p1->next;p2 = pb->next;Destroy(p);Destroy(pd);}}void division(Link &pc, Link pa, Link pb)//将两个一元多项式相除函数 {Link p1, p2, p, pd, newp, t;pc = new LNode;pc->next = NULL;p1 = pa->next;p2 = pb->next;while (p1 != NULL){pd = new LNode;pd->next = NULL;p = new LNode;p->next = NULL;t = p;while (p2){newp = new LNode;newp->next = NULL;newp->data.coef = p1->data.coef / p2->data.coef;newp->data.exp = p1->data.exp - p2->data.exp;t->next = newp;t = t->next;p2 = p2->next;}Add(pd, pc, p);Copy(pc, pd);p1 = p1->next;p2 = pb->next;Destroy(p);Destroy(pd);}}void Menu()//菜单函数 {cout << "" << endl;cout << endl;cout << "\t\t\t一元多项式的加减乘除运算" << endl;cout << "\t\t\t\t\t\t\t\t " << endl;cout << "\t\t 1 创建要运算的两个一元多项式\t\t " << endl;cout << "\t\t 2 将两个一元多项式相加\t\t\t " << endl;cout << "\t\t 3 将两个一元多项式相减\t\t\t " << endl;cout << "\t\t 4 将两个一元多项式相乘\t\t\t " << endl;cout << "\t\t 5 将两个一元多项式相除\t\t\t " << endl;cout << "\t\t 0 退出 " << endl;cout << "\t\t\t\t\t\t\t\t " << endl;cout << endl;cout << "\t\t 请选择:";}void main(){int n;Link L, La = NULL, Lb = NULL;//La,Lb分别为创建的两个多项式 int choose;while (1){Menu(); //调用菜单函数 cin >> choose;switch (choose){case 1:cout << "请输入你要运算的第一个一元多项式的项数:" << endl;cin >> n;Create(La, n);cout << "请输入你要运算的第二个一元多项式的项数:" << endl;cin >> n;Create(Lb, n);break;case 2:if (La == NULL || Lb == NULL){cout << "您的多项式创建有误,请重新选择……" << endl;break;}Add(L, La, Lb);cout << "" << endl;cout << "待相加的两个一元多项式为:" << endl;cout << "" << endl;cout << "A的多项式为:";Print(La);cout << "" << endl;cout << "B的多项式为:";Print(Lb);cout << "" << endl;cout << "相加后的结果为:";Print(L);cout << "" << endl;Destroy(L);break;case 3:Substract(L, La, Lb);cout << "相减的两个一元多项式为:" << endl;cout << "" << endl;cout << "A的多项式为:";Print(La);cout << "" << endl;cout << "B的多项式为:";Print(Lb);cout << "" << endl;cout << "相减后的结果为:";Print(L);cout << "" << endl;Destroy(L);break;case 4:if (La == NULL || Lb == NULL){cout << "您的多项式创建有误,请重新选择……" << endl;break;}Multiply(L, La, Lb);cout << "相乘的两个一元多项式为:" << endl;cout << "" << endl;cout << "A的多项式为:";Print(La);cout << "" << endl;cout << "B的多项式为:";Print(Lb);cout << "" << endl;cout << "相乘后的结果为:";Print(L);Destroy(L);cout << "" << endl;break;case 5:if (La == NULL || Lb == NULL){cout << "您的多项式创建有误,请重新选择……" << endl;break;}division(L, La, Lb);cout << "相除的两个一元多项式为:" << endl;cout << "" << endl;cout << "A的多项式为:";Print(La);cout << "" << endl;cout << "B的多项式为:";Print(Lb);cout << "" << endl;cout << "相除后的结果为:";Print(L);Destroy(L);cout << "" << endl;break;case 0:exit(1);Print(L);cout << "" << endl;break;}}}
0 0
- 1_简答的多项式运算
- 【数据结构_链表_List_1040】一元多项式加法运算的实现
- 链表_一元多项式的乘法与加法运算
- 一元多项式的运算
- 多项式的幂运算
- (编程训练)再回首,数据结构——链表上的编程训练_实现多项式运算
- 一元多项式的代数运算
- 一元多项式的相加运算
- 多项式mod的运算方法
- 多项式,矩阵的高次幂运算
- bzoj3323【scoi2013】多项式的运算
- 【SCOI2013】【BZOJ3323】多项式的运算
- BZOJ3323: [Scoi2013]多项式的运算
- PTA 7-1 一元多项式的乘法与加法运算
- 多项式运算
- 多项式运算
- 多项式运算
- 关于有规律的多项式的运算
- 苹果笔记本开机出现闪烁的问号文件夹解决方法
- 使用Spring实现读写分离( MySQL实现主从复制)
- java泛型概要
- Spring-4,IOC容器
- 使用归并思想查找数组中的逆序对的数量——Java实现
- 1_简答的多项式运算
- HTML5基础--新的选择器收集
- 算法竞赛入门经典 第二版 习题6-2 S树 S-Trees uva712
- 巴什博弈
- 知识点
- 欧拉函数
- java解惑(一)—表达式之谜
- RecyclerView嵌套问题ScrollView
- 自定义View起步:自定义属性二