数据结构——链表—一元多项式的表示及相加
2017-10-14 13:55
585 查看
设计一个一元稀疏多项式简单计算器,要求基本功能:
(1)输入并建立多项式
(2)输出多项式
(3)两个多项式相加
(4)两个多项式相减
(1)输入并建立多项式
(2)输出多项式
(3)两个多项式相加
(4)两个多项式相减
/* 一元稀疏多项式简单计算器 计算两个一元多项式的加减 输入:两个多项式的项数,两个多项式每项的系数和指数、 输入时暂不支持自动排序,即必须按指数从小到大输入,指数最小为0 支持输入系数为零的项 last edit:2017年10月14日13点53分 */ #include<iostream> using namespace std; //每项的表示,作为多项式链表的数据元素 //多项式的最小次数不小于0 class polynomial { public : float coef;//多项式系数 int expn;//多项式指数 polynomial(float i=-1, int j=-1)//构造函数便于项的初始化 { coef = i; expn = j; } }; //多项式链表,每个节点包含一个数据元素和指向下个数据元素的指针 class linklistNode { public: polynomial data;//多项式的一项 linklistNode* next=NULL;//多项式的下一项的指针 linklistNode(float i=-1, int j=-1):data(i, j) {} }; //建立多项式链表 linklistNode* iniLinklist(int n, linklistNode* head) { linklistNode* p = new linklistNode(-1,-1);//作为头结点,次数为-1 head = p; for (int i = 0; i < n;i++ )//尾插法建立链表 { float coef; int expn; cout << "请输入第" << i + 1 << "项的系数和次数:"; cin >> coef >> expn; if (coef == 0)//考虑不小心系数输入为0的情况 continue; linklistNode* q = new linklistNode(coef, expn); p->next = q; p = q; } return head; } //打印链表 void printLinklist(linklistNode* head) { linklistNode* p = head->next; //第一项时原样输出 if (p->data.expn == 0)//常数项的特殊情况 cout << p->data.coef ; else if (p->data.coef != 1)//系数为1的特殊情况 cout << p->data.coef << "x^" << p->data.expn; else cout << "x^" << p->data.expn ; p = p->next; while (p != NULL) { if (p->data.coef > 0) { if (p->data.expn == 0)//常数项的特殊情况 cout << "+" << p->data.coef; else if (p->data.coef != 1)//系数为1的特殊情况 cout << "+" << p->data.coef << "x^" << p->data.expn; else cout << "+" << "x^" << p-> 4000 ;data.expn; p = p->next; } else if (p->data.coef < 0) { if (p->data.expn == 0)//常数项的特殊情况 cout << p->data.coef; else if (p->data.coef != -1)//系数为1的特殊情况 cout << p->data.coef << "x^" << p->data.expn; else cout << "-x^" << p->data.expn; p = p->next; } } } //多项式加法 linklistNode* addPolyn(linklistNode* headone, linklistNode* headtwo) { linklistNode *p = headone->next, *q = headtwo->next; linklistNode *pPre = headone;//指向p前面一个节点 while (p&&q) { if (p->data.expn < q->data.expn)//表达式1的项系数小于2的项,1的项后移 { pPre = p; p = p->next; continue; } else if (p->data.expn > q->data.expn)//表达式1的项系数大于2的项,把2的项连续在1的项的前一项和此项之间 { linklistNode *qn = q; q = q->next; pPre->next = qn; pPre = pPre->next; qn->next = p; continue; } else//系数相等,则相加 { p->data.coef = p->data.coef+ q->data.coef; if (p->data.coef == 0) { pPre->next = p->next;//系数相加为0,则删除节点 p = p->next; q = q->next; continue; } pPre = pPre->next; p = p->next; q = q->next; } } if (q != NULL)//如果多项式2还有剩余项,把他连接到表达式1的链尾 pPre->next = q; return headone; } //多项式减法 linklistNode* subPolyn(linklistNode* headone, linklistNode* headtwo) { linklistNode *p = headone->next, *q = headtwo->next; linklistNode *pPre = headone;//指向p前面一个节点 while (p&&q) { q->data.coef = 0- q->data.coef; if (p->data.expn < q->data.expn)//表达式1的项系数小于2的项,1的项后移 { pPre = p; p = p->next; q->data.coef = 0 - q->data.coef; continue; } else if (p->data.expn > q->data.expn)//表达式1的项系数大于2的项,把2的项连续在1的项的前一项和此项之间 { linklistNode *qn = q; q = q->next; pPre->next = qn; pPre = pPre->next; qn->next = p; continue; } else//系数相等,则相加 { p->data.coef = p->data.coef + q->data.coef; if (p->data.coef == 0) { pPre->next = p->next;//系数相加为0,则删除节点 p = p->next; q = q->next; continue; } pPre = pPre->next; p = p->next; q = q->next; } } if (q != NULL)//如果多项式2还有剩余项,把他连接到表达式1的链尾 { linklistNode *qf= q; while (qf != NULL) { qf->data.coef = 0 - qf->data.coef; qf = qf->next; } pPre->next = q; } return headone; } int main() { linklistNode *headone=NULL,*headtwo=NULL;//建立头结点 int n, m;//多项式项数 cout << "******一元稀疏多项式简单计算器******" << endl; cout << "请输入多项式1的项数:"; cin >> n; headone=iniLinklist(n, headone); cout << "多项式1为:"; printLinklist(headone); cout << endl<<endl; cout << "请输入多项式2的项数:"; cin >> m; headtwo=iniLinklist(m, headtwo); cout << "多项式2为:"; printLinklist(headtwo); cout << endl<<endl; cout << "*****菜单*****" << endl; cout << "*1、加法"<<endl; cout << "*2、减法" << endl; cout << "**************" << endl; cout << "请输入功能序号:"; int f; cin >> f; cout << endl; switch(f) { case 1: { cout << "多项式1为:"; printLinklist(headone); cout << endl; cout << "多项式2为:"; printLinklist(headtwo); cout << endl; cout << endl; cout<<"("; printLinklist(headone); cout << ") + ("; printLinklist(headtwo); cout << ")"<<endl<<"="; headone = addPolyn(headone, headtwo); printLinklist(headone); cout << endl; break; } case 2: { cout << "多项式1为:"; printLinklist(headone); cout << endl; cout << "多项式2为:"; printLinklist(headtwo); cout << endl; cout << endl; cout << "("; printLinklist(headone); cout << ") - ("; printLinklist(headtwo); cout << ")" << endl << "="; headone = subPolyn(headone, headtwo); printLinklist(headone); cout << endl; } } }
相关文章推荐
- 算法:一元多项式的表示及相加(链表实现)-数据结构(4)
- 数据结构——一元多项式的表示及相加
- 数据结构(11)线性表之一元多项式表示及相加
- 数据结构之线性结构-链表的应用(求两个一元多项式之和)
- 链表表示的 一元多项式,无参构造器,有参构造器,相加,遍历
- 用单链表表示一元多项式及相加相减相乘运算
- 数据结构实验之一元多项式相加
- 数据结构 一元多项式相加
- 数据结构课程设计一元多项式的相加和相乘
- 一元多项式的表示及相加 【链表的应用】
- 数据结构简明教程5版李春葆 单链表解决 多项式相加问题
- 数据结构(Data structure):用链表实现多项式的表示和运算(C语言)
- 17、数据结构笔记之十七链表实现多项式
- 数据结构之 队列 链表表示与数组表示
- 用链表实现一元稀疏多项式的相加
- 一元多项式的加减乘除运算,C++语言描述,数据结构实验
- 图解数据结构(1)——大圈表示法、动态数组和单向链表
- c语言版数据结构(奇迹冬瓜)-链表实战(3)解升序排列的一元多项式相加
- 图解数据结构(1)——大圈表示法、动态数组和单向链表
- 一元多项式的表示及相加(抽象数据类型Polynomial的实现)