求C++版的一元多项式相加实现程序?

要单链表的!!

第1个回答  2009-11-28
#include<stdio.h>
#include<malloc.h>

typedef struct node{//定义节点类型
float coef;
int expn;
struct node * next;
}PLOY;

void start()//用户选择界面
{
printf("************************************\n");
printf(" 两个一元多项式的相加/相加\n");
printf("************************************\n");
printf("请选择操作:\n");
printf("0.退出\n");
printf("1.两个一元多项式相加\n");
printf("2.两个一元多项式相乘\n");
printf("3.两个一元多项式相减\n");
printf("4.帮助\n");
}

void notice()//用户帮助界面
{
printf("\n");
printf("********************帮助*********************\n");
printf("1.以多项式每项系数和指数形式输入多项式,就像:2 3这样\n");
printf("2.输入:2 3代表多项式中一项系数是2,指数是3。\n");
printf("3.以输入:0 0结束输入该多项式;以多项式形式输出结果!");
printf("*********************************************\n");
}

void insert(PLOY *head,PLOY *inpt)//查找位置插入新链节程序
{
PLOY *pre,*now;
int signal=0;
pre=head;//pre定义为现在的前一个链节
if(pre->next==NULL) {pre->next=inpt;}
else {now=pre->next;
while(signal==0)
{
if(inpt->expn<now->expn)//当新链节小于现在的连接时向后移一个链节
{
if(now->next==NULL)
{
now->next=inpt;
signal=1;
}
else
{
pre=now;
now=pre->next;
}
}
else
if(inpt->expn>now->expn)//如果发现比现在的链节大了就插入到这个连接的前面
{
inpt->next=now;
pre->next=inpt;
signal=1;
}
else
{
now->coef=now->coef+inpt->coef;
signal=1;
free(inpt);//与当前链节相等指数
if(now->coef==0)
{
pre->next=now->next;
free(now);
}
}
}
}
}

PLOY *creat(char ch)//输入多项式
{
PLOY *head,*inpt;
float x;
int y;
head=(PLOY *)malloc(sizeof(PLOY));//创建链表头
head->next=NULL;
printf("请输入一元多项式%c:(格式是:系数 指数;以0 0 结束!)\n",ch);
scanf("%f %d",&x,&y);
while(x!=0)
{
inpt=(PLOY *)malloc(sizeof(PLOY));//创建新链节
inpt->coef=x;
inpt->expn=y;
inpt->next=NULL;
insert(head,inpt);//不然就查找位置并且插入新链节
printf("请输入一元多项式%c的下一项:(以0 0 结束!)\n",ch);
scanf("%f %d",&x,&y);
}
return head;
}

PLOY *addPLOY(PLOY *head,PLOY *pre)//多项式相加
{
PLOY *inpt;
int flag=0;
while(flag==0)
{
if(pre->next==NULL)
flag=1;//当现在指向空时跳出循环
else
{
pre=pre->next;
inpt=(PLOY *)malloc(sizeof(PLOY));//创建新链节
inpt->coef=pre->coef;
inpt->expn=pre->expn;
inpt->next=NULL;
insert(head,inpt);
}//否则把当前“g(x)”的链节插入到“y(x)”中
}
return head;
}

PLOY *minusPLOY(PLOY *head,PLOY *pre)//多项式相加
{
PLOY *inpt;
int flag=0;
while(flag==0)
{
if(pre->next==NULL)
flag=1;//当现在指向空时跳出循环
else
{
pre=pre->next;
inpt=(PLOY *)malloc(sizeof(PLOY));//创建新链节
inpt->coef=0-pre->coef;
inpt->expn=pre->expn;
inpt->next=NULL;
insert(head,inpt);
}//否则把当前“g(x)”的链节插入到“y(x)”中
}
return head;
}

