一元多项式求和——链表编程一.实验名称:一元多项式求和——链表编程。
二.实验环境: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<n )。
其和多项式可表示为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<q->exp){ tail->next=p;tail=p;p->next; }elseif(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;elsetail->next=q;}五.程序及其运行结果:#include<stdio.h>#include<malloc.h>#include<stdlib.h>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);scanf("%d,%d",&c,&e); i++;}h->next=NULL;return(r);}void polyadd(Polylist polya,Polylist polyb) //将两个多项式相加,然后将多项式存放在多项式polya中,并将多项式polyb删除{Polynode *p,*q,*pre,*temp;int sum;p=polya->next;q=polyb->next;pre=polya;while(p!=NULL&&q!=NULL){if(p->exp<q->exp) //如果p所指多项式项的指数小于q的,则将p结点加入到和多项式中{pre->next=p; //将p所指的结点赋给和多项式所在的链表pre=pre->next;p=p->next; //p继续指向下一个结点}else if(p->exp==q->exp)//若p和q的指数相等,则相应系数相加{sum=p->coe+q->coe; //系数相加if(sum!=0) // 若系数和非零,则系统和置入结点p,释放结点q,并将指针后移{p->coe=sum; //p所指结点的系数改为sumpre->next=p; pre=p;pre=pre->next;p=p->next;temp=q;q=q->next;free(temp); //释放结点q}else //若系数和为零,则删除结点p和q,并将指针指向下一个结点{temp=p;p=p->next;free(temp);temp=q;q=q->next;free(temp);}}else // p所指结点指数大于q 所指结点指数{pre->next=q; //将q所指结点赋给和多项式链表pre=pre->next;q=q->next; //q指向下一个结点}}if(p!=NULL) //若多项式中还有剩余,则将剩余的结点加入到和多项式中pre->next=p;else //否则,将B中的结点加入到和多项式中pre->next=q;}void print(Polylist p) //输出所有的项{while(p->next!=NULL){p=p->next;printf(" %d*x^%d+",p->coe,p->exp);}printf("\n");}main(){Polylist polya,polyb;printf("\n请输入第一个多项式各项的系数和指数,系数和指数为0表示输出完毕:\n");polya=polycreate();print(polya);printf("\n请输入第二个多项式各项的系数和指数,系数和指数0表示输出完毕:\n");polyb=polycreate();print(polyb);printf("\n两多项式的和是:\n");polyadd(polya,polyb);print(polya);printf("\n");}六.试验小结与交流:通过这次“多项式求和”实验,我熟悉并掌握了链表的建立,以及利用尾插法对初始化后的链表进行赋值操作。
但在将编好的程序在Vc6.0中运行时,常常会出错,以致不能运行出结果。
然后再回过头来认真检查程序,以期修改正确。
在该错中学习编程序的快乐。
[附带运行结果]:。