云南大学数据结构实验7

合集下载

实验7 查找和排序实验(最后一次实验)

实验7  查找和排序实验(最后一次实验)

云南大学软件学院实验报告课程:数据结构实验学期:2014-2015学年第一学期任课教师:谢仲文专业:信息安全学号:姓名:成绩:实验7 查找和排序实验(最后一次实验)一、实验目的1.理解有关查找的基本思想以及使用的数据存储结构;2.掌握有关排序的相关算法以及各种算法使用的数据存储结构。

二、实验软硬件环境(CPU、OS、IDE):三、实验任务(要求写出核心代码,并对运行结果截图)对数据序列:{55,13,23,72,109,67,2,78,13}分别实现如下操作:必做:1) 顺序查找;2) 使用直接插入排序或冒泡排序(二选一)、快速排序(必做)对原纪录序列进行排序;3) 对排好序的纪录序列表进行折半查找;4) 利用原纪录序列建立一颗二叉排序树,并在其上实现特定关键字值结点的查找;选做:5) 按照“除留余数法”哈希构造函数和线性探测法的冲突处理方法创建表长为m=11的哈希表;6) 实现5)创建哈希表上的查找。

实验代码:#include<stdio.h>#include<stdlib.h>#define TRUE 1#define FALSE 0#define MAX 100typedef int ElemType;typedef struct BTNode //树节点定义{ElemType data;struct BTNode *lchild, *rchild;}BTNode,*BiTree;typedef struct{int key;int flag; //falg=1时表示有关键字,falg=0时表示没有关键字}Elemtype;typedef struct{Elemtype *elem; //动态分配的哈希表的首地址int count; //当前数据元素个数}HashTable;int Sequential_Search(int a[],int n,int key) //顺序查找;{int i=1;a[0]=key; //设置a[0]为关键字值,即哨兵。

数据结构实验报告模板-09版 -v2

数据结构实验报告模板-09版 -v2

云南大学软件学院数据结构实验报告(本实验项目方案受“教育部人才培养模式创新实验区(X3108005)”项目资助)实验难度: A □ B □学期:2012秋季学期任课教师: 秦江龙实验题目: 线性表及其应用小组长:联系电话:电子邮件:完成提交时间:年月日云南大学软件学院2012学年秋季学期《数据结构实验》成绩考核表学号:姓名:本人承担角色:综合得分:(满分100分)指导教师:年月日(注:此表在难度为C时使用,每个成员一份。

)云南大学软件学院2012学年秋季学期《数据结构实验》成绩考核表学号:姓名:本人承担角色:综合得分:(满分100分)指导教师:年月日(注:此表在难度为C时使用,每个成员一份。

)云南大学软件学院2012学年秋季学期《数据结构实验》成绩考核表学号:姓名:本人承担角色:综合得分:(满分100分)指导教师:年月日(注:此表在难度为C时使用,每个成员一份。

)(下面的内容由学生填写,格式统一为,字体: 楷体, 行距: 固定行距18,字号: 小四,个人报告按下面每一项的百分比打分。

难度A满分70分,难度B满分90分)一、【实验构思(Conceive)】(10%)(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计、算法等相关知识)基本思路:先写控制台程序,保证算法的正确性后,再将程序封装成界面程序;程序设计:用c++中文件的操作对要进行加密的明文来使之变为乱码,要求用户记住,文件加密密钥,只有记住密钥,然后通过志浩解密器才能转化为明文,从而起到加密的效果;编程知识:用到对文件的操作,对文件的打开,读写,关闭,删除,插入等操作。

对话框的打开以及对话框中的操作。

