长整数加减的运算
一、需求分析
问题描述:
设计一个实现任意长的整数进行加法运算的演示程序
基本要求:
利用双向循环链表实现长整数的存储,每个结点含一个整型变量。任何整型变量的范围是 -(2 15 -1)~(2 15 -1) 。输入输出形式:按照中国对于长整数的表示习惯,每四位是一组,组间用逗号隔开
更高要求:
(1)长整数的减法
(2)多个长整数的连续加减法,并带括号等。具体方式可以参见表达式的求值部分,利用栈
测试数据:
(1)0;0;应输出“0”
(2)-2345,6789;-7654,3211;应输出“-1,0000,0000”
(3)-9999,9999;1,0000,0000,0000;应输出“9999,0000,0001” (4)1,0001,0001;-1,0001,0001;应输出“0” (5)1,0001,0001;-1,0001,0000;应输出“1”
(6)-9999,9999,9999;-9999,9999,9999;应输出“-1,9999,9999,9998” (7)1,0000,9999,9999;1;应输出“1,0001,0000,0000”
一、 概要设计
1. 数据结构
此实验采用的数据结构是双向循环链表。这样可以很容易的找到他的前驱以及它的后继。节点采用结构体类型,代码如下:typedef struct Node // 双向链表的结构体定义
{
int data;
struct Node *prior; struct Node *next; }DLNode;
2. 使用函数
1) void ListInitiate(DLNode **head)
操作结果:初始化一个头结点为head的双向循环链表; 2) int ListLength(DLNode *head)
操作结果:计算以head为头结点的链表的长度 3) int ListInsert(DLNode *head,int i,int x)
操作结果:将节点数据为x的节点插到第i个位置上去。 4) int abs(int x)
操作结果:绝对值函数,返回x的绝对值。 5) int InputNumber(DLNode *head)
操作结果:将从键盘中接收数据并把得到的数据存入以head为头结点的链表中。四位一存,中间以逗号区分,结束符为分号。 6) void OutputNumber(DLNode *head,int sign)
操作结果:将以head为头结点的链表中的所有数据输出到显示屏上, 7) void add(DLNode *head1,DLNode *head2,DLNode *head3) 操作结果:实现正数加正数的加法操作。 8) int change(DLNode *head1,DLNode *head2)
操作结果:判断存在俩个链表中的数的大小,如何head1中的数大于head2中的数那么返回值为0,反之返回值为1,相等时返回值为2; 9) void method(DLNode *head1,DLNode *head2,int x)
操作结果:计算正数乘以正数的乘法运算。
10) void minus(DLNode *head1,DLNode *head2,DLNode *head3) 操作结果:计算正数减正数的减法运算。
11) void yunsuan(DLNode *head1,DLNode *head2,DLNode *head3,char ch)
操作结果:正数,负数,加法,减法。计算式共分为八种运算,在这之前我已经实现了二种运算,那么这个函数就是把这八种运算按照一定的规则转化成已经实现的二种运算来实现完整的加减法运算。
12) void chengfa(DLNode *head1,DLNode *head2)
操作结果:在乘法中我只是实现了正数乘以正数的运算,那么这个函数就是通过调用method函数按照一定的规则来实现完整的乘法运算。 13) void main()
操作结果:主函数。调用以上的各个函数来引导用户进行长整数的加法运算,加法运算,乘法运算。
二、 详细设计
1. 数据结构详细设计
typedef struct Node // 双向链表的结构体定义 {
int data;
struct Node *prior; struct Node *next;
}DLNode;
双向循环链表的节点由三个部分组成,第一是数据部分data存储此节点的数据,第二是此节点的前驱指针部分*prior指向此节点的前驱,第三是此节点的后继指针部分*next指向此节点的后继。数据部分我们约定它为整形变量,前驱后继指针均为结构体Node类型。 2. 链表初始化函数:
void ListInitiate(DLNode **head) //双向链表的初始化 { }
if((*head=(DLNode *)malloc(sizeof(DLNode)))==NULL) exit(0); (*head)->prior=*head; (*head)->next=*head;