数据结构课程设计题目:长整数四则运算班级:信管12-1学号:1201050642姓名:庄术洁指导老师:刘晓庆2014年5月22日一、需求分析1、利用双向循环链表实现长整数的存储,每个结点含一个整数变量。
任何整形变量的范围是—(2^15—1)~(2^15—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”。
二、概要设计为上述程序功能,应以有序表实现长整数的存储,为此,需要抽象数据类型:有序表(8)有序表的抽象数据类型定义为:ADT Dulinklist{数据对象: D={ai|ai为带符号整数,1,2,…,n,n>=0}数据关系:R1={<ai-1,ai>|ai-1,ai属于集合D,ai-1<ai,i=2,…..,n}基本操作:InitDulinklist(&)操作结果:构造一个空的有序表LDestroyDulinklist(&)初始条件:有序表L已存在操作结果:销毁有序表LDulinklistLength(L)初始条件:有序表L已存在操作结果:返回有序表L的长度DulinklistEmpty(L)初始条件:有序表L已存在操作结果:若有序表L为空表,则返回TUER,否则返回FALSEGetElem(L,pos)初始条件:有序表L已存在操作结果:若干1〈=POS〈=LENGTH(L),则返回有序表L 中第POS个数据元素。
Append(&L,e)初始条件:有序表L已存在操作结果:在有序表L的末尾插入元素e}ADT Dulinklist3.本程序包含三个模块:1)主程序模块:2)有序表单元模块——实现有序表的抽象数据类型;3)结点结构单元模块——定义有序表的结点结构各模块之间的调用关系如下:主程序模块↓有序表单元模块↓结点结构单元模块typedef struct DoubleNode //定义链表元素void InitNode(DLNode **head) //初始化链表int InsertNode(DLNode *head,int n,DataType x) //向链表第N个位置插入元素Xint digit(int n) //判断整数N有几位void PrintNode(DLNode *head) //打印链表void DestroyNode(DLNode **head)//销毁链表void add(DLNode *h1,DLNode *h2) //两数相加void jian(DLNode *h1,DLNode *h2) //两数相减int main() //入口函数四、调试分析由于在程序设计时,对于指针的不了解,编程时使用双重指针,无形中给自己增添了更多麻烦。
老师在检查的过程中指出并教导了这一点五.用户手册1.本程序的运行环境为DOS操作系统,执行文件为: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”七、附录#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#define N 100typedef int DataType;typedef struct DoubleNode //定义链表元素{ DataType data;struct DoubleNode *prior;struct DoubleNode *next; }DLNode;void InitNode(DLNode **head) //初始化链表{if((*head=(DLNode*)malloc(sizeof(DLNode)))==NULL)exit(1);(*head)->prior=*head;(*head)->next=*head; }int InsertNode(DLNode *head,int n,DataType x) //向链表第N个位置插入元素X{ DLNode *p,*nt;int i=0;p=head->next;while(p!=head&&i<n) {p=p->next; i++; }if(i!=n) {printf("插入位置错误\n");return 0; }if((nt=(DLNode *)malloc(sizeof(DLNode)))==NULL)exit(1);nt->data=x;nt->prior=p->prior; nt->prior->next=nt;nt->next=p;p->prior=nt;return 1; }int digit(int n) //判断整数N有几位{int i;for(i=1;;n/=10,i++) {if(n/10==0) return i; } }void PrintNode(DLNode *head) //打印链表{ DLNode *p=head->next; int i;while(p->data==0) //去掉前面的一串0{ p=p->next; if(p==head) { printf("0\n"); retu rn; } }printf("%d",p->data); //最前面的一个数进行特殊处理,不用补零p=p->next;while(p!=head) //打印后面的数字{ printf(",");if(p->data==0){printf("0000");p=p->next;continue; }for(i=0;i<4-digit(p->data);i++) //补零printf("0");printf("%d",p->data); p=p->next; }printf("\n"); }void DestroyNode(DLNode **head){ DLNode *p,*p1; p=(*head)->next;while(p!=*head){ p1=p;p=p->next; free(p1); }free(p); head=NULL; }void add(DLNode *h1,DLNode *h2) //两数相加{ DLNode *p1=h1->prior,*p2=h2->prior;while(p1!=h1&&p2!=h2) //每个链表元素相加{ p1->data+=p2->datap1=p1->prior; p2=p2->prior; }p1=h1->prior;while(p1!=h1->next) //处理链表元素{ if(p1->data>=10000){ p1->prior->data+=p1->data/10000;p1->data%=10000; } if(p1->data<0) //处理负数{ if(h1->next!=0){ p1->prior->data-=1;p1->data+=10000; } } p1=p1->prior; }if(h1->next->data>=10000) //处理最前面的数{ InsertNode(h1,0,h1->next->data/10000);if(h1->data<=-10000){ InsertNode(h1,0,h1->next->data/10000);h1->next->next->data%=-10000; }PrintNode(h1); }Void jian(DLNode *h1,DLNode *h2) //两数相减{ DLNode *p1=h1->prior,*p2=h2->prior;while(p1!=h1&&p2!=h2) //每个链表元素相减{ p1->data-=p2->data p1=p1->prior;p2=p2->prior; } p1=h1->prior;while(p1!=h1->next) //处理链表元素{ if(p1->data>=10000){ p1->prior->data+=p1->data/10000;p1->data%=10000; }if(p1->data<0) //处理负数{ if(h1->next!=0) { p1->prior->data-=1; p1->da ta+=10000; } } p1=p1->prior; }if(h1->next->data>=10000) //处理最前面的数{ InsertNode(h1,0,h1->next->data/10000);h1->next->next->data%=10000; }if(h1->data<=-10000){ InsertNode(h1,0,h1->next->data/-10000);PrintNode(h1); }int main() //入口函数 {DLNode *head1,*head2;InitNode(&head1);InitNode(&head2);char data1[N],data2[N];char d1[10],d2[10];int i,j,k;int xun; while(1){ printf("输入数据:\n");scanf("%s %s",data1,data2);InitNode(&head1); InitNode(&head2); i=0;k=0; while(data1[i]!=';') //将数1用链表储存{for(j=0;j<10;j++) d1[j]=0; j=0;while(data1[i]!=';'&&data1[i]!=',')d1[j++]=data1[i++];if(data1[i]==',') i++;if(data1[0]=='-') //处理正负数j=-(int)fabs(atoi(d1));//将字符串转换成整数else j=atoi(d1);InsertNode(head1,k++,j); }i=0; k=0;while(data2[i]!=';') //将数2用链表储存{for(j=0;j<10;j++) d2[j]=0; j=0;while(data2[i]!=';'&&data2[i]!=',')d2[j++]=data2[i++]; if(data2[i]==',') i++;if(data2[0]=='-') //处理正负数j=-(int)fabs(atoi(d2));else j=atoi(d2);InsertNode(head2,k++,j); }printf("选择加减法:1—加法,2-减法\n");scanf("%d",&xun);switch(xun){case 1:if(strlen(data1)>strlen(data2)) //较长的数作为被加数add(head1,head2);else add(head2,head1);break;case 2:if(strlen(data1)>strlen(data2)) //较长的数作为被减数jian(head1,head2);else jian(head2,head1); break;default:break; }DestroyNode(&head1);DestroyNode(&head2); } return 0; }。