C++程序设计

题目15:一元多项式的加减
一元多项式的表示问题:对于任意一元多项式:
Pn(x)= P0+ P1X1+ P2X2+ … + PiXi+ … + PnXn
可以抽象为一个由“系数-指数”对构成的线性表,且线性表中各元素的指数项是递增的:
P=( ( P0,0), ( P1,1), ( P2,2), … , ( Pn,n) )
求减法!!万分感谢!!

这个是我去年做课程设计的时候做的
运行过
#include <stdio.h>
#include <malloc.h>
#include<iostream.h>
#include<string.h>

typedef struct LNode //多项式的存储结构定义
{
int coef;
int expn;
struct LNode *next;
}LNode,*polynomail;

void creatpolyn(polynomail &p,int m) //头插法创建多项式
{
int i;
int coef;
int expn;
polynomail s;
p=(polynomail)malloc(sizeof(LNode));
p->next=NULL;

for(i=1;i<=m;++i)
{
s=(polynomail)malloc(sizeof(LNode));
cout<<"请输入一元多项式的系数和指数:";
cin>>coef>>expn;
s->coef=coef;
s->expn=expn;
s->next=p->next;
p->next=s;
}
}

void printpolyn(polynomail p) //输出多项式单链表的元素值
{
p=p->next;
while(p!=NULL)
{
if(p->coef!=0)
cout<<p->coef<<"X^"<<p->expn<<"+ ";
p=p->next;
}
cout<<endl;
}

/*void SortPloy(polynomail L) //升幂排序
{
polynomail p=L->next,q,r;
if(p!=NULL)
{
r=p->next;
p->next=NULL;
p=r;
while(p!=NULL)
{
r=p->next;
q=L;
while(q->next!=NULL&&q->next->expn<p->expn)
q=q->next;
p->next=q->next;
q->next=p;
p=r;
}
}
}*/

void SortPloy(polynomail L) //升幂排序
{
polynomail p=L->next,q=p->next;
int coef,expn;
while(p!=NULL&&p->next!=NULL)
{
while(q!=NULL)
{
if(p->expn>q->expn)
{
coef=p->coef;expn=p->expn;
p->coef=q->coef;p->expn=q->expn;
q->coef=coef;q->expn=expn;
}
q=q->next;
}
p=p->next;
q=p->next;
}
}

void polyvalue(polynomail p,int x0) //求多项式的值
{ int i,s=1,t,r=0;
p=p->next;
while(p!=NULL)
{
for(i=1;i<=p->expn;i++)
{ s=s*x0;
}
t=s*p->coef;
r+=t;
s=1;
p=p->next;
}
cout<<r<<endl;
}

polynomail AddPoly(polynomail pa,polynomail pb) /*求两个多项式的和*/
{
SortPloy(pa);
SortPloy(pb);
polynomail rn,p1=pa->next,p2=pb->next,p,tc,s;
rn=(polynomail)malloc(sizeof(LNode)); /*新建头结点*rn*/
rn->next=NULL; /*rn为新建单链表的头结点*/
tc=rn; /*tc始终指向新建单链表的最后结点*/
while (p1!=NULL && p2!=NULL)
{
if (p1->expn<p2->expn) /*将*p1结点复制到*s并链到rn尾*/
{
s=(polynomail)malloc(sizeof(LNode));
s->coef=p1->coef;s->expn=p1->expn;s->next=NULL;
tc->next=s;tc=s;
p1=p1->next;
}
else if (p1->expn>p2->expn) /*将*p2结点复制到*s并链到rn尾*/
{
s=(polynomail)malloc(sizeof(LNode));
s->coef=p2->coef;s->expn=p2->expn;s->next=NULL;
tc->next=s;tc=s;
p2=p2->next;
}
else /*p1->expn=p2->expn的情况*/
{

s=(polynomail)malloc(sizeof(LNode));
s->coef=p1->coef+p2->coef;s->expn=p1->expn;
s->next=NULL;
tc->next=s;tc=s;

p1=p1->next;p2=p2->next;
}
}
if (p1!=NULL) p=p1; /*将尚未扫描完的余下结点复制并链接到rn单链表之后*/
else p=p2;
while (p!=NULL)
{
s=(polynomail)malloc(sizeof(LNode));
s->coef=p->coef;s->expn=p->expn;s->next=NULL;
tc->next=s;tc=s;
p=p->next;
}
tc->next=NULL; /*新建单链表最后结点的next域置空*/
return rn;
}

