ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:21.17KB ,
资源ID:8190948      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8190948.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(兰州大学数据结构课程设计4讲解.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

兰州大学数据结构课程设计4讲解.docx

1、兰州大学数据结构课程设计4讲解数据结构课程设计题目(程序实现采用C语言)题目1:猴子选王(学时:3)一堆猴子都有编号,编号是1,2,3 .m,这群猴子(m个)按照1-m的顺序围坐一圈,从第1开始数,每数到第n个,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。要求:m及n要求从键盘输入,存储方式采用向量及链表两种方式实现该问题求解。 题目2 :字符逆转(学时:3) 从键盘读入一个字符串,把它存入一个链表(每个结点存储1个字符),并按相反的次序将字符串输出到显示屏。题目3 :工资核算(学时:3)设有一个单位的人员工资有如下信息:name、department、 ba

2、se pay、allowance、total。现从键盘输入一组人员工资数据并将它们存储到名为paydata的文件中;再从paydata取出工资数据并给每个人的base pay增加100元,增加后将工资数据显示于屏幕(每行1人)。题目4:满足条件的有序表生成(学时:3) 已知三个有序表A、B、C,它们皆由同一类元素构成,现要求对于表A作以下运算而获得有序表D:排出A中所有的既在B中又在C中出现的元素。另外该任务要求具有建立有序表功能以及输出有序表到屏幕的功能。题目5:一元多项式的减法(学时:6)设有两个一元多项式A(x),B(x),请完成运算A(x)+B(x)、A(x)-B(x),要求多项式采用

3、链表进行存储。另外该任务要求具有建立多项式链表以及输出多项式到屏幕的功能。题目6:床位分配(学时:6) 某客店有N个等级的房间,第k级客房有A(k)个,每个房间有B(k)个单人床,以菜单调用方式设计为单身旅客分配床位以及离店时收回床位的程序。要求分配成功时,印出旅客姓名、年龄、性别、到达日期、客房等级、房间号及床位号;分配不成功时,允许更改房间等级,若不更改等级,印出“满客”提示。题目7:文本文件单词的检索及计数(学时:6) 要求编程建立一个文本文件,每个单词不包括空格及跨行,单词由字符序列构成且区分大小写,完成以下功能:统计给定单词在文本文件中出现的总次数、检索输出某单词在文本文件中首次出现

4、的行号及位置。题目8:二叉树的遍历(学时:6) 二叉树以lson-rson链接方式存储,以菜单方式设计并完成功能任务:建立并存储树、输出前序遍历结果、输出中序遍历结果、输出后序遍历结果、交换左右子树、统计高度,其中对于中序、后序的遍历运算要求采用非递归方式。题目9:创建二叉排序树(学时:3) 二叉排序树以lson-rson链接方式存储,编写能够通过键盘输入建立二叉排序树,并在建立完立即在屏幕显示中序遍历结果的程序。题目10:霍夫曼编码应用(学时:3) 假设一串由大写字母构成的电文,采用霍夫曼规则对其进行编码,以菜单方式设计并完成功能任务:建立霍夫曼树、霍夫曼编码生成、编码文件译码。#inclu

5、de#include#include#define n 100#define m 2*n-1typedef struct /码结点的存储结构 char ch; char bits9; int len;CodeNode;typedef CodeNode HuffmanCoden+1;typedef struct /树结点的存储结构 int weight; int lchild,rchild,parent;HTNode;typedef HTNode HuffmanTreem+1;int num;void select(HuffmanTree HT,int k,int &s1,int &s2)/挑选

6、权值最小的两个结点 int i,j; int minl=32767; for(i=1;i=k;i+) if(HTi.weightminl&HTi.parent=0) j=i; minl=HTi.weight; s1=j; minl=32767; for(i=1;i=k;i+) if(HTi.weightminl&HTi.parent=0&i!=s1) j=i; minl=HTi.weight; s2=j;int jsq(char *s,int cnt,char str)/统计输入字符和串 char *p; int i,j,k=0; int temp257; for(i=0;i257;i+) t

7、empi=0; for(p=s;*p!=0;p+) temp*p+; for(i=0,j=0;i=256;i+) if(tempi!=0) j+; strj=i; cntj=tempi; num=j; return j;/建立霍夫曼树void chuffmanTree(HuffmanTree&HT,HuffmanCode&HC,int cnt,char str) int i,s1,s2; for(i=1;i=2*num-1;i+) HTi.lchild=0; HTi.rchild=0; HTi.parent=0; HTi.weight=0; for(i=1;i=num;i+) HTi.weig

8、ht=cnti; for(i=num+1;i=2*num-1;i+) select(HT,i-1,s1,s2); HTs1.parent=i; HTs2.parent=i; HTi.lchild=s1; HTi.rchild=s2; HTi.weight=HTs1.weight+HTs2.weight; for(i=1;i=num;i+) HCi.ch=stri;/给霍夫曼树的每个叶子节点分配二进制代码void HuffmanEncoding(HuffmanTree HT,HuffmanCode HC) int c,p,i; char cdn; int start; cdnum=0; for(

9、i=1;i0) start-; cdstart=(HTp.lchild=c)?0:1; c=p; strcpy(HCi.bits,&cdstart); HCi.len=num-start; void decode(HuffmanCode HC,char receive,char s)/译码 char str268; char cd9; int i,j,k=0,p=0,cjs; while(receivep!=0) cjs=0; for( i=0;inum&cjs=0&receivep!=0;i+) cdi= ; cdi+1=0; cdi=receivep+; for(j=1;j=num;j+)

10、 if(strcmp(HCj.bits,cd)=0) strk=HCj.ch; k+; cjs = 1; break; strk=0; strcpy(s,str);void coding(HuffmanCode HC,char str,char get)/输出字符串的二进制编码 int i,j=0; while(strj!=0) for(i=1;i=num;i+) if(HCi.ch = strj) strcat(get,HCi.bits); break; j+; strcat(get,0);void main() char str257; /str用于在统计输入序列中的字母时用,存放是什么字

11、符,1到256 char st10000,s10000; /st 用来接收输入的字符串,s用来接收解压的字符串 int cn257; /cn用于接收统计后的每个字符的频率,1到256 HuffmanTree HT; HuffmanCode HC; char ch=y;int d,i; printf(-霍夫曼树-nn); printf( 1.建立霍夫曼树.n); printf( 2.生成霍夫曼编码.n); printf( 3.编码文件译码.n); while(ch=y) printf(请选择:); scanf(%d,&d); switch(d) case 1: printf(输入要编码的字符串:

12、); scanf(%s,&st); num=jsq(st,cn,str); /统计文件中的字符 strnum+1 = 0; chuffmanTree(HT,HC,cn,str); printf(霍夫曼树建立成功!n);/建立霍夫曼树 break; case 2: HuffmanEncoding(HT,HC); /根据霍夫曼树建立霍夫曼编码 printf(建立霍夫曼编码如下n 共有%d种字符n,num); for(i=1;i=num;i+) printf(字符%c次数为%d,编码为%sn,HCi.ch,cni,HCi.bits); char get10000; get0 = 0; coding(

13、HC,st,get); printf(n上述字符串的霍夫曼码为%sn,get); / printf(编码效率为%f%n,code_ratio(st,cn,HC); break; case 3: printf(输入二进制码开始译码:); char receive10000; scanf(%s,&receive); decode(HC,receive,s);/译码 printf(译码为:%sn,s); break; printf(n是否继续?(y/n):); scanf(%c,&ch); scanf(%c,&ch); 题目11:关键路径寻找(学时:6)对于给定的一个工程施工图,该图以边为单位从键盘

14、输入,编写能够找出该图的关键路径的程序。#includestdio.h#includestdlib.h#define LEN sizeof(struct Enode)typedef struct Vexnode /顶点表 int adjvex; /邻接域 int dut; /记录权值 struct Vexnode * next;vexnode;typedef struct Enode int indegree; /记录入度 int vertex; /顶点 int ee,el; /记录最迟开始时间和最早结束时间 struct Vexnode * link;enode;void print(eno

15、de dig,int first,int len) int i,j; static int top=0,list50; vexnode * q; i=first; q=digi.link; listtop=digi.vertex; top+; /进栈 if (q=NULL) printf(%d,listlen); for (i=1+len;i%d,listi); printf(n); while (q!=NULL) j=q-adjvex; if (digj.ee=digj.el) listtop=digj.vertex; print(dig,j,len); / q=q-next; top-;/

16、int toposort(enode dig,int e_n,int stacktp) int top=0,bottom=0,i,j,len=0; vexnode *q; for (i=1; ibottom) /拓扑排序 i=stacktpbottom; q=digi.link; bottom+; while (q!=NULL) j=q-adjvex; digj.indegree-; /入度- if (digi.ee+q-dutdigj.ee) /求一下最早开始时间 digj.ee=digi.ee+q-dut; if (digq-adjvex.indegree=0) /入度为0 则进栈 sta

17、cktptop=q-adjvex; top+; q=q-next; if (top=e_n) /表示没有环存在,则求出最迟结束时间 for (i=1; ibottom) /栈非空 top-; /从最后的一个事件开始倒推 i=stacktptop; q=digi.link; while (q!=NULL) j=q-adjvex; if (digj.el-q-dutdut; q=q-next; for (i=0; ilen; i+) print(dig,stacktpi,i); return 0; else return 1; void main() enode dig20; /顶点表数组 vex

18、node *q; /邻接点链表 char ch; int e_n,v_n,m,i,j,u,v,stacktp20; printf(-关键路径-nn); printf(请输入顶点个数和边的条数:); scanf(%d%d,&e_n,&v_n); for (i=1; i=e_n; i+) /初始化 digi.indegree=0; digi.link=NULL; digi.vertex=i; digi.ee=digi.el=0; printf(请输入%d条边以及该边的权:n,v_n); for (i=0; iadjvex=v; q-dut=j; q-next=digu.link;/将 q结点 放入

19、u 邻接链表中 digu.link=q; /将 q结点 放入u 邻接链表中 m=toposort(dig,e_n,stacktp); /拓扑排序 if (m) printf(图中存在环,不存在关键路径n); else printf(需要各点明细查询吗y/n); scanf(n%c,&ch); if (ch=y|ch=Y) for (i=0; ie_n; i+) printf(%d (%d %d) n,stacktpi,digstacktpi.ee,digstacktpi.el); 题目12:堆排序实现(学时:3)假设有一个数据类型为整型的一维数组A,A 中的数据元素呈无序状态,编写一个采用堆排

20、序法将A中的数据元素按由小到大进行排序的程序。#include#define MAX 255int AMAX;void creatdui(int l,int m) /*建初始堆过程函数*/ int i,j,x; i=l; j=2*i; /*Rj是Ri的左孩子*/ x=Ai; while(j=m) if(jm&AjAj+1)j+; /*若左孩子较大,则把j修改为右孩子的下标*/ if(x=1;i-) creatdui(i,n); /*建立初始堆,遍布所有的根结点*/ for(i=n;i=2;i-) /*进行n-1次循环完成堆排序*/ m=Ai; Ai=A1; /*将第一个元素同当前区域的最后一个

21、元素对换*/ A1=m; creatdui(1,i-1); /*筛选A1结点,得到i-1个结点的堆,仅有A1可能违反堆性质*/void main() int i,n; printf(-堆排序-nn); printf(输入整型一维数组A中数字总数:); scanf(%d,&n); if(nMAX) printf(n输入的数据有误!); return; printf(n请输入整型无序序列:n); for(i=1;i=n;i+) scanf(%d,&Ai); printf(n该序列为:n); for(i=1;i=n;i+) printf(%4d,Ai); sortdui(n); printf(n堆排

22、序后的序列为:n); for(i=1;i=n;i+) printf(%4d,Ai); printf(n);题目13基数排序的实现(学时:3)A为每个关键字不超过3位的十进制整数关键字集合,试编写一个采用静态链表组织模式实现的基数排序程序将A进行由小到大的排序。#include#include #define N 1024int RadixCountSort(int* npIndex, int nMax, int* npData, int nLen) int* pnCount=(int*)malloc(sizeof(int)* nMax); /保存计数的个数 int i=0; for (i=0;

23、inMax;+i) pnCounti=0; for (i=0;inLen;+i) /初始化计数个数 +pnCountnpIndexi; for (i=1; i=0;-i) -pnCountnpIndexi; pnSortpnCountnpIndexi=npDatai; for (i=0;inLen;+i) /把排序结构输入到返回的数据中。 npDatai = pnSorti; free(pnSort); /释放 free(pnCount); return 1;/基数排序int RadixSort(int* nPData, int nLen) /申请存放基数的空间 int *nDataRadix=(int *)malloc(sizeof(int) *nLen); int nRadixBase=1; /初始化倍数基数为1 int nIsOk=0; /设置完成排序为false int i; /循环,知道排序完成 while (nIsOk=0) nIsOk=1; nRadixBase *=10; for (i=0;inLen;+i) nDataRadixi = nPDatai % nRadixBase; nDataRadixi /= nRadi

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

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