二、【实验设计(Design)】(20%)(本部分应包括:抽象数据类型的功能规格说明、主程序模块、各子程序模块的伪码说明,主程序模块与各子程序模块间的调用关系)1、文件加密器包括加密以及解密:包括对文件的打开,密钥的输入,验证操作,对文件中字符的转化加密,;1、单击事件有四个:a.浏览…是为了用户能够打开要加密的文件,省去用户输入地址的麻烦,方便用户使用,使界面更加和谐,软件更加人性化;b.重置,是为了用户在输入密码时如果输入错误,可以点击清空后重置;c.加密文件,是用户在填完上面的信息之后可以开始加密就点击,点击完成后将会在相应的目录下生成加密文件,用户可以在原位置找到相应的加密文件;d.解密文件,是对已经用志浩加密器加密过的文件才能操作,在用户确认密钥后方可点击该按钮,点击完成当解密完成后将弹出提示,再到该目录下查找就可以看到加密的密文变为明文;三、【实现描述(Implement)】(30%)(本部分应包括:抽象数据类型具体实现的函数原型说明、关键操作实现的伪码算法、函数设计、函数间的调用关系,关键的程序流程图等,给出关键算法的时间复杂度分析。

云南大学软件学院报告

云南大学软件学院报告

课程:数据结构实验学期:2014-2015学年第一学期任课教师:专业:信息安全学号:姓名:成绩:实验5 图基础实验一、实验目的1.掌握图的存储结构及其遍历。

二、实验软硬件环境(CPU、OS、IDE):三、实验任务(要求写出核心代码,并对运行结果截图)1)使用邻接矩阵和邻接表储表示分别实现如下给定的图1、图2、图3所示图的物理存储结构。

2)在1)所建立的图形存储结构上分别实现深度优先搜索遍历和广度优先搜索遍历,并给出遍历结果(序列)。

图3 有向图实验代码:#include<stdio.h>#include<stdlib.h>#define MAXVEX 20#define OK 1#define ERROR 0#define OVERFLOW -1#define INFINITY 65535#define QueueSize 20 //队列中最大元素个数typedef int QElemType; //队列的元素的类型typedef int VertexType;typedef int EdgeType;typedef enum{False,True}Boolean; //Boolean是布尔类型,其值是ture或false Boolean visited[MAXVEX]; //访问标志的数组。

typedef struct{VertexType vexs[MAXVEX];EdgeType arc[MAXVEX][MAXVEX];int numVertexes,numEdges;} MGraph; //邻接矩阵。

typedef struct EdgeNode //边表结点。

{int adjvex;struct EdgeNode *next;}EdgeNode;typedef struct VertexNode //顶点表结点。

