1. 首页 > 科技

这是一条多项式相加的代码,谁能每一条都解释一下什么意思! 多项式相加代码

这是一条多项式相加的代码,谁能每一条都解释一下什么意思!多项式相加代码

一元多项式相加程序注释

实习报告示例

一、实习报告题头

题目: 一元稀疏多项式相加

班级: 信管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();

  }

 }

}