一元多项式求和
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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->exp { 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);