PLOY *byPLOY(PLOY *head1,PLOY *head2)//多项式相乘
{
PLOY *inpt,*res,*pre;
int flag=0;
res=(PLOY *)malloc(sizeof(PLOY));//创建链表头
res->next=NULL;
head1=head1->next;
pre=head2;
while(flag==0)
{
if(pre->next==NULL)
{
pre=head2;//当现在指向空时跳出循环
head1=head1->next;
continue;
}
if(head1==NULL)
{
flag=1;//当现在指向空时跳出循环
continue;
}
pre=pre->next;
inpt=(PLOY *)malloc(sizeof(PLOY));//创建新链节
inpt->coef=pre->coef*head1->coef;
inpt->expn=pre->expn+head1->expn;
inpt->next=NULL;
insert(res,inpt);//把当前“g(x)”的链节插入到“y(x)”中
}
return res;
}

void print(PLOY *fun)//输出多项式
{
PLOY *printing;
int flag=0;
printing=fun->next;//正在被打印的链节
if(fun->next==NULL)//如果函数为空打印0
{
printf("0\n");
return;
}
while(flag==0)
{
if(printing->coef>0&&fun->next!=printing)
printf("+");//为正数时打印“+”号
if(printing->coef==1);//如果为“1”就不用打印系数了
else if(printing->coef==-1)
printf("-");//如果为“-1”就打印“-”号就行了
else
printf("%f",printing->coef);//其余情况都得打印
if(printing->expn!=0) printf("x^%d",printing->expn);//如果指数为“0”不打印指数项
else if((printing->coef==1)||(printing->coef==-1))
printf("1");
if(printing->next==NULL)
flag=1;//如果现在的链节没有下一个就结束
else
printing=printing->next;
}
printf("\n");
}

void main()
{
PLOY *f,*g;
int sign=-1;//设置标志
start();
while(sign!=0)
{
scanf("%d",&sign);
switch(sign)
{
case 0:
break;//退出
case 1:
{
printf("你选择的操作是多项式相加:\n");
f=creat('f');//输入多项式f(x)
printf("f(x)=");
print(f);
g=creat('g');//输入多项式g(x)
printf("g(x)=");
print(g);
printf("F(x)=f(x)+g(x)=");
f=addPLOY(f,g);//两个多项式相加
print(f);
sign=-1;//复位标志
start();//回复用户选择界面
break;
}
case 2:
{
printf("你选择的操作是多项式相乘:\n");
f=creat('f');//输入多项式f(x)
printf("f(x)=");
print(f);
g=creat('g');//输入多项式g(x)
printf("g(x)=");
print(g);
printf("F(x)=f(x)*g(x)=");
f=byPLOY(f,g);//两个多项式相加
print(f);
sign=-1;//复位标志
start();//回复用户选择界面
break;
}
case 3:
{
printf("你选择的操作是多项式相减:\n");
f=creat('f');//输入多项式f(x)
printf("f(x)=");
print(f);
g=creat('g');//输入多项式g(x)
printf("g(x)=");
print(g);
printf("F(x)=f(x)-g(x)=");
f=byPLOY(f,g);//两个多项式相加
print(f);
sign=-1;//复位标志
start();//回复用户选择界面
break;
}
case 4:
{
notice();
sign=-1;//复位标志
start();//回复用户选择界面
break;
}
default:
{
printf("输入有误!请重新选择操作!\n");//选择错误,返回选择界面
start();
break;
}
}
}
printf("谢谢使用!\n");
}