{int data;EdgeNode *firstedge;}VertexNode,AdjList[MAXVEX];typedef struct{AdjList adjlist;int numVertexes,numEdges; //图中当前顶点数边数。

数据结构实训实验报告

数据结构实训实验报告

一、实验背景数据结构是计算机科学中一个重要的基础学科,它研究如何有效地组织和存储数据,并实现对数据的检索、插入、删除等操作。

为了更好地理解数据结构的概念和原理,我们进行了一次数据结构实训实验,通过实际操作来加深对数据结构的认识。

二、实验目的1. 掌握常见数据结构(如线性表、栈、队列、树、图等)的定义、特点及操作方法。

2. 熟练运用数据结构解决实际问题,提高算法设计能力。

3. 培养团队合作精神,提高实验报告撰写能力。

三、实验内容本次实验主要包括以下内容:1. 线性表(1)实现线性表的顺序存储和链式存储。

(2)实现线性表的插入、删除、查找等操作。

2. 栈与队列(1)实现栈的顺序存储和链式存储。

(2)实现栈的入栈、出栈、判断栈空等操作。

(3)实现队列的顺序存储和链式存储。

(4)实现队列的入队、出队、判断队空等操作。

3. 树与图(1)实现二叉树的顺序存储和链式存储。

(2)实现二叉树的遍历、查找、插入、删除等操作。

(3)实现图的邻接矩阵和邻接表存储。

(4)实现图的深度优先遍历和广度优先遍历。

4. 算法设计与应用(1)实现冒泡排序、选择排序、插入排序等基本排序算法。

(2)实现二分查找算法。

(3)设计并实现一个简单的学生成绩管理系统。

四、实验步骤1. 熟悉实验要求,明确实验目的和内容。

2. 编写代码实现实验内容,对每个数据结构进行测试。

3. 对实验结果进行分析,总结实验过程中的问题和经验。

4. 撰写实验报告,包括实验目的、内容、步骤、结果分析等。

五、实验结果与分析1. 线性表(1)顺序存储的线性表实现简单,但插入和删除操作效率较低。

(2)链式存储的线性表插入和删除操作效率较高,但存储空间占用较大。

2. 栈与队列(1)栈和队列的顺序存储和链式存储实现简单,但顺序存储空间利用率较低。

(2)栈和队列的入栈、出队、判断空等操作实现简单,但需要考虑数据结构的边界条件。

3. 树与图(1)二叉树和图的存储结构实现复杂,但能够有效地表示和处理数据。

计算机基础实验07

计算机基础实验07

云南大学数学与统计学实验教学中心实验报告一、实验目的1.掌握插入图片及设置图片格式的方法掌握文本框的设置方法。

2.掌握简单图形的绘制方法和组合方法。

3.掌握公式的编辑方法。

二、实验内容【上机实习指导】《大学计算机与网络应用基础》图文混排及高级应用实验实验六《图文混排及高级应用》的实验内容。

【拓展内容上机】《大学计算机与网络应用基础》Word文字处理测试题三、实验环境Windows 7操作系统;Microsoft office办公软件。

四、实验过程1实验步骤1.插入艺术字打开实验五完成的“荷塘月色(节选)。

Docx”文档,将文档标题“荷塘月色”改为艺术字体,效果如图实验7.1word样张效果所示。

①选中标题“荷塘月色”单击“插入选项卡下的”文本“选项组中的”艺术字“按钮。

②打开的“艺术字式样”中选择第4行第1列。

③选择“绘图工具|格式”选项卡中的“艺术字样式”选项组的“文本效果”下拉按钮,从打开的下拉列表中选择“转换”选项,在选择“弯曲”部分“波形2”。

④改变艺术字为浮动式。

选择“绘图工具|格式”选项卡中的“排列”选项组中的“位置”下拉按钮,从打开的下拉列表中选择一种环绕方式,调整艺术字的位置,其效果如图实验7.1所示。

2.插入“剪切画”①单击“插入”选项卡中的“插图”选项组中的“剪贴画”按钮,打开“剪切画”任务窗格。

②在“搜索文字”文本框中不输入关键字,直接单击搜索,找到如样张所示图片,设置该图片环绕位置为“四周环绕”,大小位置如图实验7.1所示。

③单击“图片工具|格式”选项卡中的“调整”选项组的“颜色”下拉按钮,从打开的下拉列表中选择“茶色”选项。

3.插入图片文件①单击“插入”选项卡中的“插图”选项组中的“图片”按钮,打开“插入图片”对话框。

②从配套光盘里选择如样张所示的几个图片文件插入文档。

③设置荷花图片为“衬于文字下方”,单击“图片工具|格式”选项卡的“调整”选项组中的“颜色”下拉按钮,从打开的下拉列表中选择“冲蚀”选项。

云南大学软件学院数据结构实验报告六

云南大学软件学院数据结构实验报告六

云南大学软件学院数据结构实验报告(本实验项目方案受“教育部人才培养模式创新实验区(X3108005)”项目资助)实验难度:A□ B □ C ■序号学号姓名成绩12指导教师:(签名)学期:2012秋季学期任课教师:实验题目: 图及其应用小组长:联系电话:电子邮件:完成提交时间:2012年12月 20日云南大学软件学院2012学年秋季学期《数据结构实验》成绩考核表学号:姓名:本人承担角色:小组长综合得分:(满分100分)指导教师:年月日学号:姓名:本人承担角色:组员综合得分:(满分100分)指导教师:年月日(注:此表在难度为C时使用,每个成员一份。

)一、【实验构思(Conceive)】(10%)(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计、算法等相关知识)本实验要求设计一个校园导游系统,要求通过图这一数据结构计算两点之间的最短距离,实现校园导航功能。

首先要收集校园景点信息和景点之间的距离信息,然后利用图存储校园景点信息和景点之间的距离信息,最后使用Dijkstra算法计算最短路径。

离散数学相关知识:正确合理使用与或非之间的关系,进行程序分支判断,保证程序正常进行,以及图的使用。

二、【实验设计(Design)】(20%)本次实验使用C进行编写,自定义函数2个:void init_graph(graph *g)//图的初始化函数void shortest_path(graph *g,int s, int t,int n)//求最短路径的算法主函数为功能选择界面三、【实现描述(Implement)】(30%)主函数显示开始界面,选择相应的功能求最短路径。

人性化设计:1.在输入出现错误时例如功能选择错误时,程序会给出友好的提示;2. 界面友好,容易上手。

四、【代码】(10%)#include<iostream>#include<stdio.h>#include<stdlib.h>#include<windows.h>#define INFINITY 9999 //最大距离#define MAX_NODES 30 //最大结点数int dist[MAX_NODES][MAX_NODES]; //dist[i][j]表示i、j连线的权重int path[MAX_NODES];using namespace std;typedef struct VertexType{char* sight; //景点名称//char* info; //景点描述}VertexType; //定义顶点的类型typedef struct{int vexnum;VertexType vex[MAX_NODES];}graph;void init_graph(graph *g){int a,x,y=0;g->vexnum = 27;g->vex[0].sight="云大西二门";g->vex[1].sight="百家道";g->vex[2].sight="文典广场";g->vex[3].sight="云大会堂";g->vex[4].sight="中山邦翰楼";g->vex[5].sight="仰止楼";g->vex[6].sight="桦苑";g->vex[7].sight="楠苑";g->vex[8].sight="格物楼";g->vex[9].sight="楠苑体育场";g->vex[10].sight="知味堂";g->vex[11].sight="楠苑超市";g->vex[12].sight="综合服务楼";g->vex[13].sight="楸苑";g->vex[14].sight="力行楼";g->vex[15].sight="软件楼";g->vex[16].sight="校医院";g->vex[17].sight="明远楼";g->vex[18].sight="至公大道";g->vex[19].sight="行政办公楼";g->vex[20].sight="云大北门";g->vex[21].sight="文汇楼";g->vex[22].sight="余味堂";g->vex[23].sight="梓苑超市";g->vex[24].sight="梓苑";g->vex[25].sight="钟楼";g->vex[26].sight="校车乘车点";for(x=0;x<g->vexnum;x++)for(y=0;y<g->vexnum;y++)dist[x][y]=INFINITY;//下边是可直接到达的景点间的距离,由于两个景点间距离是互相的,所以要对图中对称的边同时赋值 dist[0][1]=dist[1][0]=10;dist[1][2]=dist[2][1]=20;dist[2][3]=dist[3][2]=20;dist[1][4]=dist[4][1]=50;dist[4][5]=dist[5][4]=200;dist[4][6]=dist[6][4]=130;dist[5][7]=dist[7][5]=600;dist[5][8]=dist[8][5]=800;dist[5][9]=dist[9][5]=600;dist[7][8]=dist[8][7]=100;dist[7][9]=dist[9][7]=600;dist[7][10]=dist[10][7]=150;dist[7][11]=dist[11][7]=110;dist[7][12]=dist[12][7]=100;dist[8][12]=dist[12][8]=80;dist[9][11]=dist[11][9]=700;dist[10][11]=dist[11][10]=5;dist[10][12]=dist[12][10]=50;dist[10][13]=dist[13][10]=150;dist[12][13]=dist[13][12]=100;dist[12][26]=dist[26][12]=20;dist[13][14]=dist[14][13]=200;dist[13][15]=dist[15][13]=250;dist[13][16]=dist[16][13]=700;dist[13][26]=dist[26][13]=100;dist[14][15]=dist[15][14]=20;dist[14][16]=dist[16][14]=500;dist[14][17]=dist[17][14]=1500;dist[16][17]=dist[17][16]=1300;dist[17][18]=dist[18][17]=50;dist[17][25]=dist[25][17]=300;dist[18][19]=dist[19][18]=30;dist[19][20]=dist[20][19]=100;dist[20][21]=dist[21][20]=950;dist[20][22]=dist[22][20]=900;dist[21][22]=dist[22][21]=150;dist[21][24]=dist[24][21]=110;dist[21][25]=dist[25][21]=750;dist[22][23]=dist[23][22]=40;dist[22][24]=dist[24][22]=120;dist[23][24]=dist[24][23]=60;dist[24][1]=dist[1][24]=300;}void shortest_path(graph *g,int s, int t,int n){struct state{int predecessor; //前驱节点int length; //到起始点的距离int label;}state[MAX_NODES];int i,k,min,mypath[MAX_NODES];struct state * p;for(p=&state[0]; p<&state[n]; p++){p->predecessor = -1;p->length = INFINITY;p->label = 0;}state[t].length = 0;state[t].label = 1;k = t; //当前工作结点do{for(i=0; i<n; i++){if(dist[k][i]!=0 && state[i].label==0){if(state[k].length+dist[k][i]<state[i].length){state[i].length = state[k].length+dist[k][i]; state[i].predecessor = k;}}}k=0;min=INFINITY;for(i=0; i<n; i++){if(state[i].label==0 && state[i].length<min){k=i;min=state[i].length;}}state[k].label = 1;}while(k!=s);i=0;k=s;do{path[i] = k;k = state[k].predecessor;mypath[i]=path[i];i++;}while(k>=0);for(i--;i>0;i--){printf("%s->",g->vex[mypath[i]].sight);}printf("%s\n",g->vex[mypath[i]].sight);printf("\n距离为%d m\n",min);}int main(){int m,s,e,c;graph g;g.vexnum = 27;init_graph(&g);printf("\n===========================================================\n");printf("\n 呈贡云南大学校园导游 \n");printf("\n\n");//打印景点列表for(m=0;m<g.vexnum;m++){printf("\t%2d:%s\t\t",m,g.vex[m].sight);if(++m<27&&m!=7)printf("\t%2d:%s\t\n",m,g.vex[m].sight);else if(m==7)printf("\t %d:%s\t\n",m,g.vex[m].sight);elseprintf("\n");}printf("\n===========================================================\n");printf("\n\t■■■■■■■■■■■■■■■■■\n");printf("\t■ ■\n");printf("\t■ 1、查询景点路径■\n");printf("\t■ ■\n");printf("\t■ 0、退出■\n");printf("\t■ ■\n");printf("\t■■■■■■■■■■■■■■■■■\n");while(1){printf("\n===========================================================\n");printf("\n请输入您的选择:");scanf("%d",&c);while(!(c==0||c==1)){printf("\n输入非法,请重新选择:\n");scanf("%d",&c);}switch(c){case 0:exit(0);case 1:printf("\n输入出发点与结束点:");scanf("%d %d",&s,&e);while(s<0||s>26||e<0||e>26||s==e){printf("\n输入非法,请重新选择:");scanf("%d %d",&s,&e);}printf("\n从“ %s ”到“ %s ”的最短路径为\n\n",g.vex[s].sight,g.vex[e].sight); shortest_path(&g,e,s,g.vexnum);break;}//switch}//whilereturn 0;}。

1-7次数据结构实验报告

1-7次数据结构实验报告

实验1(2学时)实验名称:线性表及其应用实验内容:1.实现顺序表的删除操作;2.实现单链表的删除操作;3.编程实现单链表相同数据元素删除操作;4.实现带有头结点的单链表的逆置操作。

实验目的与要求:1.深刻理解线性表的抽象数据类型;2.熟练掌握线性表的两种存储方式的基本操作的实现。

实验环境或器材、原理与说明:装有VC++6.0的PC机实验过程(步骤)或程序代码:(必须有)实验预习过程中的问题:(必须有)实验结果与分析:(必须有)实验体会与建议:(必须有)实验2(2学时)实验名称:栈和队列及其应用实验内容:1.实现顺序栈和链栈的出栈、取栈顶元素操作;2.实现循环队列和链队列的出队、取队头元素操作;3.设计算法编程实现,利用循环队列生成杨辉三角形。

实验目的与要求:1.掌握栈的基本操作;2.掌握队列的基本操作;3.会使用栈和队列的基本操作解决较复杂的应用题。

实验环境或器材、原理与说明:装有VC++6.0的PC机实验过程(步骤)或程序代码:(必须有)实验预习过程中的问题:(必须有)实验结果与分析:(必须有)实验体会与建议:(必须有)实验3(2学时)实验名称:串实验内容:1.使用串的堆分配存储方法实现串的基本操作;2.编写程序实现:求子串在主串中的位置,并置换子串。

实验目的与要求:1.了解串的操作特性;2.掌握串的基本操作以顺序存储方式进行存储的实现。

实验环境或器材、原理与说明:装有VC++6.0的PC机实验过程(步骤)或程序代码:(必须有)实验预习过程中的问题:(必须有)实验结果与分析:(必须有)实验体会与建议:(必须有)实验4(4学时)实验名称:树及其应用实验内容:1.完成指导书实训内容“1调试验证”部分;2.创建一颗二叉树,并按其形状显示输出;3.按照先序、中序和后序顺序分别对给定二叉树线索化。

实验目的与要求:1.理解树、二叉树的含义与性质,树和二叉树的存储结构;2.掌握二叉树的三种遍历方法和相应算法。

数据结构实验报告七_顺序查找

数据结构实验报告七_顺序查找

实验七顺序查找一、实验目的1.掌握顺序查找操作的算法实现。

二、实验平台操作系统:Windows7或Windows XP开发环境:JA V A三、实验内容及要求1.建立顺序查找表,并在此查找表上实现顺序查找操作。

四、实验的软硬件环境要求硬件环境要求:PC机(单机)使用的软件名称、版本号以及模块:Netbeans 6.5以上或Eclipse、MyEclipse等编程环境下。

五、知识准备前期要求掌握查找的含义和顺序查找操作的方法。

六、验证性实验1.实验要求编程实现如下功能:(1)根据输入的查找表的表长n和n个关键字值,建立顺序查找表,并在此查找表中用顺序查找方法查找给定关键值的记录,最后输出查找结果。

2. 实验相关原理:查找表分别静态查找表和动态查找表两种,其中只能做引用操作的查找表称为静态查找表。

静态查找表采用顺序存储结构,待查找的记录类可描述如下:public class RecordNode {private Comparable key; //关键字private Object element; //数据元素……}待排序的顺序表类描述如下:public class SeqList {private RecordNode[] r; //顺序表记录结点数组private int curlen; //顺序表长度,即记录个数// 顺序表的构造方法,构造一个存储空间容量为maxSize的顺序表public SeqList(int maxSize) {this.r = new RecordNode[maxSize]; // 为顺序表分配maxSize个存储单元this.curlen = 0; // 置顺序表的当前长度为0}……}【核心算法提示】查找操作是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或记录的过程。

若查找表中存在这样一个记录,则称“查找成功”。

查找结果给出整个记录的信息,或指示该记录在查找表中的位置;若在查找表中不存在这样的记录,则称“查找不成功”。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验难度: A □ B □ C学期:2017秋季学期任课教师: 储星实验题目: 查找算法的设计与实现组员及组长:承担工作:联系电话:电子邮件:完成提交时间: 2018 年 12 月 29 日一、【实验构思(Conceive)】(10%)(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计等相关知识,对问题进行概要性地分析)二叉排序树的查找算法及算法原理:对给定的二叉排序树,如果想知道某元素是否在其中出现,可以和根结点比较,如果相等结束;如果不等,若比其大,进入右子树;否则进入左子树;继续按照上面的方法,直到出现相等或者到某分支结束为止,返回查找信息。

哈希表的查找算法及其原理:给定K值,根据造表时设定的哈希函数求得哈希地址,若表中此位置上没有记录,则查找不成功;否则比较关键字,若和给定值相等,则查找成功;否则根据造表时设定的处理冲突的方法找到“下一地址”,直至哈希表中某个位置为“空”或者表中所记录的关键字等于给定值时为止。

数据结构算法的知识:表的定义、表项的表示、表的存储结构、哈希表的定义、哈希函数的构造方法、哈希表查找处理冲突的办法。

面向对象的程序设计相关知识:C基本语法知识、类的定义、对象的生成调用、变量的传递。

二、【实验设计(Design)】(20%)(本部分应包括:抽象数据类型的定义和基本操作说明,程序包含的模块以及各模块间的调用关系,关键算法伪码描述及程序流程图等,如有界面则需包括界面设计,功能说明等)抽象数据类型:typedef int KeyType;typedef struct {const char *name;int namenum;}Name;typedef struct {Name data;int pos;}HashTable;typedef struct Hash {Name data;int pos;struct Hash *next;}*Hash_P, Hash_L;typedef struct BSTNode {KeyType key;struct BSTNode *lc, *rc;}*BSTree;抽象数据操作:void InsertBST(BSTree *bst, KeyType key)//若在二叉排序树中不存在关键字等于key的元素,插入该元素void CreateBST(BSTree *bst)//从键盘输入元素的值,创建相应的二叉排序树BSTree search(KeyType k, BSTree root)BSTNode *DelBST(BSTree t, KeyType k)//在二叉排序树t中删去关键字为k的结点子函数:int menu_X()int menu_T()int menu_L()void initName()void initHashTable_X()void initHashTable_T()void initHashTable_L()void show()void show_L()void findName_X()void findName_T()void findName_L()int Menu()三、【实现(Implement)】(30%)(本部分应包括:抽象数据类型各操作的具体实现代码、关键操作的具体算法实现、函数实现,主程序实现等,并给出关键算法的时间复杂度分析。

如有界面则需包括界面的关键实现方法等。

)基本操作实现:主函数:void main(){int choose, choose1, n;KeyType k; //查找关键字BSTree T; //BSTree *M;bool f1 = false, f2 = false; //f1判断有序表是否创建,f2判断二叉排序树是否创建while (1){choose = Menu();choose1 = 0;switch (choose){case 1:system("cls");{while (choose1 != 4){system("cls");choose1 = menu_X();switch (choose1){case 1:initName();initHashTable_X();_getch();break;case 2:findName_X(); _getch(); break;case 3:show(); _getch(); break;case 4: break;}}}break;case 2:system("cls");{while (choose1 != 4){system("cls");choose1 = menu_T();switch (choose1){case 1:initName();initHashTable_T();_getch();break;case 2:findName_T(); _getch(); break;case 3:show(); _getch(); break;case 4: break;}}}break;case 3:system("cls");{while (choose1 != 4){system("cls");choose1 = menu_L();switch (choose1){case 1:initName();initHashTable_L();_getch();break;case 2:findName_L(); _getch(); break;case 3:show_L(); _getch(); break;case 4: break;}}}break;case 4:system("cls");{printf("建立二叉排序树,输入大于等于则退出输入:\n");CreateBST(&T);f2 = true;break;}case 5:system("cls");{if (f2 == true){printf("请输入查找的关键字:\n");scanf("%d", &k);if (search(k, T) != NULL)printf("查找成功。

\n");elseprintf("查找失败。

\n");}elseprintf("二叉排序树不存在\n");break;}case 6:system("cls");{if (f2 == true){printf("请输入删除的关键字:\n");scanf("%d", &k);T = DelBST(T, k);}elseprintf("二叉排序树不存在\n");break;}case 7:system("cls");{if (f2 == true){printf("请输入插入的关键字:\n");scanf("%d", &k);InsertBST(&T, k);}elseprintf("二叉排序树不存在\n");break;}case 0:exit(0);}}}初始化哈希表:HashTable HashList[HashNum];void initHashTable_X() {int pos;int d, count;for (int n = 0; n < HashNum; n++) {HashList[n] = "";HashList[n]num = 0;HashList[n].pos = 0;}for (int i = 0; i < NameNum; i++) {count = 1;pos = nameList[i].namenum%HashNum; //哈希函数if (HashList[pos].pos == 0) {HashList[pos].data = nameList[i];HashList[pos].pos = 1;// printf("不冲突!");}else {d = pos;while (HashList[d].pos != 0) {// printf("冲突了!");d = (d + 1) % HashNum;count++;}HashList[d].data = nameList[i];HashList[d].pos = count;// printf("\n冲突了%d次的人是%s\n",count,nameList[i].name);}}printf("\n初始化完毕!");}int dup[dupSize];void initHashTable_T() {int pos;int d, count;int k = 0;for (int n = 0; n < HashNum; n++) {HashList[n] = "";HashList[n]num = 0;HashList[n].pos = 0;}for (int m = 1; m < dupSize / 2; m++){dup[k++] = m * m;dup[k++] = -m * m;}for (int i = 0; i < NameNum; i++) {count = 1;pos = nameList[i].namenum%HashNum; //哈希函数if (HashList[pos].pos == 0) {HashList[pos].data = nameList[i];HashList[pos].pos = 1;// printf("不冲突!");}else {d = pos; k = 0;while (HashList[d].pos != 0) {// printf("冲突了!");d = (d + HashNum + dup[k++]) % HashNum;count++;}HashList[d].data = nameList[i];HashList[d].pos = count;// printf("\n冲突了%d次的人是%s\n",count,nameList[i].name);}}printf("\n初始化完毕!");}Hash_L HashList_L[HashNum_L];void initHashTable_L() {int pos, count = 2;Hash_P p, q;for (int m = 0; m < HashNum_L; m++) {HashList_L[m].next = NULL;HashList_L[m] = "";HashList_L[m]num = 0;HashList_L[m].pos = 0;}for (int i = 0; i < NameNum; i++) {pos = nameList[i].namenum%HashNum_L;count = 2;if (HashList_L[pos].pos == 0) {//printf("\nthe first if");HashList_L[pos].data = nameList[i];HashList_L[pos].pos = 1;HashList_L[pos].next = NULL;// printf("——————不冲突!");}else {p = &HashList_L[pos];while (p->next != NULL) {p = p->next;count++;printf("冲突了!");}q = (Hash_P)malloc(sizeof(Hash_L));q->next = p->next;p->next = q;q->data = nameList[i];q->pos = count;// printf("\n冲突了%d次的人是%s\n",count,nameList[i].name);}}printf("初始化完毕!");}哈希表查找:void findName_X() {char fname[20] = { 0 };int findNum = 0, fhashNum = 0, d;printf("请输入学要查找的姓名(一小写拼音的形式):");scanf("%s", fname);for (int m = 0; m < 20; m++)findNum += fname[m];printf("\nfindNum is :%d\n", findNum);fhashNum = findNum % HashNum;if (HashList[fhashNum]num == 0) printf("该姓名不存在!");else if (HashList[fhashNum]num == findNum) printf("该学生姓名为:%s\n该学生关键字为:%d\n该学生位置为:%d\n 查找该学生冲突次数:%d\n",HashList[fhashNum], HashList[fhashNum]num, fhashNum, HashList[fhashNum].pos);else {d = fhashNum;while (HashList[d]num != findNum) {d = (d + 1) % HashNum;}printf("该学生姓名为:%s\n该学生关键字为:%d\n该学生位置为:%d\n 查找该学生冲突次数:%d\n", HashList[d], HashList[d]num, d, HashList[d].pos);}}void findName_T() {char fname[20] = { 0 };int findNum = 0, fhashNum = 0, d, k = 0;printf("请输入学要查找的姓名(一小写拼音的形式):");scanf("%s", fname);for (int m = 0; m < 20; m++)findNum += fname[m];printf("\nfindNum is :%d\n", findNum);fhashNum = findNum % HashNum;if (HashList[fhashNum]num == 0) printf("该姓名不存在!");else if (HashList[fhashNum]num == findNum) printf("该学生姓名为:%s\n该学生关键字为:%d\n该学生位置为:%d\n 查找该学生冲突次数:%d\n",HashList[fhashNum], HashList[fhashNum]num, fhashNum, HashList[fhashNum].pos);else {d = fhashNum;while (HashList[d]num != findNum) {d = (d + dup[k++] + HashNum) % HashNum;}printf("该学生姓名为:%s\n该学生关键字为:%d\n该学生位置为:%d\n 查找该学生冲突次数:%d\n", HashList[d], HashList[d]num, d, HashList[d].pos);}}void findName_L() {char fname[20] = { 0 };int findNum = 0, fhashNum = 0, pos;Hash_P p;printf("请输入学要查找的姓名(一小写拼音的形式):");scanf("%s", fname);for (int m = 0; m < 20; m++)findNum += fname[m];printf("\nfindNum is :%d\n", findNum);pos = findNum % HashNum_L;p = &HashList_L[pos];if (!p) printf("改姓名不存在!");while (p&&p->num != findNum) p = p->next;if (p->num == findNum) {printf("该学生姓名为:%s\n该学生关键字为:%d\n该学生位置为:%d\n 查找该学生冲突次数:%d\n", p->, p->num, pos, p->pos);}}四、【测试结果(Testing)】(10%)(本部分应包括:对实验的测试结果,应具体列出每次测试所输入的数据以及输出的数据,并对测试结果进行分析,可附截图)截图如下:五、【实验总结】(10%)(本部分应包括:自己在实验中完成的任务,及存在的问题,所完成实验过程中的具体经验总结、心得)这次实验使我对Hash查找表、Hash搜索算法有了熟练的掌握。

相关文档
最新文档