数据结构:长整数的加减法(任意长度的加减法)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》课程设计报告
课程设计报告名称长整数的加法运算实验室实验楼502 完成日期 2018年11月30日
}
(2) 程序结构图
(3) 功能模块
3. 详细设计:
1. 存储结构采用双向链表,使用头结点存放符号,后继节点存放其数字部分
长整数的运算
计算方式
加法
减法
结果
输入
符号位
数字部分
输入两个长整数
选择计算方式 加法模块 减法模块
3.算法描述
1.针对同号加法void Sub(DualList a, DualList b, DualList c)
对两个链表的节点进行的最低位进行加法,默认都需要进位,超过10000的情况,会给在操作下一位的时候在加上进位数字1,如果没有发生进位那就加上进位数0
void Add(DualList a, DualList b, DualList c)
{
DualList pa, pb;
int carry = 0, tmp;
pa = a->prior;
pb = b->prior;
while((pa != a) && (pb != b))
{
tmp = pa->data + pb->data + carry;
if (tmp >= 10000)
{
carry = 1;
tmp -= 10000;
}else
carry = 0;
InsertNodeAtHead(c, tmp);
pa = pa->prior;
pb = pb->prior;
}
while(pa != a)
{
// pb = b
tmp = pa->data + carry;
if (tmp >= 1000)
{
carry = 1;
tmp -= 10000;
}
else
carry = 0;
InsertNodeAtHead(c, tmp);
pa = pa->prior;
}
while(pb != b)
{
// pa = a
tmp = pb->data + carry;
if (tmp >= 1000)
4. 调试分析:
错误分析:.经常出现忘记符号终止符号,或大小写的小问题导致编译无法通过
不安全的设计导致计算机崩溃(无图) 最后结果显示错误
1.第一数字输入InputData()
2.第2数字输入InputData()
输入符号InitList()
加入数字InsertNodeAtHead( L,data)
加法DualList AddList( a, b)
加减法选择
同号Add()
同号Sub()
减法DualList SubList( a, b)
结果PrintList(DualList L)
正确测试结果:
三、设计总结
通这次实验让我充分认识到了自己所掌握程序设计知识的贫瘠,在长整的数字的运算之中,在一些数字的长度人可以接受的范围内我们通过用笔列算式、大脑的思考对两个较长的整数进行运算如果计算能力可以的话很快就能得出结果,整个运算的过程简单。在计算机实现的过程之中要任意长一个数字存储,就不能采用循序表(例如字符串),因为这样的长度依然是有限制的。采用双向链表的可以解决以上的难题,可以用头节点来保存一个数字的符号,向后插入来保存其它低位,这样限制最终的数字的长度就有计算机硬件水平来决定,几乎实现了任意长度,通过向前遍历可以实现加减法之中的进位和借位问题,让计算更加灵活。
在设计一个程序的过程之中安全问题不可以在被忽视,比如我在调试分析之中提到的,因为给链表的想后插入问题没有设置终止条件,导致计算机卡死,电脑只能强制关机。
四、代码清单
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#include "ctype.h"
//双向链表的节点
typedef struct DualNode
{
int data;