附件中是实验报告书写参考模式,这是往届同学的一份实验报告,尽管不是尽善尽美,但是相对比较规范,仅供参考。另外,也可以参考数据结构题集中P83页的实验报告模式。注意,实验报告模板中的实验大标题不要改动(线性表实现方法),把你的具体实验内容写到小标题上。 范艳峰
第 1 页 共 15 页
实验一 线性表实现方法
题目:编制一个长整数加减运算实现的程序
班级: 姓名: 学号: 完成日期: - -
一、需求分析
1、 本实验中演示中,长整数的每位上的数字必须为数字[0——9]之间,长整数的位数要求无限长。测试的时候输入数据,当输入回车键的时候结束输入,如果输入的字符不符合题目要求,则程序能过滤这些不符合要求的字符。
2、演示程序以用户和计算机的对话方式执行,即在计算机显示“提示信息”后之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据(滤去输入中不符合要求的字符)和运算结果显示在其后。
3、程序执行的命令包括: (1)创建第一个长整数;(2)执行加法或者减法;(3)创建第二个长整数;(4)结束。 4、测试数据
(1)Please Enter the First long Integer:12345678999999999999999
+ or - :+
Please Enter the Second long Integer:98765432ht1111111111k11111111111 12345678999999999999999 +
98765432111111111111111111111 =
98765444456780111111111111110
(2)Please Enter the First long Integer:1234567899hu99999fg99999999
+ or - :-
Please Enter the Second long Integer:98765432hr1111111ky11111111111111 12345678999999999999999 -
98765432111111111111111111111 =
-98765419765432111111111111112
二、概要设计
第 2 页 共 15 页
为实现上述程序功能,可以用链表或者长数组表示长整数,如果用数组表示长整数有个缺点就是长整数不能无限长,而链表能动态开辟空间,它克服了这个缺点,所以次试验用链表来表示长整数。
1、链表的抽象数据类型定义为: ADT Number{
数据对象:D={ai| ai∈(0,1,?,9),i=0,1,2,?,n,n≥0} 数据关系:R={< ai-1, ai >| ai-1, ai∈D,i=1,2,?,n} 基本操作:
CreateList(&L)
操作结果:创建一个链表L。 PrintList(L)
初始条件:链表L已存在。
操作结果:在屏幕上输出链表的值。 PlusList(L1,L2,a)
初始条件:链表L1,L2已存在,a为+ or – 表示加减。 操作结果:将两链表的值相加然后在屏幕上输出。 DestroyList(&L)
初始条件:链表L已存在。 操作结果:销毁链表L。
} ADT Number
2、本程序包含五个模块: (1)主程序模块: int main(){
定义变量; 接受命令; 处理命令; 退出(return 0);
}
(2)创建链表模块——产生一个长整数;
(3)输出链表模块——把链表产生的一个长整数输出;
(4)两链表加减模块——即求两个由链表产生的长整数的加减并输出结果; (5)销毁链表模块——程序结束后释放链表开辟的空间。 各模块之间的调用关系如下:
主程序模块
L1 L2 创建链表模块 +or - : 创建链表模块
L2 L1 输出链表模块 +or - 输出链表模块
= 两链表加减模块
第 3 页 共 15 页
L1 L2 销毁链表模块 销毁链表模块
结束 三、详细设计
1、定义头文件
#include
2、元素类型、节点类型和指针类型
struct Number //链表的类型 {
int data; //链表当前结点的值
struct Number *next; //链表当前结点指向下一结点的指针 struct Number *prior; //链表当前结点指向前一结点的指针 }*number1,*number2; //定义该链表类型的两个指针对象
3、创建链表模块,即产生一个长整数
void CreateList(Number *&L) //创建长整数 {
Number *s,*r; //定义两个链表类型的临时指针 char x; //定义一个临时字符变量
L=(Number *)malloc(sizeof(Number)); //为头结点开辟空间
L->next=L->prior=NULL; //此时头结点的后继指针和前驱指针赋值为空 r=L; //是r指针指向头结点
x=getchar(); //用x接受一个从键盘输入的字符 while(x!='\\n') //控制当输入回车键时结束 { if(x>='0'&&x<='9') //过滤不符合要求的字符 { s=(Number *)malloc(sizeof(Number)); //开辟下一结点的空间 s->data=x-'0'; //将字符转化为int型赋给结点 r->next=s; //r的后继指针指向s s->prior=r; //s的前驱指针指向r r=s; //是s指向r } x=getchar(); //用x接受一个从键盘输入的字符 };
r->next=NULL; //当创建结束时,r的后继指针为空 }
4、输出链表模块,把链表产生的一个长整数输出
第 4 页 共 15 页
void PrintList(Number *L) //输出长整数 {
Number *p=L->next; //定义一个临时指针并指向链表的第一个结点 while(p!=NULL) //判断结点是否为空,空就结束 { cout<
cout< 5、两链表加减模块,即求两个由链表产生的长整数的加减并输出结果 void PlusList(Number *L1,Number *L2,char a) //两个长整数加减运算 { Number *p,*q,*r,*p1,*q1; //定义几个链表类型的临时指针 int i=0,j=0; //定义几个临时的整型变量 while(L1->next!=NULL) //将指针p指向第一个长整数的尾节点并算出它的长度i { p=L1->next; L1->next=L1->next->next; i++; } while(L2->next!=NULL) //将指针q指向第二个长整数的尾节点并算出它的长度j { q=L2->next; L2->next=L2->next->next; j++; } if(a= ='+') //将两个长整数相加 { if(i>j) //当第一个长整数的长度大于第二个 { while(i!=0) //控制长整数的长度 { while(j!=0) //控制短整数的长度 { if((p->data+q->data)>9) //当两数相加大于9向前一位进一 { p->data=p->data+q->data-10; p->prior->data=p->prior->data+1; } else p->data=p->data+q->data; //不进位 p=p->prior; //指针向前移 q=q->prior; //指针向前移 第 5 页 共 15 页