帮忙用Microsoft Visual C++ 6.0编写一个程序,题目是:一元多项式...
void print(node *p) \/\/输出函数,打印出一元多项式 { while(p->next!=NULL){ p=p->next;printf(" %d*x^%d",p->coef,p->exp);} } void polyadd(node *ha, node *hb)\/\/一元多项式相加函数,用于将两个多项式相加,然后将和多项式存放在多项式ha中,并将多项式hb删除 { node *p,*q,*...

多项式相加求值怎样用C++代码实现
多项式相加,也就是合并同类项。include <iostream> using namespace std;struct list { int coef;\/\/系数 int exp;\/\/指数 list *next;};list *Creat()\/\/创建带头结点的链表 { list *h,*r,*s;\/\/h是头结点,存放项的个数,指向第一项 r=h=new list;h->next=NULL;while(1){ s=new li...

数据结构(c++)一元多项式的代数运算
cout<<"\\t***一元多项式的简单运算***"<<endl; cout<<"\\t\\t 1创建要运算的两个一元多项式"<<endl; cout<<"\\t\\t 2将两个一元多项式相加"<<endl; cout<<"\\t\\t 3将两个一元多项式相减"<<endl; cout<<"\\t\\t 4将两个一元多项式相乘"<<endl; cout<<"\\t\\t 5显示两个一元多项式"<<endl; cou...

高分求助C++代码解释
两个一元多项式:A:a1x^n+a2x^(n-1)+...+anx+a(n+1)(a1,a2等等后面的数字表示下标,x^n表示x的n次幂。下同)B:b1x^m+b2x^(m-1)+...+bmx+b(m+1)它们相加,你只需要将指数相同的2项的系数相加,指数不变。比如3x^3+5x^3,它们的指数相同,根据刚刚说的系数相加指数不变结果就...

数据结构课程设计报告(一元多项式的计算)
【基本要求】能用链表实现一元多项式的加法计算,并能打印出计算结果。【所需知识】(1)基本编程方法和程序设计知识。(2)链表的理解和运算与运用。【所用算法】遍历算法和递归算法。【操作平台】Visual C++ include<stdio.h> include<graphics.h> define MAX 100 typedef struct polynode { ...

用C++写出以下程序一元多项式简单的计算器
void main(){ float a,b,c,s,x1,x2;double t;cout<<"请输入三个数字:a,b,c"<<endl;cin>>a>>b>>c;cout<<"方程"<<a<<"x*x"<<"+"<<c<<"x"<<"+"<<c<<"=0"<<"根如下:"<<endl;if(a==0.0)if(b!=0.0)cout<<"方程的根为:"<<-c\/b<<endl;else if (c==...

求“一元多项式运算类的设计与应用”C++源程序代码
\/\/输出多项式时必须考虑多项式系数为正、为0、和为1的情况 void priIAndc(unsigned int element,double value){ if(value) \/\/系数不是"0"{ if(element) \/\/指数不是"0"{ if(value==1) \/\/系数是"1",不用输出 cout<<"";else if(value==-1) \/\/系数是"-1",输出"-"cout<<"-";...

用C++编一个一元多项式计算器 大虾们 谢谢啦!!!
Polyn CreatePolyn(Polyn head,int m)\/\/建立一个头指针为head、项数为m的一元多项式 { int i;Polyn p;p=head=(Polyn)malloc(sizeof(struct Polynomial));head->next=NULL;for(i=0;i<m;i++){ p=(Polyn)malloc(sizeof(struct Polynomial));\/\/建立新结点以接收数据 cout<<"请输入第"<<i+...

用c\/c++写可以实现加减乘除的程序并且数值和运算字符由我自由赋予_百度...
\/* 多项式加法和乘法示例 *\/ include <list> include <iostream> include <cassert> using namespace std;\/\/定义多项式的项类 class term { public:int coef; \/\/多项式系数 int exp; \/\/多项式指数 \/\/初始化项的系数和指数 term( int c=0,int e=0):coef(c),exp(e){} };我有源...

求助C++编写———跳表的实现
【基本要求】一元多项式简单计算器的基本功能是:1,输入并建立多项式;2,输出多项式,输出形式为整数序列:n,c1,e1,c2,c2,...,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列;3,多项式a和b相加,建立多项式a+b;4,多项式a和b相减,建立多项式a-b.【测试数据】1...

相似回答
大家正在搜