
一元多项式的表示与相加运算.doc
7页 西 安 邮 电 大 学 (计算机学院)课内实验报告实验名称: 一元多项式的表示与相加运算 专业名称: 通信工程班 级: 通工1312 学生姓名: 周鹏飞学号(8位): 指导教师: 陈琳实验日期: 1. 实验目的及实验环境1、实现单链表的建立2、实现一元多项式的表示3、实现一元多项式的相加运算4、VC++6.0运行环境二. 实验内容1、实现一元多项式的相加运算三.方案设计为实现多项式的相加运算1)用两个单链表分别表示两个一元多项式2)多项式向相加的运算规则 指数相同项的对应系数相加,若和不为0,则构成“和多项式”中的一项 指数不相同的项仍按升幂顺序复抄到“和多项式”中 以单链表polya和polyb分别表示两个一元多项式A和B,A+B的求和运算,就等同于单链表的插入问题,因此“和多项式”中的结点无需另生成 为实现处理,设p、q分别指向单链表polya和poly b的当前项,比较p、q结点的指数项,由此得到以下运算规则: 若p->exp
若p->exp=q->exp,则将两个结点中的系数相加,当和不为0是修改结点p的系数域,释放q结点;若和尾0,则和多项式中无此项,从A中删去p结点,同时释放p和q结点若p->exp>q->exp,则结点q所指的结点应是“和多项式”中的一项,将结点q插入在结点p之前,且令指针q在原来的链表上后移四.测试数据及运行结果截图如下: 五.总结实验过程中遇到的问题及解决办法:问题:写完程序后,出现错误解决方法:查看程序提示,双击左键,寻找错误点找到错误,并进行修改 不能熟练运用链栈及指针 解决办法:查阅书籍,提高自己对链表及指针的认识,掌握使用链表及指针的技巧 对设计及调试过程的心得体会:(1) 编写的程序要按照正当的程序要求,不能遵循人的思维2) 编写程序时注意对链栈及指针的使用,注意各个出错的点及逻辑性错误3) 提高自己对链表与指针的认识 六.附录:源代码(电子版)实现代码如下: (1)建立多项式Polynomial * Create(void){ Polynomial *head, *rear, *s; int c, e; head = (Polynomial *)malloc(LEN); //建立多项式头结点 rear = head; //rear始终指向单链表的尾,便于尾插法建表 printf("系数(当系数输入为0时,多项式结束):"); scanf("%d",&c); printf("\n"); printf("指数:"); scanf("%d",&e); printf("\n"); while(c!=0) { s = (Polynomial *)malloc(LEN); s->cofe = c; s->expn = e; rear->next = s; rear = s; printf("系数(当系数输入为零时,多项式结束):"); scanf("%d",&c); printf("\n"); printf("指数:"); scanf("%d",&e); printf("\n"); } rear->next = NULL; return (head);}(2) 两多项式相加Polynomial* AddPolyn(Polynomial* pa,Polynomial* pb){ Polynomial *qa = pa->next; Polynomial *qb = pb->next; Polynomial *headc, *pc, *qc; pc=(Polynomial *)malloc(sizeof (Polynomial)); pc->next = NULL; headc = pc; while(qa != NULL&&qb != NULL) { qc = (Polynomial *)malloc(sizeof(Polynomial)); if(qa->expn < qb->expn) { qc->cofe = qa->cofe; qc->expn = qa->expn; qa = qa->next; } else if(qa->expn == qb->expn) { qc->cofe = qa->cofe+qb->cofe; qc->expn = qa->expn; qa = qa->next; qb = qb->next; } else { qc->cofe = qb->cofe; qc->expn = qb->expn; qb = qb->next; } if(qc->cofe != 0) { qc->next = pc->next; pc->next = qc; pc = qc; } else free(qc); } while(qa != NULL) { qc = (Polynomial *)malloc(sizeof (Polynomial)); qc->cofe = qa->cofe; qc->expn = qa->expn; qa = qa->next; qc->next = pc->next; pc->next = qc; pc = qc; } while(qb != NULL) { qc = (Polynomial *)malloc(sizeof (Polynomial)); qc->cofe = qb->cofe; qc->expn = qb->expn; qb = qb->next; qc->next = pc->next; pc->next = qc; pc = qc; } return (headc);} (3) 多项式的输出void PrintPolyn(Polynomial* p){ Polynomial* q; int flag = 1; q = p->next; if(!q) { putchar('0'); printf("\n"); return; } while(q) { if(q->cofe>0&&flag!=1) putchar('+'); if(q->cofe!=1&&q->cofe!=-1) { printf("%d",q->cofe); if(q->expn==1) putchar('X'); else if(q->expn) printf("X^%d",q->expn); } else { if(!q->expn) putchar('1'); else if(q->expn==1) putchar('X'); else printf("X^%d",q->expn); } if(q->cofe==-1) { if(!q->expn) printf("-1"); else if(q->expn==1) printf("-X"); else printf("-X^%d",q->expn); } q = q->next; flag++; } printf("\n");}(4) 主函数void main(void) { Polynomial * polya,* polyb, * q; printf("\t\t\t\t欢迎使用\n"); printf("\n请输入第一个多项式:\n\n"); polya=Create(); /*调用建立链表函数,创建多项式A*/ PrintPolyn(polya); printf("\n请输入第二个多项式:\n\n"); polyb=Create(); /*同理,创建B*/ PrintPolyn(polyb); printf("\n多项式的和为:\n\n"); q=AddPolyn(polya,polyb); /*调用一元多项式相加函数*/ PrintPolyn(q); /*调用输出函数,打印结果*/ printf("\n"); getch();}解决党委自身和基层党支部存在的的突出问题,发挥各村、社区、机关单位党支部在当前城市征迁、园区建设、招商引资、服务群众、维护稳定的作用,我镇党委高度重视,制定了切合临淮实际的活动实施方案,按照中央规定的活动步骤和要求扎实有效的开展了基层组织建设年活动。
