您的位置:首页 > 理论基础 > 数据结构算法

数据结构——链表—一元多项式的表示及相加

2017-10-14 13:55 585 查看
设计一个一元稀疏多项式简单计算器,要求基本功能:

(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;
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: