(2)一元多项式计算算法用类C语言表示:
Typedef struct00{ //项的表示,多项式的项作为LinkList的数据元素 Float coef; //细数 Int expn;//指数
}term,ElemType;//两个类型名:term用于本ADT,ElemType为LinkList的数据对象名
Typedef LinkList polynomial: //用带表头的节点的有序链表表示多项式 //基本操作的函数原型说明
Void CreatePolyn(polynomail&P);
//输入n的系数和指数,建立表示一元多项式的有序链表P 销毁一元多项式P Void DestroyPolyn(polynomailP); 销毁一元多项式P
voidPrintPoly(polynomail P); //打印输入一元多项式P
IntPolynLength(polynnomail P); //返回一元多项式P中的项数
void CreatPolyn(polynomail&Pa.polunomail&Pb);
//完成多项式相加运算,即:Pa=Pa+Pb,并贤惠一元多项式Pb voidSubtractPolyn(polunomail&Papolunomail&Pb);
//完成多项式相减运算,即:Pa=Pa-Pb,并销毁一元多项式Pb //基本操作的算法描述 Int cmp(tem a,temp b); //依a的指数值<(或=)(或>b的住数值,分别返回-1、0和+1 Void CreatePolyn(polynomail&P,int m){
//输入m项的系数和指数,建立表示一元多项式的有序链表P InitList(P); h=GetHead(P);
E.coef=0.0; e.expn=-1; SerCurElem(h,e);//设置头结点的数据元素 For (i=1;i<=m;++i) { //依次输入m个非零项 Scanf(e.coef,e.epn);
If(!LocateElem(P,e,q,(*cmp)())) {//当前链表中不存在该指数项 If(MakeNode(s,e)) InsFirst(q,s); //生成节点并插入链表 } }
}//CreatPolun
三、 详细设计
1、算法实现
(1)输入一元多项式函数:
void shuchu(pnode *head) {
pnode *p;
int one_time=1;
p=head;
while(p!=NULL) /*如果不为空*/ {
if(one_time==1) {
if(p->zhishu==0) /*如果指数为0的话,直接输出系数*/
printf(\如果系数是正的话前面就要加+号*/ else if(p->xishu==1||p->xishu==-1)
printf(\如果系数是1的话就直接输出+x*/ /*如果系数是-1的话就直接输出-x号*/
else if(p->xishu>0) /*如果系数是大于0的话就输出+系数x^指数的形式*/ printf(\
else if(p->xishu<0) /*如果系数是小于0的话就输出系数x^指数的形式*/ printf(\ one_time=0; } else{
if(p->zhishu==0) /*如果指数为0的话,直接输出系数*/ {
if(p->xishu>0)
printf(\如果系数是正的话前面就要加+号*/ }
else if(p->xishu==1) /*如果系数是1的话就直接输出+x号*/ printf(\
else if(p->xishu==-1) /*如果系数是-1的话就直接输出-x号*/ printf(\
else if(p->xishu>0) /*如果系数是大于0的话就输出+系数x^指数的形式*/ printf(\
else if(p->xishu<0) /*如果系数是小于0的话就输出系数x^指数的形式*/
printf(\ }
p=p->next; /*指向下一个指针*/ }
printf(\ }
(2)加法函数
/*两个多项式的加法运算*/
pnode * add(pnode *heada,pnode *headb) {
pnode *headc,*p,*q,*s,*r; /*headc为头指针,r,s为临时指针,p指向第1个多项式并向右移动,q指向第2个多项式并向右移动*/ float x; /*x为系数的求和*/
p=heada; /*指向第一个多项式的头*/ q=headb; /*指向第二个多项式的头*/
headc=(pnode *)malloc(sizeof(pnode)); /*开辟空间*/ r=headc;
while(p!=NULL&&q!=NULL) /*2个多项式的某一项都不为空时*/ {
if(p->zhishu==q->zhishu) /*指数相等的话*/ {
x=p->xishu+q->xishu; /*系数就应该相加*/ if(x!=0) /*相加的和不为0的话*/ {
s=(pnode *)malloc(sizeof(pnode)); /*用头插法建立一个新的节点*/ s->xishu=x;
s->zhishu=p->zhishu; r->next=s; r=s; }
q=q->next;p=p->next; /*2个多项式都向右移*/ }
else if(p->zhishu
s=(pnode *)malloc(sizeof(pnode)); s->xishu=q->xishu; s->zhishu=q->zhishu;
r->next=s; r=s;
q=q->next; /*q向右移动*/ }
else/*p的系数大于q的系数的话,就应该复制p节点到多项式中*/ {
s=(pnode *)malloc(sizeof(pnode)); s->xishu=p->xishu; s->zhishu=p->zhishu; r->next=s; r=s;
p=p->next; /*p向右移动*/ } }
/*当第2个多项式空,第1个数不为空时,将第一个数剩下的全用新节点产生*/ while(p!=NULL) {
s=(pnode *)malloc(sizeof(pnode)); s->xishu=p->xishu; s->zhishu=p->zhishu; r->next=s; r=s;
p=p->next; }
/*当第1个多项式空,第1个数不为空时,将第2个数剩下的全用新节点产生*/ while(q!=NULL) {
s=(pnode *)malloc(sizeof(pnode)); s->xishu=q->xishu; s->zhishu=q->zhishu; r->next=s; r=s;
q=q->next; }
r->next=NULL; /*最后指向空*/
headc=headc->next; /*第一个头没有用到*/ return headc; /*返回头接点*/ }
相关推荐: