void DestroyList(Number *&L) //销毁链表 {
Number *p=L,*q=p->next; while(q!=NULL) { free(p); //释放p的空间 p=q; q=p->next; }
cout<<\释放链表\}
7、主程序模块
int main() {
char a,x; //定义临时字符变量 cout<<\
CreateList(number1); //调用创建长整数函数
for(;;) //过滤非“+”和“-”的字符 { cout<<\ cin>>a; x=getchar();
if(a= ='+'||a= ='-')break;
cout<<\你输入的有误!请重新输入\ }
cout<<\
CreateList(number2); //调用创建长整数函数
cout<<\
***************\
PrintList(number1); //调用输出长整数函数 cout<
PrintList(number2); //调用输出长整数函数 cout<<\
PlusList(number1,number2,a); //调用两长整数相加减的函数
cout<<\
***************\
DestroyList(number1); //调用销毁链表的函数 DestroyList(number2); //调用销毁链表的函数 return 0; }
四、调试分析
第 11 页 共 15 页
1、在创建长整数时,没有使用getchar()来接受字符,而用C++中的cin>>来输入,这样使得每一次输入之后都要按回车键,而且在输入结束时控制也不方便,使用getchar()函数解决了这一问题。
2、从键盘输数据的时候,符合要求的只有0到9,输入其他的字符就可能出错或者结果不正确,最后用了一个条件来控制滤过不符合要求的字符。
3、在加减运算过程中也遇到了很多问题。首先,遇到的问题就是if条件中的“= =”中少了一个“=”导致编译正确,但是一运行就错误,这个问题不该错的,以后一定重视每一个细节。还有就是链表的使用过程中,指针太多,一会儿指向这个,一会儿又指向那个,如果思路不清楚的话,很容易弄晕的;有时候一个指针指向空的时候根本就不知道,编译没错误,检查不出来,一运行就不正确,有时候运行正确了,但是结果却不正确,这还好点,有时候指针指向空了,运行就弹出错误要终止程序。经过一步一步的测试,一步一步的运行,花了不少时间终于弄出来了。
4、在销毁链表的时候,也遇到过一个问题,现在还没弄明白是为什么。在销毁链表的函数中,如果参数接受两个链表来销毁的话,如:void DestroyList(Number *&L1,Number *&L2),运行会出错,或许是我写的代码不正确;但是,当用void DestroyList(Number *&L)来一个链表一个链表的销毁就没问题。
五、运行结果
(1)两个长整数相加
输入:
输出:
第 12 页 共 15 页
(2)两个长整数相减
输入:
输出:
第 13 页 共 15 页
六、实验环境
(1)Windows XP系统下
(2)编程环境:VC6.0++ ,TC2.0
第 14 页 共 15 页
七、实验体会
本次实验是求两个无限长整数加减运算。由于没有限制长度所以不能用一般的整型和长整
型来声明,必须用链表或者数组来表示两个长整数,这样来求它们的加减运算。这次实验说简单也简单,说难也难,看上去就是两个长整数从低位相加,如果进位的话则前一位加一,两个长整数相减,如果被减数小于减数的话,则向前一位借一,然后把它们输出就可以了。
但是,实际上要的到完全正确的结果,编写该程序还是有点难度的,如果不仔细考虑的话
有些地方,运算的结果是不正确的。比如说,4976+67=多少,如果没仔细考虑的话4976+67=41043,而正确的结果是4976+67=5043。还有很多地方也是这样,10000 – 99=10- 101而不是9901,像这样的情况很多。通过好几天的思考与测试,基本上的问题都想到了,但是还有没有的特殊情况的,我不知道,我会继续测试了看有什么特殊的情况。
虽然花了很多天,浪费了很多精力,但是感觉还是有很大的收获,毕竟能成功的完成该项
实验,自我感觉良好,上机运行的时候,有很多人没完成,感觉自己编出来了还挺自豪的,呵呵!不过也不能骄傲,这只是一次简单的实验,没有什么,要想真正学好还得更加努力学习,以后可能会有更难的题目等待我去解决了。
第 15 页 共 15 页