任务:能够按照指数降序排列建立并输出多项式;能够完成两个多项式的相加、相减,并将结果输出;
要求:以链式存储结构实现多项式。
#include<cstdio>
#include<iostream>
using namespace std;
typedef struct PNode {
float coef;//系数
int expn;//指数
struct PNode *next;
}PNode,*Polynomial;
/**多项式的创建(有序)*/
void CreatPolyn(Polynomial &P,int n) {//传入多项式长度
printf(\"请输入各项的系数和指数:\\n\");
P=new PNode;//建立一个带头结点的单链表
P->next=NULL;
for(int i=1;i<=n;i++){//依次输入n个非零项
Polynomial s=new PNode;//创建一个新的结点
cin>>s->coef>>s->expn;//输入系数和指数
Polynomial pre=P;//用于保存q点的前驱,初始值为头结点
Polynomial q=P->next;//q的初始化,指向首元结点
while(q&&s->expn<q->expn){//找到小于s的项,将s插在这一项之前
pre=q;
q=q->next;
}
s->next=q;
pre->next=s;
}
}
/**打印某个多项式*/
void PrintPolyn(Polynomial &P){
Polynomial p=P;
while(p->next){
printf(\"%.0fx%d \",p->next->coef,p->next->expn);
p=p->next;
}
printf(\"\\n\");
}
/**多项式加法Pa=Pa+Pb*/
void AddPolyn(Polynomial &Pa,Polynomial &Pb){
//将两个链表合并成一个链表的过程(降序)
Polynomial p1=Pa->next;Polynomial p2=Pb->next;//p1,p2初值分别指向Pa和Pb的首元结点
Polynomial p3=Pa;//p3指向和多项式的当前结点,初值为Pa,Pa最后一个结点的前驱,合成的链中最后一个结点
while(p1&&p2){
if(p1->expn==p2->expn){
int sum=p1->coef+p2->coef;
if(sum!=0){
p1->coef=sum;//修改p1的系数
p3->next=p1;p3=p1;
p1=p1->next;
PNode *r=p2;p2=p2->next;delete r;//删除Pb中的结点
}
else{//系数和为零,Pa、Pb都删除
PNode *r=p1;p1=p1->next;delete r;
r=p2;p2=p2->next;delete r;
}
}
else if(p1->expn<p2->expn){//Pa当前结点指数小,要将Pb放在p3之后,p3后移
p3->next=p2;p3=p2;p2=p2->next;//p2继续指向Pb的下一个结点继续比较
}
else{//Pb当前结点的指数小,直接将Pa当前结点放在p3之后,p3后移
p3->next=p1;p3=p1;p1=p1->next;
}
}
//有一个链为空的时候
p3->next=p1?p1:p2;
delete Pb;//释放Pb的头结点
printf(\"两个多项式相加的结果为:\\n\");
PrintPolyn(Pa);
printf(\">>Enter键返回主界面\\n\");
system(\"pause\");
system(\"cls\");
}
/**多项式减法*/
void SubPolyn(Polynomial &Pa,Polynomial &Pb){
//将两个链表合并成一个链表的过程(降序)
Polynomial p1=Pa->next;Polynomial p2=Pb->next;//p1,p2初值分别指向Pa和Pb的首元结点
Polynomial p3=Pa;//p3指向和多项式的当前结点,初值为Pa,Pa最后一个结点的前驱,合成的链中最后一个结点
while(p1&&p2){
if(p1->expn==p2->expn){
int sum=p1->coef-p2->coef;
if(sum!=0){
p1->coef=sum;//修改p1的系数
p3->next=p1;p3=p1;
p1=p1->next;
PNode *r=p2;p2=p2->next;delete r;//删除Pb中的结点
}
else{//系数和为零,Pa、Pb都删除
PNode *r=p1;p1=p1->next;delete r;
r=p2;p2=p2->next;delete r;
}
}
else if(p1->expn<p2->expn){//Pa当前结点指数小,要将Pb放在p3之后,p3后移
p3->next=p2;p3=p2;p2=p2->next;//p2继续指向Pb的下一个结点继续比较
}
else{//Pb当前结点的指数小,直接将Pa当前结点放在p3之后,p3后移
p3->next=p1;p3=p1;p1=p1->next;
}
}
//有一个链为空的时候
p3->next=p1?p1:p2;
delete Pb;//释放Pb的头结点
printf(\"两个多项式相减的结果为:\\n\");
PrintPolyn(Pa);
printf(\">>Enter键返回主界面\\n\");
system(\"pause\");
system(\"cls\");
}
/**主界面*/
void Menu(){
printf(\"*********一元稀疏多项式的计算*********\\n\");
printf(\"**********1.一元多项式的加法**********\\n\");
printf(\"**********2.一元多项式的减法**********\\n\");
printf(\"****************3.退出****************\\n\");
printf(\"**************************************\\n\");
printf(\">>请输入您的选择(1-3):\");
int chose;
scanf(\"%d\",&chose);
switch(chose){
case 1:{
printf(\"请输入第一个多项式的项数:\");
int len1,len2;
scanf(\"%d\",&len1);
Polynomial Pa;
CreatPolyn(Pa,len1);
printf(\"请输入第二个多项式的项数:\");
scanf(\"%d\",&len2);
Polynomial Pb;
CreatPolyn(Pb,len2);
printf(\"第一个多项式为:\");
PrintPolyn(Pa);
printf(\"第二个多项式为:\");
PrintPolyn(Pb);
AddPolyn(Pa,Pb);
Menu();
}
case 2: {
printf(\"请输入第一个多项式的项数:\");
int len1,len2;
scanf(\"%d\",&len1);
Polynomial Pa;
CreatPolyn(Pa,len1);
printf(\"请输入第二个多项式的项数:\");
scanf(\"%d\",&len2);
Polynomial Pb;
CreatPolyn(Pb,len2);
printf(\"第一个多项式为:\");
PrintPolyn(Pa);
printf(\"第二个多项式为:\");
PrintPolyn(Pb);
SubPolyn(Pa,Pb);
Menu();
}
case 3: {
exit(0);
}
default : {
printf(\"请您输入正确的选择!\\n\");
system(\"pause\");
system(\"cls\");
Menu();
}
}
}
int main(){
Menu();
return 0;
}
继续阅读与本文标签相同的文章
-
Mybatis之discriminator(鉴别器)详解
2026-05-18栏目: 教程
-
前端进阶|第十一天 当全局变量,块变量,函数叫了同一个名字。。
2026-05-18栏目: 教程
-
Leetcode 542:01 矩阵 01 Matrix
2026-05-18栏目: 教程
-
LeetCode 733: 图像渲染 flood-fill
2026-05-18栏目: 教程
-
Spring Cloud Alibaba 实战(二) - 关于Spring Boot你不可不知道的实情
2026-05-18栏目: 教程
