数据结构报告.docxVIP

  • 17
  • 0
  • 约1.49万字
  • 约 26页
  • 2019-03-23 发布于湖北
  • 举报
课程名称:数据结构教师姓名:刘欢学生姓名: 赵庆然学号: 1514020428实习一线性表及其应用题目:长整数运算需求分析【问题描述】设计一个程序实现两个任意长的整数求和运算。【基本要求】利用双向循环链表实现长整数的存储,每个结点含一个整型变量。任何整型变量的范围是:-(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)存储结构:结点以及循环双向链表(2)主要算法基本思想:每个节点中可以存放的最大整数为215-1=32767,才能保证两数相加不会溢出。但若这样存,就要求用32768进制,这样与十进制的转换就会十分麻烦。因此,我们采用在每个节点存十进制的四位数,即不超过9999的非负整数,整个链表视为万进制数。除此以外,我们在读入数据时用0和1来判断记录正负,从表头读入数据,从表尾输出数据。最后是加法运算这部分,其中心思想实:先比较长度,以确定哪个数减去哪个数;组与组之间采用万进制,并且设立进位数,借位数,从而实现题目要求。设计表示(1)函数调用关系图 main→ListInisiate→InputNumber→LongIntAdd(2)函数接口规格说明 void ListInisiate(DSLNode **head); /*循环双向链表的初始化*/ int ListInsert(DSLNode *head,int i,DataType x); /*插入运算*/int ListLength(DSLNode *head); /*求当前循环双向链表的长度*/int InputNumber(DSLNode *head); /*读取输入的数字*/void OutPutNumber(DSLNode *head,int sign); /*从表尾输出数据元素*/int LongIntAdd(DSLNode *head1,DSLNode *head2,DSLNode *head3); /*长整数的加运算*/实现注释(1)成功地利用了双向循环链表实现了任意长度整数的存储。(2)实现了按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。(3)实现了输入两个任意长度的正整数,可以得到正解。详细设计typedef struct Node /*定义节点*/{ int data; struct Node* prior; struct Node* next;}DSLNode;void ListInisiate(DSLNode **head) /*循环双向链表的初始化*/{ if((*head=(DSLNode *)malloc(sizeof(DSLNode)))==NULL)exit(0); (*head)-prior=*head; (*head)-next=*head; //return 1;}int ListInsert(DSLNode *head,int i,DataType x) /*插入运算*/{ DSLNode *p,*s; int j; p=head-next; j=0; while(p!=headji) { p=p-next; j++; } if(j!=i) { printf(插入位置参数不合法\n); return 0; } if((s=(DSLNode *)malloc(sizeof(DSLNode)))==NULL)exit(0); s-data=x; s-prior=p-prior; p-prior-next=s; s-next=p; p-prior=s; return 1;}int ListLength(DSLNode *head) /*求当前循环双向链表的长度*/{ DSLNode *p=head; int length=0; while(p-next!=head) { length++; p=p-next; } return length;}int InputNumber(DSLNode *head) /*读取输入的数字*/{ int input,i=0; char c;scanf(%d%c,input,c); //读入数据时负数用0表示符号,正数用1表示符号 while(1) {

文档评论(0)

1亿VIP精品文档

相关文档