# c++设计一个一元稀疏多项式简单计算器

#include <iostream>

using namespace std;

struct Node {
float coef;
int expn;
Node *next;

};
void Copy(Node *&pc, Node *pa)//把一个链表的内容复制给另一个链表
{
Node *p,*q, *r;
pc = new Node;
pc->next = NULL;
r = pc;
p = pa;
while (p->next != NULL)
{
q = new Node;
q->coef = p->next->coef;
q->expn = p->next->expn;
r->next = q;
q->next = NULL;
r = q;
p = p->next;
}
}
void CreatPolynomial(Node *&head, int n)        //  生成带表头结点的单链表，除头结点外另生成n个结点
{
cout << "请输入各项系数及指数：" << endl;
for (int i = 0; i < n; i++) {
p->next = (Node *)new Node;  //  生成新结点，尾插入生成链表
p = p->next;
cin >> p->coef >> p->expn;
p->next = NULL;
}
}

{
if (head->next == NULL)                           //  结果是0时直接输出0
putchar('0');
else {
for (Node *p = head->next; p != NULL; p = p->next) {
if (p != head->next && p->coef >0)      //  当p非首项且指向的系数为正时才输出'+'
putchar('+');                       //  之前只判定了p->coef >0

if (p->coef == 1) {                       //  系数为1或-1时特殊处理
if (p->expn == 0)
putchar('1');                   //  判断条件不能写在一起：
}                                       // if(p->coef == 1 && p->expn == 0) putchar('1');
else if (p->coef == -1)
putchar('-');
else
cout << p->coef;

switch (p->expn) {                        //  指数为0或1时特殊处理

case 0:
break;

case 1:
putchar('x');
break;

default:
p->expn < 0 ? printf("x^(%d)", p->expn) : printf("x^%d", p->expn);  //  指数小于0时打括号
break;
}
}
}
cout << endl;
}

{
Node *q = NULL;
for (Node *p = head; p != NULL; p = q) {
q = p->next;
free(p);
}
}

char cmp(int a, int b)
{
if (a > b)
return '>';
if (a < b)
return '<';
return '=';
}

void AddPolynomial(Node *&pA, Node *&pB)        //  传进两个链表的头指针
{

Node *ha = pA;
Node *hb = pB;
Node *qa = ha->next;                     //  ha, hb分别跟在qa, qb的后一位置
Node *qb = hb->next;                    //  qa, qb分别指向Pa, Pb中当前比较元素
while (qa && qb)
{
float sum = 0;
int a = qa->expn;
int b = qb->expn;
switch (cmp(a, b)) {

case '<':
ha = qa;
qa = qa->next;                       //  非ha = ha->next;
break;

case '=':
sum = qa->coef + qb->coef;
if (sum != 0.0) {
qa->coef = sum;
ha = qa;
}
else {
if (ha->next != qa)
cout << "Error: ha->next != qa" << endl;
ha->next = ha->next->next;     //  删除和为0的结点，ha不变，还在qa后一位置
free(qa);
}
if (hb->next != qb)
cout << "Error: hb->next != qb" << endl;
hb->next = hb->next->next;
free(qb);
qb = hb->next;
qa = ha->next;
break;

case '>':
hb->next = hb->next->next;         //  删除qb指向的结点
qb->next = ha->next;              //  将qb插入ha后qa前
ha->next = qb;

qb = hb->next;                       //  not qb = ha->next
ha = ha->next;
break;

default:
cout << "Error!" << endl;
break;
}
}
if (qb)
ha->next = qb;
free(hb);
}
void SubPolynomial(Node *&pA, Node *&pB)        //  传进两个链表的头指针
{

Node *ha = pA;
Node *qb = pB;
;   Node *hb = qb->next;
Node *qa = ha->next;
while (hb!=NULL) {

hb->coef = -1*hb->coef;
hb = hb->next;
}
while (qa && qb)
{
float sum = 0;
int a = qa->expn;
int b = qb->expn;
switch (cmp(a, b)) {

case '<':
ha = qa;
qa = qa->next;                       //  非ha = ha->next;
break;

case '=':
sum = qa->coef - qb->coef;
if (sum != 0.0) {
qa->coef = sum;
ha = qa;
}
else {
if (ha->next != qa)
cout << "Error: ha->next != qa" << endl;
ha->next = ha->next->next;     //  删除和为0的结点，ha不变，还在qa后一位置
free(qa);
}
if (hb->next != qb)
cout << "Error: hb->next != qb" << endl;
hb->next = hb->next->next;
free(qb);
qb = hb->next;
qa = ha->next;
break;

case '>':
hb->next = hb->next->next;         //  删除qb指向的结点
qb->next = ha->next;              //  将qb插入ha后qa前
ha->next = qb;

qb = hb->next;                       //  not qb = ha->next
ha = ha->next;
break;

default:
cout << "Error!" << endl;
break;
}
}
if (qb)
ha->next = qb;
free(hb);

}

int main( )
{

Node *A = NULL;
Node *B = NULL;
int lenA;
int lenB;
int choose;
cout << "多项式加法请输入1" << endl;
cout << "多项式减法请输入2" << endl;

cin >> choose;

while (choose!=0) {

cout << "请输入A的项数：" << endl;
cin >> lenA;
CreatPolynomial(A, lenA);                   //  生成A链表
cout << "请输入B的项数：" << endl;         //  生成B链表
cin >> lenB;

switch (choose)
{
case 1:
CreatPolynomial(B, lenB);
cout << " A = ";                          //  输出A链表
PrintPolynomial(A);
cout << " B = ";                          //  输出B链表
PrintPolynomial(B);

AddPolynomial(A, B);                        //  A = A + B
cout << "A+B= ";
PrintPolynomial(A);                         //  输出和
cout << endl;

delete A;                                    //  务必释放结点
cout << "多项式加法请输入1" << endl;
cout << "多项式减法请输入2" << endl;
cout << "输入0退出" << endl;
cin >> choose;
break;

case 2:
CreatPolynomial(B, lenB);
cout << " A = ";                          //  输出A链表
PrintPolynomial(A);
cout << " B = ";                          //  输出B链表
PrintPolynomial(B);

SubPolynomial(A, B);                        //  A = A - B
cout << "A-B= ";
PrintPolynomial(A);                         //  输出差
cout << endl;

delete A;
cout << "多项式加法请输入1" << endl;
cout << "多项式减法请输入2" << endl;
cout << "输入0退出" << endl;
cin >> choose;
break;
}
}
return 0;
}