数据结构,多项式运算,C++,链表
来源:互联网 发布:java实现弹出窗口保存 编辑:程序博客网 时间:2024/06/07 03:24
#include<iostream> #include<conio.h> #include<stdlib.h> //标准库头文件包含函数exit() using namespace std; struct Node //建立结构体 { float coef; //项式系数 int exp; //项式指数 }; typedef Node polynomial;//重命名 struct LNode { polynomial data;//链表类型 LNode *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) { L->next = p->next; delete p; p = L->next; } delete L; L = NULL; } void Create(Link &L, int n)//创建含有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 = 1; i <= n; i) { newp = new LNode;//申请新节点 cout << "请输入第" << i << "项的系数和指数:" << 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\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
- 数据结构,多项式运算,C++,链表
- 数据结构_1_多项式运算
- 数据结构一元多项式运算分析
- 【数据结构】用链表实现多项式运算
- 【数据结构_链表_List_1040】一元多项式加法运算的实现
- 数据结构之多项式(C++)
- 数据结构 单链表的应用:多项式及其运算
- 数据结构--线性表--一元多项式加法运算
- 数据结构实验:一元多项式的运算
- 数据结构:求两个多项式的相加运算
- 【数据结构】链表:多项式加法
- 用单链表实现多项式运算(ANSI C)
- 多项式加减运算—c语言描述
- 一元多项式加减法运算[C语言]
- 数据结构C语言版:一元多项式相乘
- 多项式运算
- 多项式运算
- 多项式运算
- [数据结构]Hash表初学(数组链表)
- 一元多项式的加减乘除运算,C++语言描述,数据结构实验
- 14 Best Open Source Web Application Vulnerability Scanners
- iOS开发之xib技巧介绍
- 软件
- 数据结构,多项式运算,C++,链表
- C/C++语言,对MSB、LSB的读/取处理
- C语言程序初体验-第十一课-第四题:玩数字
- JFreeChart(四.折线图.1)
- Unity5.1.1 AssetBundle的相关理解
- createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
- hibernate总结-映射
- 校验码——揭开海明校验码求解之谜
- java的join和yield方法处理线程顺序执行