#include <stdio.h>
#include <iostream>
using namespace std;
typedef struct node {
double coef;// 多项式系数
int exp;// 多项式指数
node* next;//下一个结点的指针变量(指针域)
}*poly;
//初始化多项式
void initPoly(poly& p) {
p = new node[1];//创建指针p存放第一个多项式
p->next = NULL;//p的下一个结点的指针为空
}
//创建一个多项式
void createPoly(poly& p) {
poly lastPtr = p;//最后一个结点为头结点
int exp; //多项式指数
double coef; //多项式系数
cout << "请输入多项式的指数:(输入的数为负数代表输入完毕)" << endl;
cin >> exp;
cout << "请输入多项式的系数:" << endl;
cin >> coef;
while (exp >= 0) {
//功能:实现向多项式的尾部添加一个新的项
poly newItem = new node[1];//创建一个新结点作为多项式的一项
newItem->exp = exp; //新结点的指数等于刚输入的指数
newItem->coef = coef; //新结点的系数等于刚输入的系数
newItem->next = lastPtr->next;
//最后一个结点的下一个指针域赋值给新结点的下一个指针域
lastPtr->next = newItem;//新结点赋值给最后一个结点的下一个指针域
lastPtr = newItem;//新结点更新为最后一个结点
cout << "请输入多项式的指数:(输入的数为负数代表输入完毕)" << endl;
cin >> exp;
cout << "请输入多项式的系数:" << endl;
cin >> coef;
}
cout<< "成功创建一个多项式" << endl;
}
//展示多项式
void displayPoly(poly p) {
p = p->next;
//当下一个结点不为空时
while (p) {
//完善表达式不完善的问题
if(p->coef==1){
if(p->exp==1) cout<<"x";
else if(p->exp==0) cout<<"1";
else cout<< "x^" << p->exp;
}
else if(p->coef==-1){
if(p->exp==1) cout<<"-x";
else if(p->exp==0) cout<<"-1";
else cout<< "-x^" << p->exp;
}
else if(p->coef>1) {
if(p->exp==0) cout << p->coef ;
else if(p->exp==1) cout<<"x";
else cout << p->coef << "x^" << p->exp;
}
else if(p->coef<-1){
if(p->exp==0) cout << p->coef;
else if(p->exp==1) cout<< p->coef<<"x";
else cout << p->coef << "x^" << p->exp;
}
//实现展示时出现系数有1的情况
//如果当前结点的下一个结点不为空时
if (p->next&&p->next->coef>0) {
cout << "+";
}
//实现+,-号的展示功能
//指向下一结点
p = p->next;
}
}
//两个多项式相加
void polyAdd(poly p1, poly p2) {
poly prep1;//定义一个p1的前一个结点
prep1 = p1;//p1的前一个结点为头结点
p1 = p1->next;// p1结点指向第一个结点
p2 = p2->next;// p2结点指向第一个结点
//当p1和p2均不为空时
while (p1 && p2) {
//如果p1和p2指数相同时
if (p1->exp == p2->exp) {
//如果p1和 p2的系数相加不为0时
if (p1->coef + p2->coef != 0) {
p1->coef += p2->coef;//将p1和p2的系数相加再赋值给p1的系数
p1 = p1->next;//p1指向下一个结点
p2 = p2->next;//p2指向下一个结点
prep1 = prep1->next;//prep1指向下一个结点
}
else {//如果p1和 p2的系数相加为0时
prep1->next = prep1->next->next;
//prep1的下下一个结点赋值给prep1的下一个结点
delete p1;//删除p1结点
p1 = prep1->next;//prep1的下一个结点赋值给p1
p2 = p2->next;//p2指向下一个结点
}
}
else if (p1->exp > p2->exp) {//如果p1指数大于p2的指数时
p1 = p1->next;//p1的下一个结点赋值给p1
prep1 = prep1->next;//prep1的下一个结点赋值给prep1
}
else if (p1->exp < p2->exp) {//如果p1指数小于p2的指数时
poly temp = p2->next;
//定义一个临时结点存放p2的下一个结点的地址
p2->next = prep1->next;
//prep1的下一个结点赋值给p2的下一个结点
prep1->next = p2;
//p2结点赋值给prep1的下一个结点
p2 = temp;
//临时结点temp赋值给p2
prep1 = prep1->next;//prep1指向下一个结点
}
}
//当p1为空,p2不为空时
if (p2) {
prep1->next = p2;
}
}
int main() {
poly p1;//定义p1结点
poly p2;//定义p2结点
initPoly(p1);//初始化第一个多项式
initPoly(p2);//初始化第二个多项式
createPoly(p1);//创建第一个多项式
createPoly(p2);//创建第二个多项式
polyAdd(p1, p2);//p1和p2两个多项式相加
displayPoly(p1);//展示相加后的结果
return 1;
}
在这里插入代码片
运行效果图:
例子:
实际运行截图: