**
一元稀疏多项式的计算(数据结构C++版)
**
[基本要求]
(1)能够按照指数降序排列建立并输出多项式(升序只需稍微改动一下代码);
(2)能够完成两个多项式的相加、相减,并将结果输出;
(3)以链式存储结构实现多项式。
[代码实现]
//测试数据:2 1 4 3 5 2 78 1 3 2 4 3 6 4
#include<iostream>
using namespace std;
typedef struct pnode
{//定义结构体
float xishu;
int zhishu;
struct pnode *next;
}pnode,*polynomial;
void createpolyn(polynomial &p, int n)
{//建立多项式的有序链表
p = new pnode;
p->next = NULL;
cout << "请输入系数和指数" << endl;
for (int i = 1; i <= n; i++){
pnode *s = new pnode;
cin >> s->xishu >> s->zhishu;
pnode *pre = p;//pre用于保存q的前驱,初值为头结点
pnode *q = p->next;//q初始化指向首元结点
while (q&&q->zhishu > s->zhishu) {
//升序只需改为q->zhishu<s->zhishu
pre = q;
q = q->next;
}
s->next = q;//s插入到pre与q之间
pre->next = s;
}
}
void print(polynomial &p)
{//打印
pnode *q;
q = p->next;
while(q&&q->next){
cout << q->xishu << "x^" << q->zhishu << "+";
q = q->next;
}
if (q->zhishu == 1)
cout << q->xishu << "x";
else
cout << q->xishu <<"x^" << q->zhishu;
}
void add(polynomial &pa, polynomial &pb)
{//相加与相减代码基本上一样
pnode *p1 = pa->next;
pnode *p2 = pb->next;
pnode *p3 = pa;
while (p1&&p2){
if (p1->zhishu == p2->zhishu) {
float sum = p1->xishu + p2->xishu;
if (sum != 0){
p1->xishu = sum;//修改pa当前节点的系数值
p3->next = p1;//将修改后的pa当前节点链在p3之后,
p3 = p1;//p3指向p1
p1 = p1->next;
pnode *r = p2;
p2 = p2->next;
delete r;//删除pb当前节点
}
else {//系数和为0删除结点
pnode *r;
r = p1;
p1 = p1->next;
delete r;
r = p2;
p2 = p2->next;
delete r;
}
}
else if (p1->zhishu > p2->zhishu) {//pa当前结点的指数值小
p3->next = p1;//p1链在p3之后
p3 = p1;
p1 = p1->next;
}
else {
p3->next = p2;
p3 = p2;
p2 = p2->next;
}
}
p3->next = p1 ? p1 : p2;
delete pb;
pnode *p4 = pa->next;
while (p4&&p4->next)
{
cout << p4->xishu << "x^" << p4->zhishu<<"+";
p4 = p4->next;
}
if (p4->zhishu == 1)
cout << p4->xishu<<"x";
else
cout<< p4->xishu << "x^" << p4->zhishu;
}
void cut(polynomial &pa, polynomial &pb)
{
pnode *p1 = pa->next;
pnode *p2 = pb->next;
pnode *p3 = pa;
while (p1&&p2) {
if (p1->zhishu == p2->zhishu) {
float sum = p1->xishu - p2->xishu;
if (sum != 0) {
p1->xishu = sum;
p3->next = p1;
p3 = p1;
p1 = p1->next;
pnode *r = p2;
p2 = p2->next;
delete r;
}
else {
pnode *r;
r = p1;
p1 = p1->next;
delete r;
r = p2;
p2 = p2->next;
delete r;
}
}
else if (p1->zhishu > p2->zhishu) {
p3->next = p1;
p3 = p1;
p1 = p1->next;
}
else {
p3->next = p2;
p3 = p2;
p2 = p2->next;
}
}
p3->next = p1 ? p1 : p2;
delete pb;
pnode *p4 = pa->next;
while (p4&&p4->next)
{
if (p4->next->xishu < 0)
cout << p4->xishu << "x^" << p4->zhishu;
else
cout << p4->xishu << "x^" << p4->zhishu << "+";
p4 = p4->next;
}
if (p4->zhishu == 1)
cout << p4->xishu<<"x";
else
cout << p4->xishu << "x^" << p4->zhishu;
}
int main()
{
polynomial pa;
polynomial pb;
int n;
cout << "请输入pa的项数" << endl;
cin >> n;
createpolyn(pa, n);
print(pa);
cout << endl;
int m;
cout << "请输入pb的项数" << endl;
cin >> m;
createpolyn(pb, m);
print(pb);
cout << endl;
cout << "请选择你要的功能" << endl;
cout << "1、pa与pb相加" << endl;
cout << "2、pa与pb相减" << endl;
int a;
cin >> a;
if(a==1)
add(pa, pb);
if(a==2)
cut(pa, pb);
cout << endl;
system("pause");
return 0;
}
[实现]