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
原创粉丝点击