数据结构实验报告1.docx
- 文档编号:10609448
- 上传时间:2023-02-21
- 格式:DOCX
- 页数:24
- 大小:55.64KB
数据结构实验报告1.docx
《数据结构实验报告1.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告1.docx(24页珍藏版)》请在冰豆网上搜索。
数据结构实验报告1
数据结构实验报告一
——1.4长整数的四则运算
电信提高0901班
吕祺
U200913911
一.需求分析
1.本程序中采用双向链表实现对长整数的存储与运算,每个节点含一个整型变量,每四位一组,组间可用逗号隔开。
2.程序由用户输入数据(长整数可正可负),选择加法或减法运算,计算机计算出结果并反馈。
3.程序由多个函数组成,函数见概要设计。
二.概要设计
本实验采用双向链表实现长整数存储。
抽象数据类型定义:
ADTLNode{
数据对象:
整型数
数据关系:
R1={ }ADTLNode 2.链表的抽象数据类型: ADTList{: D={ai|ai∈DSLNode,i=1,2,..n,n≥0} 数据关系: R1={ 基本操作: voidInitlist(list&L) 操作结果: 循环双向链表的初始化 voidCreatlist(list&L) 操作结果: 为链表赋值 voiddisplaylist(listl) 显示结果 voidAddlist(list&c,lista,listb) 操作结果: 长整数的加运算 }ADTList 1.每个节点只存储四位十进制数字,即不超过9999的非负整数,在本程序中若超过9999也可能得到正确结果,但不是标准的形式。 2.双向链表有头指针,它的data值存储长整数的符号,-1为负,正数时直接存储第一个节点的值 3.其他节点的data值存储四位整数 4.尾节点指向NULL而非头结点,因为没有必要循环,且判断结束的标志可以为尾指针为空. 还需要包含调用若干库文件: stdio.h,malloc.h等。 三.详细设计 1.宏定义及节点定义: #defineElemTypeint typedefstructLNode { ElemTypedata,carryin;//carryin为进位,有进位时为一,也可为借位 structLNode*next,*prior; }*Link; typedefstruct { Linkhead; Linktail;//头为指针为LNode型 }list; 2.初始化链表函数: 函数C代码: voidInitlist(list&L) { structLNode*p; if((p=(LNode*)malloc(sizeof(LNode)))==NULL)exit(0); L.head=L.tail=p; } 3.赋值函数设计思路 voidCreatlist(list&L) {char*a;charss[1];a=ss;Initlist(L); structLNode*k; if((k=(LNode*)malloc(sizeof(LNode)))==NULL)exit(0); cin>>k->data>>*a;//a只能为逗号或者分号,分号代表结束 if(k->data>0) {L.head=L.tail=k;L.tail->next=NULL;L.tail->prior=NULL;//若为正数直接设之为头结点 while(*a! =';')//输入不为‘;’时不断循环 {structLNode*q; if((q=(LNode*)malloc(sizeof(LNode)))==NULL)exit(0); cin>>q->data>>*a; if(q->data>10000||q->data<0)exit(0); if(*a==';') {L.tail->next=q;q->prior=L.tail; L.tail=q; L.tail->next=NULL;break; } q->prior=L.tail; L.tail->next=q; L.tail=L.tail->next; }//while }//if(k->data>0) else{ L.head->data=-1;L.head->next=(LNode*)malloc(sizeof(LNode));L.tail=L.head->next;//头结点数据域设为-1 L.tail->data=-1*k->data;L.tail->prior=L.head;L.tail->next=NULL; L.head->prior=NULL; while(*a! =';') {structLNode*q; if((q=(LNode*)malloc(sizeof(LNode)))==NULL)exit(0); cin>>q->data>>*a; if(q->data>10000||q->data<0)exit(0); if(*a==';')输入为‘;’时结束循环 {L.tail->next=q;q->prior=L.tail; L.tail=q; L.tail->next=NULL;break; }q->prior=L.tail; L.tail->next=q; L.tail=L.tail->next;//修改尾节点,将q插入 }//while }//else }//Creatlist(list&L) 4.加法函数思路 voidAddlist(list&c,lista,listb) { Initlist(c);LinkA=a.tail;LinkB=b.tail;LinkC=c.tail;//设三个指针,依次往前 c.head=c.tail; if(a.head->data*b.head->data>0){//若为两正数相加或两负数相加,直接从后往前相加 c.tail=(LNode*)malloc(sizeof(LNode));C=c.tail;c.tail->next=NULL; inttemp=(a.tail->data+b.tail->data)-10000;//看是否有进位 c.tail->carryin=temp>0? 1: 0; c.tail->data=(a.tail->data+b.tail->data)%10000;//不管进位与否,数据域都是取余的结果 while(A->prior->prior! =NULL&&B->prior->prior! =NULL) {A=A->prior;B=B->prior; C->prior=(LNode*)malloc(sizeof(LNode)); inttemp2=(A->data+B->data+C->carryin)-10000;//carryin是C的,故不可先令C指向C的prior C->prior->carryin=temp2>0? 1: 0; C->prior->data=(temp2+10000)%10000;C->prior->next=C; C=C->prior; }//while if(A->prior->prior==NULL&&B->prior->prior==NULL)//不为头结点,无符号域,直接求和 { C->prior=(LNode*)malloc(sizeof(LNode)); A=A->prior;B=B->prior;C->prior->next=C; inttemp4=(A->data+B->data+C->carryin)-10000;//carryin是C的,故不可先令C指向C的prior C->prior->carryin=temp4>0? 1: 0; C->prior->data=(temp4+10000)%10000;C->prior->next=C; C=C->prior;c.head=C; if(temp4>0) {C->prior=(LNode*)malloc(sizeof(LNode)); C->prior->data=1;C->prior->next=C; C=C->prior;c.head=C;} gotoend;//不得已用goto直接到结尾,否则下面判断语句不适用,将出错(判断条件被修改) }//if(A->prior->prior==NULL&&B->prior->prior==NULL) if(A->prior->prior==NULL&&B->prior->prior! =NULL){if(A->prior->data! =-1) {//A结束,与B同 A=A->prior;B=B->prior; C->prior=(LNode*)malloc(sizeof(LNode)); inttemp2=(A->data+B->data+C->carryin)-10000;//carryin是C的,故不可先令C指向C的prior C->prior->carryin=temp2>0? 1: 0; C->prior->data=(temp2+10000)%10000;C->prior->next=C; C=C->prior; while(B->prior! =NULL) {C->prior=(LNode*)malloc(sizeof(LNode)); B=B->prior;C->prior->next=C;//carryin不是C的,故可先令C指向C的prior C->prior->data=B->data;C=C->prior;c.head=C;}//while } elseif(A->prior->data==-1) { while(B->prior! =NULL) {C->prior=(LNode*)malloc(sizeof(LNode)); B=B->prior;C->prior->next=C;//carryin不是C的,故可先令C指向C的prior C->prior->data=B->data;C=C->prior;c.head=C;}//while } gotoend;}//if(A->prior->prior==NULL&&B->prior->prior! =NULL if(A->prior->prior! =NULL&&B->prior->prior==NULL) {//A结束,与B同 if(B->prior->data! =-1) { A=A->prior;B=B->prior; C->prior=(LNode*)malloc(sizeof(LNode)); inttemp2=(A->data+B->data+C->carryin)-10000;//carryin是C的,故不可先令C指向C的prior C->prior->carryin=temp2>0? 1: 0; C->prior->data=(temp2+10000)%10000;C->prior->next=C; C=C->prior; while(A->prior! =NULL) {C->prior=(LNode*)malloc(sizeof(LNode)); A=A->prior;C->prior->next=C;//carryin不是C的,故可先令C指向C的prior C->prior->data=A->data;C=C->prior;c.head=C;}//while } }// elseif(B->prior->data==-1) while(A->prior! =NULL) {C->prior=(LNode*)malloc(sizeof(LNode)); A=A->prior;C->prior->next=C;//carryin不是C的,故可先令C指向C的prior C->prior->data=A->data;C=C->prior;c.head=C;}//while }//if(A->prior->prior==NULL&&B->prior->prior! =NULL) end: ; if((a.head->data==-1&&b.head->data! =-1)) { c.tail=(LNode*)malloc(sizeof(LNode));C=c.tail;c.tail->next=NULL; inttemp=((-1)*a.tail->data+b.tail->data); c.tail->carryin=temp<0? -1: 0; c.tail->data=((-1)*a.tail->data+b.tail->data+10000)%10000; while(A->prior->prior! =NULL&&B->prior->prior! =NULL) {A=A->prior;B=B->prior; C->prior=(LNode*)malloc(sizeof(LNode)); inttemp2=((-1)*A->data+B->data+C->carryin)-10000;//carryin是C的,故不可先令C指向C的prior C->prior->carryin=temp2<0? -1: 0; C->prior->data=(temp2+10000)%10000;C->prior->next=C; C=C->prior; }//while if(A->prior->prior==NULL&&B->prior->prior==NULL) { C->prior=(LNode*)malloc(sizeof(LNode)); A=A->prior;B=B->prior;C->prior->next=C; inttemp4=((-1)*A->data+B->data+C->carryin)-10000;//carryin是C的,故不可先令C指向C的prior C->prior->carryin=temp4<0? -1: 0; C->prior->data=(temp4+10000)%10000;C->prior->next=C; C=C->prior;c.head=C; if(temp4<0) {C->prior=(LNode*)malloc(sizeof(LNode)); C->prior->data=-1;C->prior->next=C; C=C->prior;c.head=C;} gotoend2;}//if(A->prior->prior==NULL&&B->prior->prior==NULL) if(A->prior->prior==NULL&&B->prior->prior! =NULL){if(A->prior->data! =-1) {//A结束,与B同 A=A->prior;B=B->prior; C->prior=(LNode*)malloc(sizeof(LNode)); inttemp2=((-1)*A->data+B->data+C->carryin)-10000;//carryin是C的,故不可先令C指向C的prior C->prior->carryin=temp2<0? -1: 0; C->prior->data=(temp2+10000)%10000;C->prior->next=C; C=C->prior; while(B->prior! =NULL) {C->prior=(LNode*)malloc(sizeof(LNode)); B=B->prior;C->prior->next=C;//carryin不是C的,故可先令C指向C的prior C->prior->data=B->data;C=C->prior;c.head=C;}//while } gotoend2;}//if(A->prior->prior==NULL&&B->prior->prior! =NULL if(A->prior->prior! =NULL&&B->prior->prior==NULL) {//B结束,与A同 A=A->prior;B=B->prior; C->prior=(LNode*)malloc(sizeof(LNode)); inttemp2=((-1)*A->data+B->data+C->carryin)-10000;//carryin是C的,故不可先令C指向C的prior C->prior->carryin=temp2<0? -1: 0; C->prior->data=(10000+B->data-A->data)%10000;C->prior->next=C;//; C=C->prior; while(A->prior! =NULL) {C->prior=(LNode*)malloc(sizeof(LNode)); A=A->prior;C->prior->next=C;//carryin不是C的,故可先令C指向C的prior C->prior->data=A->data+C->carryin;C=C->prior;c.head=C;C->carryin=0; }//while }//if(A->prior->prior! =NULL&&B->prior->prior==NULL) end2: ;}//if((a.head->data==-1&&b.head->data! =-1)) } 5.输出函数思路: voiddisplaylist(listl) { Linkp; p=l.head;if(p->data! =-1) cout< elsecout<<"-"; p=p->next; // while(p->next! =NULL) {cout<<","; inti=p->data;if(i<10)cout<<"000"< elseif(i<100)cout<<"00"< elseif(i<1000)cout<<"0"< elsecout<next;} cout<<",";inti=p->data;if(i<10)cout<<"000"< elseif(i<100)cout<<"00"< elseif(i<1000)cout<<"0"< elsecout< } 6.主函数思路: voidmain() { cout<<"pleaseentertwoaddersintheformas1,0343,0001endedwith';'"< listL,LA,LB; cout<<"enterA: "< Creatlist(LA);cout<<"A="; displaylist(LA); cout<<"enterB: "< Creatlist(LB);cout<<"B="; displaylist(LB); Addlist(L,LA,LB); cout<<"A+B="; displaylist(L); } 四.完整程序与调试分析 #include usingnamespacestd; #include #include #include #include #include #include #defineElemTypeint typedefstructLNode { ElemTypedata,carryin; structLNode*next,*prior; }*Link; typedefstruct { Linkhead; Linktail; }list; voidInitlist(list&L) { structLNode*p; if((p=(LNode*)malloc(sizeof(LNode)))==NULL)exit(0); L.head=L.tail=p; } voidCreatlist(list&L) {char*a;charss[1];a=ss;Initlist(L); structLNode*k; if((k=(LNode*)malloc(sizeof(LNode)))==NULL)exit(0); cin>>k->data>>*a; if(k->data>0) {L.head=L.tail=k;L.tail->next=NULL;L.tail->prior=NULL; while(*a! =';') {structLNode*q; if((q=(LNode*)malloc(sizeof(LNode)))==NULL)exit(0); cin>>q->data>>*a; if(q->data>10000||q->data<0)exit(0); if(*a==';') {L.tail->next=q;q->prior=L.tail; L.tail=q; L.tail->next=NULL;break; } q->prior=L.tail; L.tail->next=q; L.tail=L.tail->next; }//while }//if(k->data>0) else{ L.head->data=-1;L.head->next=(LNode*)malloc(sizeof(LNode));L.tail=L.head->next; L.tail->data=-1*k->data;L.tail->prior=L.head;L.tail->next=NULL; L.head->prior=NULL; while(*a! =';') {structLNode*q; if((q=(LNode*)malloc(sizeof(LNode)))==NULL)exit(0); cin>>q->data>>*a; if(q->data>10000||q->data<0)exit(0); if(*a==';') {L.tail->next=q;q->prior=L.tail; L.tail=q; L.tail-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)