这是一条多项式相加的代码,谁能每一条都解释一下什么意思! 多项式相加代码
一元多项式相加程序注释
实习报告示例
一、实习报告题头
题目: 一元稀疏多项式相加
班级: 信管199923301 姓名:丁一 学号:199935361
完成日期:2001-4-15
二、实习目的和要求
(1)进一步了解一元多项式抽象数据类型定义,掌握线性表的单链表存储结构形式。
(2)输入并建立多项式a和b;
(3)实现求和,即建立多项式c=a+b;
(4)输出和多项式,输出形式为整数序列:n,c1,e1,c2,e2,…,cn,en,其中n是多项式的项数,ci,ei分别是第i项的系数和指数,序列按指数升序排列
三、实习内容
设计一个程序,演示一元稀疏多项式相加的过程。
测试数据采用:A(x)=7+3x+9x8+5x17
B(x)= 8x+22x7-9x8
四、开发环境和工具
1、程序设计环境:计算机的外存:20G 内存: 128MB显示器的分辨率:1024*768打印机:hp DeskJet 640c
2、软件工具,windows 2000,visual c++
五、设计过程描述
设计中用带头结点的单链表存储一元多项式,多项式的项数存放在头结点;演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”后,由用户在键盘上输入多项式的项数及各项的系数和指数,然后进行相加运算,运算根据一元多项式相加的运算规则进行:
对于两个一元多项式中所有指数相同的项,对应指数相加,若其和不为零,则构成“和多项式”中的一项;对于两个一元多项式中所有指数不相同的项,则分别复抄到“和多项式”中去,复抄时应比较相应的指数值的大小,保证多项式序列的升序排列。
一元多项式的单链表存储结构形式如下:
typedef struct {
float coef;
int expn;
} term;
typedef struct Lnode {
term data;
struct Lnode *next;
} Lnode,*Linklist;
抽象数据类型一元多项式定义如下:
ADT Polynomial {
数据对象:D={ai|ai∈TermSet,I=1,2,…,m, m≥0 TermSet中的每个元素包含一个表示系数的实数和表示指数的整数 }
数据关系:R1={i-1,ai>| ai-1,ai∈D,且ai-1中的指数值< ai中的指数值,I=1,2,…n}
基本操作:CreatePolyn(&p,m)
操作结果:输入m项的系数和指数,建立一元多项式p.cmp(term a,term b) 依a的指数值<(或=)(或>b的指数值,分别返回-1,0,+1
AddPolyn(&pa,&pb)
初始条件:一元多项式pa和pb已存在。
操作结果:完成多项式相加运算,即pc=pa+pb.
PrintPolyn(P)
初始条件:一元多项式p已存在。
操作结果:打印输出一元多项式p
程序流程图如下:
七、附录(源程序代码)
#include
#include
typedef struct {
float coef;
int expn;
} term;
typedef struct Lnode {
term data;
struct Lnode *next;
} Lnode,*Linklist;
void main() {
Linklist L1;
Linklist L2;
Linklist L3;
void CreatPolyn(Linklist &L,int m);
void PrintPolyn(Linklist &pa,Linklist &pb,Linklist &pc,Linklist &L3);
int m1,m2;
cout<
cin>>m1;
cout<
cin>>m2;
CreatPolyn(L1,m1);
CreatPolyn(L2,m2);
CreatPolyn(L3,0);
Linklist pa,pb,pc;
pa=L1->next;
pb=L2->next;
pc=L3;
PrintPolyn(pa,pb,pc,L3);
} //主函数
void CreatPolyn(Linklist &L,int m) {
int i; Linklist p;
L=(Linklist)malloc(sizeof(Lnode));
L->next=NULL;
for(i=m;i>0;--i) {
p=(Linklist)malloc(sizeof(Lnode));
cout<
cin>>(p->data).coef>>(p->data).expn;
p->next=L->next;
L->next=p;
}
} //逆序创建带头结点单链表
int cmp(term a,term b) {
if(a.expn
else {
if(a.expn==b.expn) return 0;
else return 1;
}
} //比较指数项
void PrintPolyn(Linklist &pa,Linklist &pb,Linklist &pc,Linklist &L3) {
while(pa&&pb) {
term a,b; float sum;
a=pa->data;
b=pb->data;
switch(cmp(a,b)) {
case -1: pc=pc->next=(Linklist)malloc(sizeof(Lnode));
(pc->data).expn=a.expn;
(pc->data).coef=a.coef;
pa=pa->next;
break;
case 0: pa=pa->next;
pb=pb->next;
sum=a.coef+b.coef;
if(sum==0) break;
else {
pc=pc->next=(Linklist)malloc(sizeof(Lnode));
(pc->data).expn=a.expn;
(pc->data).coef=sum;
}
break;
case 1: pc=pc->next=(Linklist)malloc(sizeof(Lnode));
(pc->data).expn=b.expn;
(pc->data).coef=b.coef;
pb=pb->next;
break;
} //switch
} //while
if(!pa) {
pc->next=pb;
} else { pc->next=pa;
}
pc=L3->next;
while(pc) {
cout<<(pc->data).coef<<(pc->data).expn<
pc=pc->next;
}
}//进行加法运算并输出和多项式
八、测试结果
测试数据采用:A(x)=7+3x+9x8+5x17
B(x)= 8x+22x7-9x8
运行结果:
please input the length of linklist1:
4
please input the length of linklist1:
3
input the coef and expn:
5 17
9 8
3 1
7 0
-9 8
22 7
8 1
和多项式为:
7 0
11 1
22 7
5 17
C语言 多项式相加
/*为了一元多项式相加能够使用效率更高的算发,应该在多项式的排序操作中加入合并同类项,除非你可以保证输入不含有同类项*/
/*今天就这些吧,明天争取写出来,走了!*/
#include<stdio.h>
#include<stdlib.h>
typedef struct DXS{
float xs;
int zs;
struct DXS *next;
} multinomial;
//输入函数
multinomial *input(void)
{
multinomial *p,*h;
h=NULL;
printf("please input the xs and zs of the DXS:\n");
for(;;)
{
p=(multinomial *)malloc(sizeof(multinomial));
scanf("%f %d",&p->xs,&p->zs);
if(p->xs==0 && p->zs==0){free(p);break;}
p->next=h;
h=p;//从头部插入,没有问题
}
return(h);
}
//将多项式排序
multinomial *inorder(multinomial *h)
{
multinomial *s,*t,*m,*h3;
h3=h->next;//指向第二个结点
h->next=NULL;//拆下第e799bee5baa631333236396439一个结点,为什么?
while(h3!=NULL)
{
s=h3;
h3=h3->next;
t=h;
m=h;
while(s->zs<t->zs&&t!=NULL)
{
m=t;
t=t->next;
}
if(m=t)
{s->next=t;
h=s;
}
else
{
s->next=t;
m->next=s;
}
}
return(h);
}
//两个多项式相加
multinomial *add(multinomial *h1,multinomial *h2)
{
multinomial *u,*v,*w,*j;
w=h2;j=h2;
while(j!=NULL)
{
u=v=h1;w=j;
while(u->zs>w->zs&&u!=NULL)
{v=u;
u=u->next;
}
if(u->zs==w->zs) //指数相同,则系数相加
{
u->xs=u->xs+w->xs;
if(u->xs==0) //如果系数为0,则做删除操作
{
if(u=v) //删除表头
h1=h1->next;
}
else if(u->next==NULL) // 删除表尾
v=NULL;
else //删除表中
{
u=u->next;
}
}
else if(u=v) //待插入点在在表头
{
w->next=u;
h1->next=w;
}
else //待插入点不是在表头
{
w->next=u;
v->next=w;
}
j=j->next;
}
return(h1);
}
void print(multinomial *h1)
{
printf("f(x)=");
while(h1!=NULL)
{
printf("%f",h1->xs);
if(h1->zs!=0)
printf("x^%f",h1->xs);
else printf("%f",h1->xs);
h1=h1->next;
if(h1!=NULL&&h1->xs>0)
printf("+");
}
}
void main()
{multinomial *h1,*h2;
printf("输入第一个多项式的系数和指数(系数与指数之间用空格号隔开)");
h1=input();
printf("输入第二个多项式的系数和指数(系数与指数之间用空格号隔开");
h2=input();
h1=inorder(h1);
h2=inorder(h2);
h1=add(h1,h2);
print(h1);
}
c语言多项式相加
#include
#include
typedef struct node
{
float xi;
int n;
struct node *next;
}term;
void sort(term *head)
{
term *p,*q,*s;
p=(term *)malloc(sizeof(term));
q=(term *)malloc(sizeof(term));
s=(term *)malloc(sizeof(term));
p=head;
while(p->next!=NULL)
{
s=p->next;
while(s!=NULL)
{
if(p->n>s->n)
{
q->n=p->n;
p->n=s->n;
s->n=q->n;
q->xi=p->xi;
p->xi=s->xi;
s->xi=q->xi;
}
s=s->next;
}
p=p->next;
}
}
term *polynadd(term *head1,term *head2)
{
term *p,*q,*s,*r,*head3;
float x;
p=head1->next;
q=head2->next;
head3=(term *)malloc(sizeof(term));
r=head3;
while(p!=NULL&&q!=NULL)
{
if(p->n==q->n)
{
x=p->xi+q->xi;
if(x!=0)
{
s=(term *)malloc(sizeof(term));
s->xi=x;
s->n=p->n;
r->next=s;
r=s;
}
p=p->next;
q=q->next;
}
else if(p->n>q->n)
{
s=(term *)malloc(sizeof(term));
s->n=q->n;
s->xi=q->xi;
r->next=s;
r=s;
q=q->next;
}
else
{
s=(term *)malloc(sizeof(term));
s->n=p->n;
s->xi=p->xi;
r->next=s;
r=s;
p=p->next;
}
}
while(p!=NULL)
{
s=(term *)malloc(sizeof(term));
s->n=p->n;
s->xi=p->xi;
r->next=s;
r=s;
p=p->next;
}
while(q!=NULL)
{
s=(term *)malloc(sizeof(term));
s->n=q->n;
s->xi=q->xi;
r->next=s;
r=s;
q=q->next;
}
r->next=NULL;
return head3;
}
term *createpolyn(int m)
{
term *p,*head,*q;
int i;
head=(term *)malloc(sizeof(term));
q=head;
for(i=0;i { p=(term *)malloc(sizeof(term)); printf("请输入第%d项数的系数和指数\n",i+1); scanf("%f%d",&p->xi,&p->n); q->next=p; q=p; } p->next=NULL; return head; } dayin(term *head) { term *p,*q; q=head->next; if(q->xi==0) printf(" "); if(q->n==0&&q->xi>0&&q->xi!=1) printf("%0.2f",q->xi); if(q->n==0&&q->xi==1) printf("1"); if(q->n==0&&q->xi<0) printf("%0.2f",q->xi); if(q->n==1&&q->xi==1) printf("x"); if(q->n==1&&q->xi!=1&&q->xi>0) printf("%0.2fx",q->xi); if(q->n==1&&q->xi!=1&&q->xi<0) printf("%0.2fx",q->xi); if(q->n!=1&&q->n!=0&&q->xi>0&&q->xi!=1) printf("%0.2fx^%d",q->xi,q->n); if(q->n!=1&&q->n!=0&&q->xi<0) printf("%0.2fx^%d",q->xi,q->n); if(q->n!=0&&q->n!=1&&q->xi==1) printf("x^%d",q->n); p=q->next; while(p!=NULL) { if(p->xi==0) printf(" "); if(p->n==0&&p->xi>0&&p->xi!=1) printf("+%0.2f",p->xi); if(p->n==0&&p->xi==1) printf("+1"); if(p->n==0&&p->xi<0) printf("%0.2f",p->xi); if(p->n==1&&p->xi==1) printf("+x"); if(p->n==1&&p->xi!=1&&p->xi>0) printf("+%0.2fx",p->xi); if(p->n==1&&p->xi!=1&&p->xi<0) printf("%0.2fx",p->xi); if(p->n!=1&&p->n!=0&&p->xi>0&&p->xi!=1) printf("+%0.2fx^%d",p->xi,p->n); if(p->n!=1&&p->n!=0&&p->xi<0) printf("%0.2fx^%d",p->xi,p->n); if(p->n!=0&&p->n!=1&&p->xi==1) printf("+x^%d",p->n); p=p->next; } printf("\n"); } main() { int i,j; term *head1,*head2,*head3; printf("请输入第一个多项式的项数:\n"); scanf("%d",&i); head1=createpolyn(i); sort(head1); printf("\n"); dayin(head1); printf("\n"); printf("请输入第二个多项式的项数:\n"); scanf("%d",&j); head2=createpolyn(j); sort(head2); printf("\n"); dayin(head2); printf("\n\n"); head3=polynadd(head1,head2); sort(head3); printf("\n"); dayin(head3); printf("\n"); } #include<iostream> #include<fstream>//文件读入的头文件 #include<string>//字符串操作 using namespace std;谁能帮我写个数据结构多项式相加的代码啊
static char y;//全局变量用于判断多项式的未知数是否相同
int counting=0;//标记值
//节点的定义
typedef struct Node
{
double cof;
int exp;
struct Node *next;
}Node;
//类的定义
class DuoXiangShi
{
public:
DuoXiangShi(){};//构造函数
void InitDuoXiangShi(int n);//初始化多项式
DuoXiangShi operator +(DuoXiangShi &v);//加法
DuoXiangShi operator -(DuoXiangShi &v);//减法
void Show();//显示多项式
DuoXiangShi operator *(DuoXiangShi &v);//乘法
double get(double x);//获得定点函数值
void Sort();//对多项式排序
private:
int count;//多项式的项数
Node* Head;//头指针
};
void DuoXiangShi::InitDuoXiangShi(int n)
{
Node *ha,*hb;
double xishu;//系数
char c,d='+';
Head=(Node*)malloc(sizeof(Node));
//文件读入
ifstream inf("in.txt");
string line;
if(counting==1) getline(inf,line);
ha=Head;
cout<<"请输入一个一元多项式:";
for(int i=0;i<n;i++)
{
hb=(Node*)malloc(sizeof(Node));
ha->next=hb;
inf>>xishu;
if(xishu==0)//系数为0
{
cout<<"您输入的系数为0,输入错误!!!程序结束";
exit(-1);
}
if(d=='+')
hb->cof=xishu;
else if(d=='-')
hb->cof=-xishu;
else
{
cout<<"您输入的不是一元多项式(请不要采用省略写法)!!!程序结束";
exit(-1);
}
inf>>c>>hb->exp;
if(i==0)
y=c;
if(y!=c)//判断多项式的未知数是否相同
{
cout<<"您输入的不是一元多项式(变量个数是一个以上)!!!程序结束";
exit(-1);
}
ha=hb;
if(i!=n-1)
inf>>d;
hb->next=NULL;
}
count=n;//记录多项式的项数
}
void DuoXiangShi::Show()
{
Node *ha;
ha=Head;
ha=ha->next;
if(!ha) cout<<"0";//如果为空,值为零
else
{
while(ha!=NULL)
{
if(ha->exp)//指数为0,省略
{
if(ha->cof<0)
cout<<"(";
if(ha->cof!=1)//系数为1,省略
cout<<ha->cof;
cout<<y;
if(ha->exp!=1)//指数为1,省略
cout<<ha->exp;
if(ha->cof<0)
cout<<")";
}
else cout<<ha->cof;
if(ha->next)
cout<<"+";
ha=ha->next;
}
}
cout<<endl;
}
void DuoXiangShi::Sort()//冒泡排序
{
Node *ha,*hb,*pre;
int tempexp;
double tempcof;
for(int i=1;i<count;i++)
{
pre=Head;
ha=Head->next;
hb=ha->next;
for(int j=0;j<count-i;j++)
{
if(ha->exp>hb->exp)
{
tempexp=ha->exp; tempcof=ha->cof;
ha->exp=hb->exp; ha->cof=hb->cof;
hb->exp=tempexp; hb->cof=tempcof;
pre=ha;
ha=hb;
hb=hb->next;
}
else if(ha->exp<hb->exp)
{
pre=ha;
ha=hb;
hb=hb->next;
}
else//相等合并同类项
{
ha->cof+=hb->cof;
hb=hb->next;
ha->next=hb;
count--;
if(ha->cof==0)//系数为0,消项
{
ha=ha->next;
hb=hb->next;
pre->next=ha;
count--;
}
}
}
}
}
DuoXiangShi DuoXiangShi::operator +(DuoXiangShi &v)
{//加到hb中
Node *ha,*hb,*hc,*pre;
ha=Head->next;
hb=v.Head->next;
pre=v.Head;
while(ha&&hb)
{
if(ha->exp>hb->exp)//hb向后移
{
pre=hb;
hb=hb->next;
}
else if(ha->exp<hb->exp)//将ha添加到hb中
{
if(hb==v.Head->next)//若hb是第一个数据项
{
hc=ha->next;
v.Head->next=ha;
pre=ha;
ha->next=hb;
}
else//若hb不是第一个数据项
{
pre->next=ha;
hc=ha->next;
ha->next=hb;
pre=ha;
}
ha=hc;
}
else //相等合并同类项
{
hb->cof+=ha->cof;
count--;
if(hb->cof==0)////系数为0,消项
{
hb=hb->next;
pre->next=hb;
count--;
}
else
{
pre=hb;
hb=hb->next;
}
ha=ha->next;
}
}
if(ha)//若ha不为空
{
pre->next=ha;
}
v.count+=count;
return v;
}
DuoXiangShi DuoXiangShi::operator -(DuoXiangShi &v)
{//加到hb中
Node *ha,*hb,*hc,*pre;
ha=Head->next;
hb=v.Head->next;
pre=v.Head;
while(ha&&hb)
{
if(ha->exp>hb->exp)//hb向后移
{
pre=hb;
hb->cof=-hb->cof;
hb=hb->next;
}
else if(ha->exp<hb->exp)//将ha添加到hb中
{
if(hb==v.Head->next)//若hb是第一个数据项
{
hc=ha->next;
v.Head->next=ha;
pre=ha;
ha->next=hb;
}
else//若hb不是第一个数据项
{
pre->next=ha;
hc=ha->next;
ha->next=hb;
pre=ha;
}
ha=hc;
}
else //相等合并同类项
{
hb->cof=ha->cof-hb->cof;
count--;
if(hb->cof==0)////系数为0,消项
{
hb=hb->next;
pre->next=hb;
count--;
}
else
{
pre=hb;
hb=hb->next;
}
ha=ha->next;
}
}
if(ha)//若ha不为空
{
pre->next=ha;
}
while(hb)//若hb不为空,变号
{
hb->cof=-hb->cof;
hb=hb->next;
}
v.count+=count;
return v;
}
double DuoXiangShi::get(double x)
{
Node *ha;
ha=Head->next;
double y=0,z=1;
while(ha)
{
for(int j=0;j<ha->exp;j++)
{
z*=x;
}
z*=ha->cof;
y+=z;
z=1;
ha=ha->next;
}
return y;
}
DuoXiangShi DuoXiangShi::operator *(DuoXiangShi &v)
{
Node *ha,*hb,*NewHead,*hc,*hd,*he;
int i=0;
DuoXiangShi d;
NewHead=(Node*)malloc(sizeof(Node));
d.Head=NewHead;
hd=NewHead;
ha=Head->next;
hb=v.Head->next;
while(ha&&hb)
{
he=hb;
while(he)
{
hc=(Node*)malloc(sizeof(Node));
hc->next=NULL;
hd->next=hc;
hd=hc;
hc->cof=ha->cof*he->cof;
hc->exp=ha->exp+he->exp;
he=he->next;
i++;
}
ha=ha->next;
}
d.count=i;
d.Sort();
ha=d.Head->next;
hb->next=ha;
while(ha)//检查系数是否为0并消项
{
if(ha->cof==0)////系数为0,消项
{
ha=ha->next;
hb->next=ha;
d.count--;
}
else//不为0,后移
{
hb=ha;
ha=ha->next;
}
}
return d;
}
void menu()
{
system("cls");//清屏
system("color 0A");//菜单颜色
cout<<"\n\t\t菜单\n";
cout<<"\n1请输入一个一元多项式:\n";
cout<<"\n2加法运算\n";
cout<<"\n3减法运算\n";
cout<<"\n4乘法运算\n";
cout<<"\n5定点函数值\n";
cout<<"\n6退出系统\n";
}
void main()
{
DuoXiangShi D;
DuoXiangShi D1;
DuoXiangShi D2;
menu();//调用菜单函数
char c,d;
int flag=1;
while(flag)
{
menu();
cout<<" 请选择";
c=getchar();
cin.get(d);
if(d!='\n')
{cout<<"***输入错误****"<<endl;exit(-1);}
switch(c)
{
case '1':
int m;
cout<<"请输入多项式的项数"<<endl;
cin>>m;
D.InitDuoXiangShi(m);//项数
D.Sort();
D.Show();
counting=1;
cout<<"请输入多项式的项数"<<endl;
cin>>m;
D1.InitDuoXiangShi(m);
D1.Sort();
D1.Show();
system("pause");
getchar();
break;
case '2':if(counting==0)
{
cout<<"(请在进行加减运算时先进行'1'操作)!!!";
getchar();break;
}
D2=D+D1;
D2.Show();
counting=0;
system("pause");
break;
case '3':if(counting==0)
{
cout<<"(请在进行加减运算时先进行'1'操作)!!!";
getchar();
break;
}
D2=D-D1;
D2.Show();
counting=0;
system("pause");
break;
case '4':if(counting==0)
{
cout<<"(请在进行加减运算时先进行'1'操作)!!!";
getchar();
break;
}
D2=D*D1;
D2.Show();
counting=0;
system("pause");
break;
case '5':
cout<<"请输入多项式的项数:";
cin>>m;
D.InitDuoXiangShi(m);//项数
D.Sort();
D.Show();
cout<<"请输入未知数的值:";
cin>>m;
cout<<D.get(m)<<endl;//定点x的值
system("pause");
getchar();
break;
case '6':flag=0;
cout<<"\n ***The End***\n";
break;
default:cout<<"\n Wrong Selection!\n";
getchar();
}
}
}