数据结构课程设计汇总.docx

上传人:b****0 文档编号:288504 上传时间:2022-10-08 格式:DOCX 页数:13 大小:19.26KB
下载 相关 举报
数据结构课程设计汇总.docx_第1页
第1页 / 共13页
数据结构课程设计汇总.docx_第2页
第2页 / 共13页
数据结构课程设计汇总.docx_第3页
第3页 / 共13页
数据结构课程设计汇总.docx_第4页
第4页 / 共13页
数据结构课程设计汇总.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

数据结构课程设计汇总.docx

《数据结构课程设计汇总.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计汇总.docx(13页珍藏版)》请在冰豆网上搜索。

数据结构课程设计汇总.docx

数据结构课程设计汇总

需求分析一、1.本程序实现计算任意长的整数的四则运算.以用户和计算机对话的方式,先后输入数字的最多位数,然后程序就计算并显示出这两个数的运算。

2.利用双向循环链表现实长整数的存储,每个结点含一个整形变量。

输入的形式以回车结束,可以直接输入正数或负数,程序会过滤掉无效的字符。

按中国对于长整数的表示习惯,每四位一组,除数字和位于首位置的负号外,其它一切字符都将作为分隔符,连续多个分隔符当一个处理。

但不使用分隔符也不影响结果。

3.测试数据

(1)0;0;输出“0”;

(2)-2345,6789;-7654,3211;

输出“-1,000,000”;(3)-9999,9999;1,0000,0000,0000;输出

“9999,0000,0001”;(4)1,0001,0001;-1,0001,0001;输出“0”;

(5)1,0001,0001;-1,0001,0001;输出“1”;(6)-9999,9999,9999;

-9999,9999,9999;输出“-1,9999,9999,9998”;(7)1,0000,9999,9999;1;

输出,0001,0000,0000.

二、概要设计

为实现上述程序功能,应以双向循环链表表示长整数。

为此,需要定义一个抽象数据类型。

1.抽象数据类型定义为:

16

/1

ADTOrderedList{

数据对象:

D={ai|ai∈int,i=1,2,...n,n≥0}

基本操作:

init(&a,digit4)

操作结果:

构造一个位数是digit4*4长整数。

pass(&a,&b,&c)

初始条件:

a,b,c都已存在

操作结果:

c等于a和b的和。

nep(&a)

初始条件:

a已存在。

操作结果:

a变为输入参数的相反数。

printlong(&a)

初始条件:

a已存在。

操作结果:

按四位一组,分隔符为?

的格式,在屏幕上输出a。

ston(&S,&a)初始条件:

a已存在。

操作结果:

把字符串形式的长数字赋给a。

}ADTOrderedList

2.本程序包含两个模块:

1)主程序模块:

Voidmain(){

选择操作:

1:

帮助。

2:

加法。

3:

减法。

16

/2

4:

乘法。

5:

除法。

6:

退出。

打印结果;

}

三、详细设计

1.元素类型,结点类型,指针类型

#defineNULL0

#include

#include

#include

typedefstructlongnode{/*每个节点的结构*/

intnum;/*数字*/

/*指向低一位节点*/

structlongnode*low1;

structlongnode*high1;/*指向高一位节点*/

}longnode;

typedefstructxlong{/*每个长整数的结构*/

/*每个长整数的最高节点*/longnode*High;

/*每个长整数的最低节点*/

longnode*Low;

intdigit4;/*每个长整数的总位数(不包括高位的0)/4*/

}*xlong;

intinit(xlong*a,intdigit4){

16

/3

intI;/*.init.*/

longnode*j;

(*a)=(xlong)malloc(sizeof(structxlong));/*为a的头结构申请空间,并赋初始值*/

(*a)>High=NULL;(*a)->Low=NULL;

(*a)->High=NULL;(*a)->Low=NULL;

(*a)->digit4=0;

for(i=0;i

j=(longnode*)malloc(sizeof(longnode));

j->num=0;j->high1=NULL;j->low1=(*a)->High;

if((*a)->High)(*a)->High->high1=j;

else

(*a)->Low=j;(*a)->High=j;(*a)->digit4++;

}

}

intpass(xlonga,xlongb,xlongc){

intcf=0;/*两个数字的相加*/

longnode*a1=a->Low,*b1=b->Low,*c1=c->Low;

while(a1){c1->num=a1->num+b1->num+cf;

if(c1->num>9999){

16

/4

cf=1;/*如果产生进位(借位)*/

c1->num-=10000;

}else{cf=0;}

a1=a1->high1;b1=b1->high1;c1=c1->high1;}

returncf;/*最高位的进位(借位)*/

}

