}
while(p!=NULL&&q==NULL) {
coef[i]=p->coef; xexp[i]=p->xexp; yexp[i]=p->yexp; i++;
p=p->next; }
while(q!=NULL&&p==NULL) {
coef[i]=q->coef; xexp[i]=q->xexp; yexp[i]=q->yexp; i++;
q=q->next; }
CreateList(L3,coef,xexp,yexp,i); sort(L3); }
4、减法
两个多项式的相减算法和加法函数很类似,主要思想是先将链表B取负,然后执行和加法算法一样的步骤,最后交给排序函数做一次降序排序。
5、显示
显示的格式是:a1*x^b1y^c1+a2*x^b2y^c2+a3*x^b3y^c3+a4*x^b4y^c4 根据依次读入的数据进行显示
6、选择菜单
主要提供用户选择(包含退出功能),两个多项式的和以及两个多项式的差的运算。
4、上机调试过程
1、语法错误及修改
由于本算法使用了链表的方式建立二元多项式,所以程序的空间是动态的生成的,而且链表可以灵活地添加或删除结点,所以使得程序得到简化。出现的语法问题主要在于子函数和变量的定义,降序排序,关键字和函数名称的书写,以及一些库函数的规范使用,这些问题均可以根据编译器的警告提示,对应的将其解决。 2、逻辑问题及其调整
编写程序的过程中遇到许多问题,首先在选择数据结构的时候选择了链表,但是链表的排序比较困难,特别是在多关键字的情况下,在一种关键字确定了顺序以后,在第一关键字
相同的时候,按某种顺序对第二关键字进行排序。在此程序中共涉及到3个量数,即:系数,x的指数和y的指数,而关键字排是按x的指数和y的指数来看,由于要求是降幂排序且含有2个关键字,所以我先选择x的指数作为第一关键字,先按x的降序来排序,当x的指数相同时,再以y为关键字,按照y的指数大小来进行降序排列。
在加法函数的编写过程中也遇到了大量的问题,由于要同时比较多关键字,而且设计中涉及了数组和链表的综合运用,导致反复修改了很长的时间才完成一个加法的设计,现在仍然有一个问题存在,若以0为系数的项是首项则显示含有此项,但是运算后则自动消除此项,这样是正确的。但是当其不是首项的时候,加法函数在显示的时候有0为系数的项时,0前边不显示符号,当然,这样也可以理解成当系数为0时,忽略这一项。 3、时间,空间性能分析
链表的建立使用的是头插法建表,时间复杂度为O(n),本程序采用链表存储。单链表的每个结点都有一个指针空间,相当于总共增加了n个整型变量,在空间复杂度上为O(n)。加法函数的时间复杂度取决于多项式A和B的项数,若A有n项而B有m项,那么本算法的时间复杂度为O(n+m),空间复杂度为O(n+m),减法函数由于与加法函数结构相同,只是符号改换,故而时间空间复杂度同加法函数,分别为时间O(n+m),空间O(n+m)。
在设计减法函数的时候由于考虑不够充分就直接编写程序,走了很多弯路,不得不停下来仔细研究算法,后来发现由于前边的加法函数完全适用于减法,只不过是将二元多项式B的所有项取负再用加法函数即可,可见算法的重要性不低于程序本身。
4、经验和体会
在调试过程中,发生了许多小细节上的问题,提醒了我在以后编程的时候要注意细节,即使是一个括号的遗漏或者一个字符的误写都会造成大量的错误,浪费许多时间去寻找与修改,总结的教训就是写程序的时候要仔细。
还有一个体会就是格式和注释,由于平时不注意格式和注释,导致有的时候检查和调试的时候很不方便,有的时候甚至刚刚完成一部分的编辑,结果一不注意,忘记了这一部分程序的功能,修改的时候也有不小心误删的情况出现。如果注意格式风格和养成随手加注释的习惯,就能减少这些不必要的反复和波折。还有就是在修改的时候,要注意修改前后的不同点在哪里,改后调试结果要在原有的基础上更加精确。
5、测试结果及其分析。
按照前述提供的测试用例输入程序进行结果测试。测试结果如下:
这一组数据设置为系数不同而x和y的指数各自相同,结果是程序合并同类项,两个多项式的x和y的指数相同的项的系数相加成为新的多项式,均与试验结果中的数据相同
(注:程序的运行结果截图在下一页)
由此,第一组指数相同的2个多项式成功完成运算。
下面,我来用第二组数据来进行测试。这一组数据设置为系数相同而x和y的指数各自不相同,结果是程序找不到同类项,按两个多项式的x和y的指数排列相加成为新的多项式。由于没有同类项,所以只好依次相加所有的项。
(注:程序的运行结果截图在下一页)
由此,第二组指数不同的2个多项式成功完成运算。
6、用户使用说明
用户使用之前需要设置MAX的值,如果不需要改变原始的设置,直接打开“二元多项式计算.exe”,界面欢迎使用二元多项式加减计算器,一次性输入第一个多项式所有的系数,按enter输入,再一次性输入x的指数和y的指数,接着是重复前一系列步骤输入第二个多项式的所有信息,按enter输入。
程序自动降幂排列第一个和第二个多项式,并分别为用户表示出来,然后程序提示菜单为:
1、两个多项式的和 2、两个多项式的差 0、退出 用户根据需要键入选项,程序将为用户分别显示这两个多项式的1、两个多项式的和或2、两个多项式的差。用户如有需要记录,可以自行记录结果。最后提醒:本程序不提供文件保存的功能。
7、参考文献
[1] 王昆仑 李红 《数据结构与算法》 中国铁道出版社,2007年6月第1版 [2] 潭浩强 《C程序设计》 清华大学出版社,2005年7月第3版
[3] 潭浩强 《C程序设计题解与上机指导》 清华大学出版社,2005年7月第3版 [4] 郑莉 董渊 张瑞丰 《C++语言程序设计》 清华大学出版社,2003年12月第3版 [5] 严蔚敏 吴伟民 《数据结构》 清华大学出版社,1997年4月第1版
[6] 严蔚敏 吴伟民 米宁 《数据结构题集》 清华大学出版社,1987年4月第1版 [7] 徐孝凯《数据结构实用教程》 清华大学出版社2001年10月第1版
8、附录(源程序带注释)
#include
struct LinkList{ int coef; //系数 int xexp; //x指数 int yexp; //y指数 LinkList *next;//指针 };
//创建链表
void CreateList(LinkList *&L,int a[],int x[],int y[], int n)
//定义三个数组用于存储系数、x指数、y指数 {
LinkList *s; int i;
L=(LinkList *)malloc(sizeof(LinkList));//开辟空间存放链表 L->next=NULL;
for(i=0;i s=(LinkList *)malloc(sizeof(LinkList)); s->coef=a[i]; s->xexp=x[i]; s->yexp=y[i]; s->next=L->next; L->next=s; } } //降序排序 void sort(LinkList *&L)