polynomail DelPoly(polynomail pa,polynomail pb) /*求两个多项式的差*/
{ SortPloy(pa);
SortPloy(pb);
polynomail tn,p1=pa->next,p2=pb->next,p,tc,s;
tn=(polynomail)malloc(sizeof(LNode)); /*新建头结点*tn*/
tn->next=NULL; /*tn为新建单链表的头结点*/
tc=tn; /*tc始终指向新建单链表的最后结点*/
while (p1!=NULL && p2!=NULL)
{
if (p1->expn<p2->expn) /*将*p1结点复制到*s并链到tn尾*/
{
s=(polynomail)malloc(sizeof(LNode));
s->coef=p1->coef;s->expn=p1->expn;s->next=NULL;
tc->next=s;tc=s;
p1=p1->next;
}
else if (p1->expn>p2->expn) /*将*p2结点复制到*s并链到tn尾*/
{
s=(polynomail)malloc(sizeof(LNode));
s->coef=-p2->coef;s->expn=p2->expn;s->next=NULL;
tc->next=s;tc=s;
p2=p2->next;
}
else /*p1->expn=p2->expn的情况*/
{

s=(polynomail)malloc(sizeof(LNode));
s->coef=p1->coef-p2->coef;s->expn=p1->expn;
s->next=NULL;
tc->next=s;tc=s;

p1=p1->next;p2=p2->next;
}
}
if (p1!=NULL) p=p1; /*将尚未扫描完的余下结点复制并链接到tn单链表之后*/
else
{ if(p2!=NULL)
{ s=(polynomail)malloc(sizeof(LNode));
s->coef=-p2->coef;s->expn=p2->expn;s->next=NULL;
tc->next=s;tc=s;
p2=p2->next;
p=p2;
}
else
{
p=NULL;
s->next=NULL;
tc->next=s;tc=s;
}

}
while (p!=NULL)
{
s=(polynomail)malloc(sizeof(LNode));
s->coef=p->coef;s->expn=p->expn;s->next=NULL;
tc->next=s;tc=s;
p=p->next;
}
tc->next=NULL; /*新建单链表最后结点的next域置空*/
return tn;
}

void save(polynomail p,int m) /*将多项式的系数和指数保存到外部文件中*/
{FILE *fp;
polynomail s;
char filename[10];
cout<<"请输入要保存的文件名,例如:c:\\score\n";
cin>>filename;
if((fp=fopen(filename,"w+"))==NULL) /*为输出打开一个二进制文件,为只写方式*/
{
printf("打不开文件Cannot open the file\n");
return; /*若打不开则返回菜单*/
}
printf("\n保存中...Saving the file......\n");
s=(polynomail)malloc(sizeof(LNode));
s=p->next;
while(s!=NULL)
{
fprintf(fp,"%d,%d\n",s->coef,s->expn); /*写入一条记录*/
s=s->next;
}
fclose(fp); /*关闭文件*/
printf("保存成功....Save the file successfully!\n");
}