intpassa(xlonga,xlongb,xlongc){

*//*两个数字的相减intcf=0;

longnode*a1=a->Low,*b1=b->Low,*c1=c->Low;

while(a1){c1->num=a1->num-b1->num-cf;

借位if(c1->num>9999){cf=1;/*如果产生进位()*/

c1->num-=10000;

}else{cf=0;}

a1=a1->high1;b1=b1->high1;c1=c1->high1;

}

)*/(最高位的进位/*returncf;借位}

intpassb(xlonga,xlongb,xlongc){

*/两个数字的相乘intcf=0;/*

longnode

*a1=a->Low,*b1=b->Low,*c1=c->Low;

16

/5

while(a1){c1->num=a1->num*b1->num*cf;

if(c1->num>9999){cf=1;/*如果产生进位(借位)*/

c1->num=10000;

}else{cf=0;}

a1=a1->high1;b1=b1->high1;c1=c1->high1;}

returncf;/*最高位的进位(借位)*/

}

intpassc(xlonga,xlongb,xlongc){

*/intcf=0;/*两个数字的相除

longnode*a1=a->Low,*b1=b->Low,*c1=c->Low;

while(a1){c1->num=a1->num/b1->num/cf;

if(c1->num>9999){cf=1;/*如果产生进位(借位)*/

c1->num-=10000;

}}}else{cf=0;

a1=a1->high1;b1=b1->high1;c1=c1->high1;}

returncf;/*最高位的进位(借位)*/

}

*/

的相反数求/*nep(xlonga){a/*因为求相反数是取反加一,所以这里intcf=1;cf=1;*/

longnode*a1=a->Low;

16

/6

while(a1)

{a1->num=9999-(a1->num)+cf;

if(a1->num>9999){a1->num=10000;}

else{cf=0;}a1=a1->high1;

}

return;

}

printlong(xlonga){

a*/longnode*i=a->High;/*打印长整数

if(i->num>=5000){

*/表示负数,即用补码表示printf(-);/*最高位(bit)=1*/

/*求反打印其绝对值nep(a);

}while(i&&i->num==0)i=i->low1;/*跳过最位的0*/

if(i){printf(%d,i->num);

i=i->low1;

);

”“,if(i)printf(

}elseprintf(“0*/打0”);/*a=0

while(i){printf(d,i->num);

if(i->low1)

printf(,);

i=i->low1;}}

16

/7

intston(charin[],xlongout){/*把字符串转化为数字赋给a*/

intbit,i,jishu=1,num0=0;

longnode*j=out->Low;

i=strlen(in)-1;while(i>=0&&j){

/*循环每一个字节*/

bit=in[i]-‘0';/*把字符形式的值赋给整数形式的bit*/

if(bit>=0&&bit<=9){num0+=jishu*bit;/*加进num0*/

}

jishu*=10;/*基数自乘10*/

if(jishu>1&&(jishu>=10000||bit<0||bit>9)){/*数字以外的字符*/

j->num=num0;

j=j->high1;/*存入一个节点*/

num0=0;

jishu=1;

}

i--;

}

if(num0)

{j->num=num0;j=j->high1;}/*把最后一个没存入节点的数存入节点

*/

for(;j;j=j->high1)j->num=0;/*最位不足补0*/

if(out->High->num>=5000)

return1;/*如果最高位是1,返回1表示出*/

if(in[0]=='-')nep(out);/*如果最后一个字符是'-'则取反*/return0;}

16

/8

intadd(){char*a1,*b1;/*加*/

intdigit4,cf=0;

xlonga,b,c;

do{printf(Howmuchdigitsdoyouneed?

);/*输入最多位数*/

scanf(%d,&digit4);

}while(digit4<=0);

a1=(char*)malloc(digit4+1);

b1=(char*)malloc(digit4+1);

digit4=digit4/4+1;

init(&a,digit4);

init(&b,digit4);

init(&c,digit4);/*初始化a,b,c*/

do{cf=0;printf(Enter2number:

\n);

scanf(%s,a1);printf(+\n);

scanf(%s,b1);cf|=ston(a1,a);

cf|=ston(b1,b);

*/,如果转换出错,则重输输入被加数和加

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1