数据结构课程设计报告长整数运算
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计报告
题目:长整数四则运算
一、需求分析
1.问题描述:
由于工程上有时候需要对很大的数进行计算,但是计算机本身提供的数据类型无法保存几百位甚至几千位的数字,所以需要设计专门的算法对数据进行相应的计算。此程序的设计任务是:设计一个程序能够实现长整数运算的程序,而且能够对一些错误异常进行辨别调整,计算出正确的结果。程序输入格式是字符串,保存时需要用双向循环链表将字符串每四位保存在循环链表中的一个节点中,然后再计算后运行出结果。
2.基本功能
功能一:建立双向循环链表,计算链表个数,对链表的数据进行修改,能在链表中插入结点。
功能二:将字符串转换成相应的数字存储在双向循环链表中
功能三:对存入双向循环链表的长整数进行相加,相减,相除。
3.输入输出
程序输入以字符串的形式输入,数据的类型是字符串,包含元素的范围是数字,逗号,负号。输入时用字符串输入,输出时以一链表结点输出,而且每个结点表示四位。
二、概要设计
1.设计思路:
由于计算机无法完成位数很大的数字计算,设计思路就是将很长的数据进行分割,一部分一部分的用计算机固有数据类型进行计算。将各部分的结果整合起来。由于计算机固有的整数类型存数的对大整数是2^15-1,所以为了方便,且符合中国人对长整数的表示习惯,建立一个双向循环链表,每个结点存储四位数字,以万为进制。从最低位开始加法,超过一万向上进位,所以每次加法应该是对应两个结点和进位数相加,进位值初始为0;减法也是一个结点计算一次,每次计算应该是第一个链表对应的结点值减去第二个结点的值和借位值的和,借位值初始值为0;除法的计算可以借助减法,被减数被减数减一次则最终结果加一;直至被减数比减数小。
2.数据结构设计:
因为计算的是一个连续的数字,需要桉顺序一次计算,所以采用的数据结构的逻辑结构是线性表。因为要求每一个结点只存储四位数字,为了将数字连接起来,采用的数据结构的存储结构是链式。
1.双向循环链表的抽象数据类型定义为:
ADT Link
{
数据对象:D={ai | ai∈CharSet,i=1,2,……,n,n≥0}
数据关系; R={
}
基本操作:
InitLinkList(&L,a)
操作结果:构造一个双向循环链表L ,用a判断是正数还是负数
DestroyList(&L)
初始条件:双向循环两已经存在
操作结果:销毁有序表L
Insert(&L,a)
初始条件:双向循环链表已经存在
操作结果:在循环链表的末尾插入一个结点,且此结点的数据值为a
HeadInsert(&L,a)
初始条件:双向循环链表已经存在
操作结果:在循环链表的头结点后插入一个结点,且此结点的数据值为a
CountNode(&L)
初始条件:双向循环链表存在
操作结果:计算出链表中结点的个数,并返回个数
Compare(&L1, &L2)
初始条件:L1和L2存在
操作结果:比较两个双向循环链表的大小,用返回值1表示L1大于L2,返回值-1标志L1小于L2,返回值0标志L1和L2相等
ToNum(*s,i,&e)
初始条件:s为字符串中指向某个字符的指针
操作结果:将s的前i个字符转换为数字,存入e中
CreatNum(&L,&s)
初始条件:s为某个字符串,双向循环链表L存在
操作结果:将字符串s转换成数字存入到循环链表L中
Add(L1,L2, op)
初始条件:双向循环链表L1和L2存在,op为结果的标识符
操作结果:两个链表相加,求出结果。
Sub(L1,L2, op)
初始条件:双向循环链表L1和L2存在
操作结果:L1减去L2,求出结果,op为结果的标识符
EraseZero(Link &L)
初始条件:双向循环链表L存在
操作结果:删去L链表头结点后,第一个数据不为零结点前的所有数据为零的结点。
如果结点数据都为零,则保存一个结点。
print(L)
初始条件:双向循环链表L存在
操作结果:从L头结点开始顺此打印每个结点中的数据
3.软件结构设计:
本程序包含四个模块:
1.主程序模块
Int main()
{
接受命令
While(“命令”!=“退出”)
{
输入字符串
建立双向循环链表
将字符串转换为要求的格式存入链表的每个结点
对链表中数据进行即兴操作数理
再次接受命令
}
}
2.双向链表操作模块------实现结点的插入、删除、修改
3.字符串转换存储模块----实现将字符串转换为数字按格式存储在链表中
4.数据计算模块—--------对存储在链表中的数据进行计算,得到最终期望的结果
各个模块调用的关系如下:
主程序模块中的函数原型:
void Interface()-------------------操作界面函数
Status CreatNum(Link &L,char*s)----创建数字链表函数
Link Compute(Link &L1,Link &L2,char Ope)----数据计算函数
数据运算模块:
Link Add(Link &L1,Link &L2,char op) ----加法计算
Link Sub(Link &L1,Link &L2,char op) ----减法运算
双向链表操作模块
void InitLinkList(Link &L,char a)
Status DestroyList(Link &L)
Status Insert(Link &L,Elemtype a)
int CountNode(Link L)
BOOL Compare(Link &L1,Link &L2)
void EraseZero(Link &L)
Status HeadInsert(Link &L,Elemtype a)
字符串转换模块
Status CreatNum(Link &L,char*s)
Status ToNum(char*s,int i,long &e)
人机界面:
三、详细设计
1..根据分析和链表操作的特点,采用双向循环链表实现,这里头结点存储数字的符号。typedef long Elemtype ;
typedef int Status;
typedef int BOOL;
typedef struct LNode{
Elemtype data;
LNode *next;
LNode *prior;
}Node,*Link;
void InitLinkList(Link &L,char a){
//对一个双向循环链表进行初始化,分配头结点
L = (Link)malloc(sizeof(Node));//动态分配存储空间
If(!L) return FALSE;