polynomail read(int m) /*从保存的外部文件中读取多项式的系数和指数*/
{ int i;
int coef,expn;
char filename[20];
polynomail s,p;
p=(polynomail)malloc(sizeof(LNode));
p->next=NULL;
cout<<"请输入要读取的文件名,例如:c:\\score\n";
cin>>filename;
FILE* fp;
fp=fopen(filename, "r+");
for(i=1;i<=m;i++)
{s=(polynomail)malloc(sizeof(LNode));
fscanf(fp, "%d,%d", &coef, &expn);
cout<<coef<<","<<expn<<endl;
s->coef=coef;
s->expn=expn;
s->next=p->next;
p->next=s;
}
printpolyn(p);
return p;
}

void main()
{ int a=0;
while(a!=8)
{cout<<"--------------------菜单选项--------------------------------------------\n";
cout<<"******** 1、创建一元多项式Pn(x)和Qn(x) *********************************\n";
cout<<"******** 2、输出一元多项式Pn(x)和Qn(x) *********************************\n";
cout<<"******** 3、对一元多项式Pn(x)和Qn(x)进行升幂排序 ***********************\n";
cout<<"******** 4、对一元多项式Pn(x)和Qn(x)进行求值 ***************************\n";
cout<<"******** 5、对一元多项式Pn(x)和Qn(x)进行求和、差 ***********************\n";
cout<<"******** 6、将一元多项式Pn(x)和Qn(x)的系数和指数保存到外部文件 *********\n";
cout<<"******** 7、读取外部文件并创建一元多项式Pn(x)和Qn(x) *******************\n";
cout<<"******** 8、退出菜单 ***************************************************\n";
cout<<"------------------------------------------------------------------------\n";
cout<<"请输入你要选择的菜单选项:";
cin>>a;
switch(a)
{case 1: int m,n,x0,x1;
polynomail Pn,Qn,Rn,Tn;
cout<<"请输入一元多项式Pn的项数:";
cin>>m;
creatpolyn(Pn,m);
cout<<"已创建一元多项式Pn\n";
cout<<"请输入一元多项式Qn的项数:";
cin>>n;
creatpolyn(Qn,n);
cout<<"已创建一元多项式Qn\n";
break;

case 2: cout<<"原一元多项式Pn:";
printpolyn(Pn);
cout<<"原一元多项式Qn:";
printpolyn(Qn);
cout<<endl;
break;

case 3: SortPloy(Pn);
SortPloy(Qn);
cout<<"排序后的一元多项式Pn:";
printpolyn(Pn);
cout<<"排序后的一元多项式Qn:";
printpolyn(Qn);
cout<<endl;
break;

case 4: cout<<"请输入一元多项式Pn中的x0的值:";
cin>>x0;
cout<<"一元多项式Pn(x0)的值:";
polyvalue(Pn,x0);
cout<<endl;
cout<<"请输入一元多项式Qn中的x1的值:";
cin>>x1;
cout<<"一元多项式Qn(x1)的值:";
polyvalue(Qn,x1);
cout<<endl;
break;

case 5: Rn=AddPoly(Pn,Qn);
cout<<"一元多项式Pn,Qn相加结果Rn:";
printpolyn(Rn);
cout<<endl;
Tn=DelPoly(Pn,Qn);
cout<<"一元多项式Pn,Qn相减结果Tn:";
printpolyn(Tn);
cout<<endl;
break;

case 6: save(Pn,m);
save(Qn,n);
break;

case 7: cout<<"请输入一元多项式Pn的项数:";
cin>>m;
Pn=read(m);
cout<<"请输入一元多项式Qn的项数:";
cin>>n;
Qn=read(n);
break;

case 8: break;

default: cout<<"没有该菜单选项,请重新选择\n";
break;

}
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-06-27
#include<iostream>
using namespace std;
typedef struct NODE{
int num;//系数
int index;//次数
NODE* next;
NODE(int n,int i){num=n,index=i,next=NULL;} //构造函数
}node,*pnode;
class Poly
{
public:
pnode head,tail;
Poly(){//构造函数
head=tail=new node(0,0);
}

void init();
void insert(int,int);
void insert2end(int,int);
Poly add_and_minus(const Poly&,int);
void output();
void destroy();
friend Poly operator+(const Poly&,const Poly&);
friend Poly operator-(const Poly&,const Poly&);
friend ostream& operator<<(ostream&,Poly);
friend istream& operator>>(istream&,Poly&);
};
void Poly::init(){//初始化
cout<<"请输入多项式项数:"<<endl;
int n;cin>>n;
cout<<"请输入多项式的系数和次数比如 45*x^3 请输入45 3:"<<endl;
int num,index;
for(int i=1;i<=n;i++){
cin>>num>>index;
if(num)
insert(num,index);}
cout<<"下面是你输入的一元多项式:"<<endl;
output();
}
void Poly::insert(int num,int index){//顺序插入
pnode newone=new node(num,index);
pnode p=head;
while(p->next){
if(p->next->index>index){
newone->next=p->next;
p->next=newone;break;}
p=p->next;
}
if(!p->next){
p->next=newone;
tail=newone;}
}
void Poly::insert2end(int num,int index){//尾插法
pnode newone=new node(num,index);
tail->next=newone;
tail=newone;
}
void Poly::output(){//输出
pnode p=head->next;
if(!p){cout<<0<<endl;return;}
while(p){
if(p->index){
if(p->num!=1&&p->num!=-1){
if(p!=head->next)
cout<<(p->num>0?p->num:-p->num)<<" * ";
else cout<<p->num<<"*";
}
cout<<"x";
if(p->index!=1)
cout<<"^"<<p->index;
}
else cout<<p->num;
p=p->next;
if(p)
if(p->num>0)cout<<" + ";
else cout<<" - ";
}
cout<<endl;
}
Poly Poly::add_and_minus(const Poly& a,int st){//相加想减合成一个函数 st为1相加 为-1相减
pnode p=head->next;
pnode pa=a.head->next;
Poly c;int num,index;
while(p&&pa){//归并排序
if(p->index<pa->index)
num=p->num,index=p->index,p=p->next;
else if(p->index>pa->index)
num=st*pa->num,index=pa->index,pa=pa->next;
else
num=p->num+st*pa->num,index=p->index,p=p->next,pa=pa->next;
if(num)c.insert2end(num,index);
}
while(p)
c.insert2end(p->num,p->index),p=p->next;
while(pa)
c.insert2end(st*pa->num,pa->index),pa=pa->next;
return c;
}
void Poly::destroy(){//析构函数
pnode p=head;
while(p->next){
pnode pp=p->next;
p->next=pp->next;
delete pp;
}
delete head;
head=tail=NULL;
}
Poly operator+(Poly& a, Poly& b){//重载加法
return a.add_and_minus(b,1);
}
Poly operator-(Poly& a,Poly& b){//重载减法
return a.add_and_minus(b,-1);
}
ostream& operator<<(ostream& out,Poly a){//重载输出
a.output();
return out;
}
istream& operator>>(istream& in,Poly& a){//重载输入
a.init();
return in;
}
void add(){
Poly a,b;
cin>>a>>b;
cout<<"相加结果:"<<endl;
cout<<a+b<<endl;
}
void mus(){
Poly a,b;
cin>>a>>b;
cout<<"相减结果:"<<endl;
cout<<a-b<<endl;
}

void solve(){
char ch='y';
while(ch=='y'||ch=='Y'){
cout<<"***************************************"<<endl
<<"* 一元多项式加减法 *"<<endl
<<"***************************************"<<endl<<endl
<<"1 加法"<<endl
<<"2 减法"<<endl;
int n;cin>>n;
switch(n){
case 1:add();break;
case 2:mus();break;
default:cout<<"输入错误!"<<endl;break;
}
cout<<"继续?(y/n)"<<endl;
cin>>ch;
}
}

int main()
{
solve();
}
第2个回答  2010-06-27
楼主,这个好像很麻烦呀,你就20分就想弄到?本回答被提问者采纳
相似回答