数据结构课程设计.docx
- 文档编号:25839236
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:9
- 大小:16.20KB
数据结构课程设计.docx
《数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计.docx(9页珍藏版)》请在冰豆网上搜索。
数据结构课程设计
姓名:
学号:
班级:
指导老师:
学院:
计算机学院
1大数相乘
1.问题描述
两个比较大的数,远远超过longlong类型,相乘,并计算结果。
2.设计思路
通过模拟手工计算两数相乘,从低位乘到高位,两重循环,第一重循环控制乘数的第i位数与被乘数的相乘,第二重循环是被乘数的第j位数。
第二重循环每循环完一次,再把结果*10与上次的结果相加,这里又运用到了大数相加,这样一直处理到第一重循环结束。
只要合理的处理好进位就可以了。
3.数据结构设计
把两数每位数存放数组里,通过控制循环实现相乘。
4.功能函数设计
voidnixu()
voidmul();
计算两个存在数组里的大数计算相乘结果。
5.程序代码
#include
#include
usingnamespacestd;
voidnixu(char*str,intp,intq)
{
chartemp;
while(p { temp=str[p]; str[p]=str[q]; str[q]=temp; p++; q--; } } voidmul(char*str1,char*str2) { charresult[200]; intl1=strlen(str1); intl2=strlen(str2); memset(result,'0',l1+l2); result[l1+l2]='\0'; nixu(str1,0,l1-1); nixu(str2,0,l2-1); intindex1; intindex2; for(inti=0;i { index1=0; index2=0; for(intj=0;j { inttemp1=(str1[j]-'0')*(str2[i]-'0')+index1; index1=temp1/10; temp1=temp1%10; inttemp2=(result[i+j]-'0')+temp1+index2; index2=temp2/10; result[i+j]=temp2%10+'0'; } result[i+l1]+=index1+index2; } nixu(result,0,l1+l2-1); cout<<"相乘后的数字为: "< for(inti=0;i { if(result[i]! ='0') cout< } cout< } intmain() { charstr1[100],str2[100]; cout<<"请输入需要相乘的数字"< cin>>str1; cin>>str2; intl1=strlen(str1); intl2=strlen(str2); mul(str1,str2); return0; } 6运行测试 7设计心得 大数相乘和大数相加不一样,大数相加比大数相乘简单一些,所以在大数相乘这边花了一点时间。 2哈弗曼树 1.问题描述 欲发一封内容为AABBCAB……(共长100字符,其中: A、B、C、D、E、F分别有7、9、12、22、23、27个)的电报报文,实现哈夫曼编码,并求平均编码长度。 2.设计思路 建立一个哈夫曼树,求编码的,再求平均编码长度。 3.数据结构设计 建立一个储存字符出现数目以及字符编码后的长度 structInfor{ intweight; intlength; }w[30]; 再建立一个储存哈夫曼树的结点数据结构 typedefstruct{ charch; intweight; intlchild,rchild,parent; }Hnode; 4.功能函数设计 voidselect(constHnodeHT[],intn,int&s1,int&s2) 求数组中权值最小和次小的值的下标 voidHTree(Hnode*huff,Inforw[],intn) 建立哈夫曼树,编码和编码长度。 5.程序代码 #include #include #include typedefstruct{ charch; intweight; intlchild,rchild,parent; }Hnode; structInfor{ intweight; intlength; }w[30]; voidselect(constHnodeHT[],intn,int&s1,int&s2) { inti; s1=s2=0; intmin1=INT_MAX;//最小值,INT_MAX在 intmin2=INT_MAX;//次小值 for(i=1;i<=n;++i) { if(HT[i].parent==-1) { //筛选没有父节点的最小和次小权值下标 if(HT[i].weight { //如果比最小值小 min2=min1; s2=s1; min1=HT[i].weight; s1=i; } elseif((HT[i].weight>=min1)&&(HT[i].weight { //如果大于等于最小值,且小于次小值 min2=HT[i].weight; s2=i; } else { //如果大于次小值,则什么都不做 ; } } } } voidHTree(Hnode*huff,Inforw[],intn) { intm=2*n-1,sum,s1,s2; for(inti=1;i<=n;++i) { huff[i].weight=w[i-1].weight; huff[i].lchild=huff[i].rchild=huff[i].parent=-1; } for(inti=n+1;i<=m;++i) { huff[i].weight=-1; huff[i].lchild=huff[i].rchild=huff[i].parent=-1; } if(n! =1) { for(inti=1;i<=n-1;++i) { select(huff,n+i-1,s1,s2); sum=huff[s1].weight+huff[s2].weight; huff[n+i].weight=sum; huff[s1].parent=huff[s2].parent=n+i; huff[n+i].lchild=s1; huff[n+i].rchild=s2; } } else { w[0].length=1; } for(inti=1;i<=n;++i) { intk=0,c=0; chartemp[10]; for(intj=huff[i].parent,k=i;j! =-1;k=j,j=huff[j].parent) { w[i-1].length++; if(huff[j].lchild==k) { temp[c++]='0'; } else { temp[c++]='1'; } } printf("%c的编码为: ",i+'A'-1); for(inti=c-1;i>=0;--i) { putchar(temp[i]); } puts(""); } } intmain() { Hnodehuff[60]; charstr[1000]; w[0].weight=7; w[1].weight=9; w[2].weight=12; w[3].weight=22; w[4].weight=23; w[5].weight=27; HTree(huff,w,6); intb=0; for(inti=0;i<6;++i) { b+=w[i].length*w[i].weight; } printf("平均编码长度为: %.1f\n",(b*1.0)/6); } 6运行测试
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计