一元多项式求和

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一元多项式求和——链表编程

一.实验名称:一元多项式求和——链表编程。

二.实验环境:Windows Xp ,Vc++6.0。

三.实验目的:

1.掌握一元多项式的链表式存储算法;

2.掌握链表的结构定义;

3.采用尾插法生成单链表。

四.实验内容:

1.一元多项式的表示:

一元多项式可按升幂的形式表示为

12012()n e e e n n P x p p x p x p x =++++……

其中:i e 为第i 项的指数,i p 是指数i e 的项的系数,且

121i n e e e e <=<=<=<=<=<=……。

则多项式()n P x 可以用一个线性表P 来表示:01(,)m P p p p =,?,;同理,多项式()n Q x 可表示为01(,,)n Q q q q =…(m

00111(,,,)m m m n R p q p p q q +=+++q ,?,?,q 。

2.一元多项式的链式存储:

1)链式存储的结点结构:

一元多项式中每一个非零项都由两部分构成——指数项和系数项。下面为结点结构的定义:

struct polynode

{ int coef;

int exp;

polynode *next;

} polynode, *polylist;

2)建立一元多项式链式存储的算法:

【算法思想】运用尾插法建立一元多项式的链表。以输入系数0为结束标准,并约定

建立一元多项式时,总是按指数从小到大的顺序排列。

算法如下:

polylist polycreate()

{ polynode *head,*rear,*s;

int c,e;

head=(polynode *)malloc(sizeof(polynode));

rear=head;

scanf("%d,%d",&c,&e);

while(c!=0)

{ s=(polynode *)malloc(sizeof(polynode));

s->codf=c;

s->exp=e;

rear->next=s;

rear=s;

scanf("%d,%d"&c,&e);

}

rear->next=NULL;

return(head);

}

3.多项式相加的运算规则:

【算法思想】以单链表polya和polyb分别表示两个一元多项式A和B,A+B,求和运算,就等同于单链表的插入问题。

为实现处理,设p、q分别指向单链表polya和polyb的当前项,比较它们结点的指数项,得到下列规则:

1)若(p->exp)<(q->exp),则结点p所指的结点应是“和多项式”中的一项,令指针p后移;

2)若(p->exp)=(q->exp),则将两个结点中的系数相加,当和不为0时修改结点p的系数域,释放q结点;若和为0,则多项式中无此项,从A中

删去p结点,同时释放p和q结点;

3)若(p->exp)>(q->exp),则结点q所指的结点应是“和多项式”中的一项,将结点q插入在结点p之前,且令指针在原来的链表上后移。

算法如下:

void polyadd(Polylist polya,Polylist polyb)

{

Polynode *p,*q,*tail,*temp;

int sum;

p=polya->next;

q=polyb->next;

tail=polya;

while(p!=NULL&&q!=NULL)

{ if(p->expexp)

{ tail->next=p;

tail=p;

p->next; }

else

if(p->exp==q->exp)

{ sum=p->coef+q->coef;

if(sum!=0)

{p->coef=sum;

tail->next=p;

tail=p;

p=p->next;

temp=q;

q=q->next;

free(temp); }

else

{ temp=p;

p->next;

free(temp);

temp=q;

q->next;

free(temp); }

}

else

{ tail->next=q;

tail=q;

q=q->next; }

if(p!=NULL)

tail->next=p;

else

tail->next=q;

}

五.程序及其运行结果:

#include

#include

#include

typedef struct Polynode //定义链表节点的数据类型

{

int coe;

int exp;

struct Polynode * next;

}Polynode,*Polylist;

Polylist polycreate() //创建一元多项式的链表

{

Polynode *r,*s,*h;

int c,e,i=1;

r=(Polynode*)malloc(sizeof(Polynode)); //建立多项式结点h=r;

printf("第%d项的系数和指数分别为:",i);

scanf("%d,%d",&c,&e); i++; //键入多项式的系数和指数项while(c!=0) //若c=0,则代表多项式的输入结束

{

s=(Polynode *)malloc(sizeof(Polynode)); //申请新的结点

s->coe=c;

s->exp=e;

h->next=s; //做插入

h=s;

printf("第%d项的系数和指数分别为:",i);

相关文档
最新文档