一、需求分析 【问题描述】 设计一个程序实现两个任意长的整数求和运算。 【基本要求】 利用双向循环链表实现长整数的存储,每个结点含一个整型变量。 任何整型变量的范围是:-(215-1)~(215-1)。输入和输出形式: 按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。 【测试数据】 (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” 。 二、设计 1. 设计思想 (1)存储结构:循环双向链表 (2)主要算法基本思想: 1、每个结点中可以存放的最大整数为 215-1=32767,才能保证两数相加不会溢出。但若这样存,即相当于按32768 进制数存,在十进制数与 32768进制数之间的转换十分不方便。故可以在每个结点中仅存十进 制数4 位,即不超过 9999 的非负整数,整个链表视为万进制数。 2、可以利用头结点数据域的符号代表长整数的符号。用其绝对值表示元素结点数目。相加过程中不要破坏两个操作数链表。两操作数的头指针存于指针数组中是简化程序结构的一种方法。不能给长整数位数规定上限。 2. 设计表示 (1)函数调用关系图: (2)函数接口规格说明: 结构体: struct dl_node { int x; dl_node *pre; dl_node *next; }; 初始化: v oid list_init(dl_node ** h) 插入元素: v oid list_insert(dl_node *h,int x ) 输出链表: v oid prin(dl_node *h) 实现相加: v oid list_add(dl_node *h1,dl_node *h2) 实现相减: v oid list_su b(dl_node *h1,dl_node *h2) 3. 详细设计 (1)输入两个数,用链表来存储。链表的头结点的数据的值为 1 时,表示的是输入的数非负;为-1 时表示输入的数是负数。 (2)在创建链表时,让高位在链表的尾部,低位在链表的头部。 (3)在做加法时,先判断两个数的符号是否相同,如果相同,在根据加数的符号,决定和数的符号,取两个数的绝对值做加法,但是的处理进位。 (4)如果异号,用一函数来判断和的符号,判断异号的两个数相加和的符号,当两个数的长度不相等时,取较长数的符号作为和的符号,否则比两个数的大小,再决定和的符号。 (5)异号的两个数想加时,先去两个数的绝对值,用较大的数...