




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上实验题目:设计一数据结构可处理任意长度的整数 概要设计1.数据结构的定义采用双向链表存储任意长整数。双向链表的定义如下:class DblList private: DblNode *head, *tail; DblNode *current;int sign;public:DblList(); /构造函数 DblList(); /析构函数bool CreatList(string); /生成一个双向链表,存储整数int GetCount(); /获取整数的长度void Insert(DblNode *); /从表尾插入一个结点 void InsertFront(Db
2、lNode *); /从表头插入void Clear(); /清除该链表void operator+(DblList &); /实现两个任意整数的加法void operator*(DblList &); /实现两个任意整数的乘法DblList & operator=(DblList &); /重载赋值运算符 int Compare(DblList &); /两个整数的绝对值比较 void Display(); /任意长度整数的标准化输出;说明:数据的存储,无外乎顺序或者链表。顺序存储时,定义数组无法实现任意长度,而且需要预设一个maxsize,不是特别的
3、方便。所以采用链式存储方式。而且任意长数据通过字符串输入。在链表的每一个结点中,数据域是在该数位上的数字大小。2 主要功能模块的功能u 任意长整数的输入u 任意长整数的标准化输出u 两个整数的加法u 两个整数的乘法三详细设计(主模块流程图)5、 使用说明及测试结果1.使用说明:点击打开应用程序pro1.exe。依次输入任意两个整数(例如,+),按回车,会出现菜单,如下图:按1则实现两整数的加法按2则实现两整数的乘法按#结束注:菜单可重复出现直至#退出。实现加法,乘法如下图:2.测试结果:(1) (2) + (3) - (4) 12a3 (5) + 注:当输入错误时,允许重新输入。6、 源程序/
4、* 主函数 */*/#include "cal.h"void main()string s; string p; DblList list1;while(1) /输入错误时,允许重新输入 cout<<"Input num1"<<endl; cin>>s; bool ok1=list1.CreatList(s);if (!ok1) cout<<"error!"<<endl;elsecout<<"num1:"list1.Display();brea
5、k;DblList list2;while(1)cout<<"Input num2:"<<endl;cin>>p; bool ok2=list2.CreatList(p);if (!ok2)cout<<"error!"<<endl;elsecout<<"num2:"list2.Display();break;string choose;while (1) cout<<"请选择运算法:"<<endl;cout<<
6、;"-"<<endl; /*菜单*/cout<<"|1.num1+num2 |"<<endl; /*可以重复输入运算符,按'#'退出*/cout<<"|2.num1*num2 |"<<endl;cout<<"|#.exit |"<<endl;cout<<"-"<<endl;while (1) cin>>choose; if (choose="1&quo
7、t;) list1+list2;break; else if (choose="2") list1*list2;break; else if (choose="#") return; else cout<<"输入有误,请重新输入!"<<endl;continue;/*头文件,包括长整数数据结构的定义,成员函数的定义*/*/#include <iostream>#include <string>#include <cmath>using namespace std;struct
8、 DblNodeint data; DblNode * prior;DblNode * next;bool IsNum(char a) /判断字符a是否是便是数字 int s=a-'0'if(s>=0&&s<10)return true;else return false;bool IsInt(string a) /判断字符串a是否表达一串数字bool Jud=1;int i=1;char s=a0;if (a="+"|a="-") return false;if (s='+'|s='-
9、')else if (s>='1'&&s<='9')else if(a0='0'&&a1='0') return true;else return false;while (ai!='0')Jud=IsNum(ai);if (Jud=0) return false;i+;return true;int JudSign(string s) /返回数字的符号if (s0='-') return -1;else if(s0='0'&
10、;&s1='0') return 0;else return 1;int CtoI(char a)int i=a-'0'return i;class DblList /定义一个双向链表类,存储任意长度的数字private: /并可以进行标准化输出和加法,乘法。DblNode *head, *tail; DblNode *current;int sign;public:DblList(); /构造函数 DblList(); /析构函数bool CreatList(string); /生成一个双向链表int GetCount(); /获取整数的长度void
11、Insert(DblNode *); /从表尾插入一个结点 void InsertFront(DblNode *); /从表头插入一个结点void Clear(); /清除该链表void operator+(DblList &); /实现两个任意整数的加法void operator*(DblList &); /实现两个任意整数的乘法DblList & operator=(DblList &); /重载赋值运算符 int Compare(DblList &); /两个整数的绝对值比较void Display(); /任意长度整数的标准化输出;DblList
12、:DblList() head=new DblNode(); /构造函数head->next=NULL;head->prior=NULL; tail=head;current=NULL;sign=0;DblList:DblList() /析构函数while (head->next!=NULL) current=head->next;head->next=current->next;delete current;current=NULL;sign=0;delete head;head=NULL;tail=NULL;int DblList:GetCount()
13、/返回该数字的长度(不包括符号位) current=head->next;int count=0;while (current)count+;current=current->next;current=NULL;return count;void DblList:Insert(DblNode *p) /从链表尾部插入一个结点 tail->next=p; p->prior=tail;tail=p; void DblList:InsertFront(DblNode *q) /从链表头部插入一个结点if (head->next=NULL)head->next=q;
14、q->prior=head;tail=q;elseq->next=head->next;head->next->prior=q;head->next=q;q->prior=head;bool DblList:CreatList(string s) /输入的任意长度的表示数字的字符串 bool j=IsInt(s); /以此生成双向链表if (!j) return j;elseint i=0;sign=JudSign(s);if (s0='+'|s0='-')i+;while (si!='0')int ia
15、=CtoI(si);current=new DblNode();current->data=ia; current->next=NULL;current->prior=NULL;Insert(current);i+;current=NULL;return true;void DblList:Clear()while (head->next) current=head->next;head->next=current->next;delete current;tail=head;sign=0;current=NULL;int DblList:Compar
16、e(DblList & s) /任意两个长度数字绝对值比较int a=GetCount();int b=s.GetCount();if (a>b) return 1;else if (a<b) return -1;else current=head->next;s.current=s.head->next;while (current!=NULL)int re=current->data-s.current->data;if (re>0)return 1;else if (re<0) return -1;elsecurrent=curre
17、nt->next; s.current=s.current->next;current=NULL;s.current=NULL;return 0;DblList & DblList:operator =(DblList &s) Clear();sign=s.sign; s.current=s.head->next;while (s.current!=NULL)current=new DblNode();current->data=s.current->data;Insert(current);s.current=s.current->next
18、;s.current=NULL;current=NULL;return *this;void DblList:operator +(DblList & s) /实现加法(包括减法)DblList temp;int da;int f=0;int si=Compare(s); if (si=0&&(sign+s.sign=0)temp.sign=0;else if (si=0) temp.sign=sign;else if(si>0) temp.sign=sign; else temp.sign=s.sign; current=tail; s.current=s.ta
19、il; while (1)if (current=head&&s.current=s.head) if (f) da=f; temp.current=new DblNode(); temp.current->data=f; temp.InsertFront(temp.current);if (!f) break;f=0;else if (current!=head&&s.current=s.head)temp.current=new DblNode(); temp.current->data=current->data+f;temp.Inser
20、tFront(temp.current);current=current->prior;f=0;else if (current=head&&s.current!=s.head)temp.current=new DblNode();temp.current->data=s.current->data+f;temp.InsertFront(temp.current);s.current=s.current->prior;f=0; elseda=current->data*sign+s.current->data*s.sign+f;if (da*
21、temp.sign>=10)da=da-10*temp.sign;f=temp.sign;else if (da*temp.sign<0)da=da+10*temp.sign;f=-temp.sign;else f=0; temp.current=new DblNode();temp.current->next=NULL;temp.current->data=abs(da);temp.InsertFront(temp.current);current=current->prior;s.current=s.current->prior;current=NULL
22、;s.current=NULL;temp.current=temp.head->next;if (temp.current!=NULL)while (temp.current->data=0)temp.head->next=temp.current->next;delete temp.current;temp.current=temp.head->next; temp.current=NULL;cout<<"num1+num2="temp.Display(); void DblList:operator*(DblList &
23、 s) /实现乘法int cf=0;int ans;int i,j;int count=0;DblList temp;temp.sign=sign*s.sign;int a1=GetCount();int a2=s.GetCount();int a=a1+a2; for (i=0;i<a;i+) temp.current=new DblNode();temp.current->data=0;temp.current->next=NULL;temp.current->prior=NULL;temp.InsertFront(temp.current); s.current=s.tail;while (s.current!=s.head)current=tail;temp.current=temp.tail;for (i=0;i<count;i+) temp.current=temp.current->prior;for(j=0;j<a1;j+) ans=s.current->data*current->data+temp.current->data+cf; temp.current->data=ans%10; cf=an
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农发行衡水市深州市2025秋招信息科技岗笔试题及答案
- 农发行石家庄市正定县2025秋招群面模拟题及高分话术
- 农发行邢台市襄都区2025秋招无领导小组面试案例库
- 定安县中储粮2025秋招网申填写模板含开放题范文
- 恭城瑶族自治县中储粮2025秋招笔试粮食政策与企业文化50题速记
- 内科医生个人工作总结(集锦15篇)
- 2025年度周口西华县中医院校园招聘17名考前自测高频考点模拟试题有完整答案详解
- 焦作市中石化2025秋招笔试模拟题含答案炼油设备技术岗
- 县城市供水突发事件应急预案范文(9篇)
- 2025年合肥热电集团社会招聘5人考前自测高频考点模拟试题及答案详解一套
- 煤矿安全规程2025版解读
- 哈里伯顿Sperry定向钻井介绍专题培训课件
- 2021年江苏省徐州市中考生物试卷(附详解)
- JJF 1704-2018 望远镜式测距仪校准规范
- 石油化工设备维护检修规程通用设备12
- 《三角形的面积》教学设计方案
- GB/T 14667.1-1993粉末冶金铁基结构材料第一部分烧结铁、烧结碳钢、烧结铜钢、烧结铜钼钢
- 带状疱疹及带状疱疹后神经痛
- 2022年毕节市农业发展集团有限公司招聘笔试试题及答案解析
- 卒中单元中的护理
- 中药鉴定学习题集全
评论
0/150
提交评论