云南大学数据结构实验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}……}【核心算法提示】查找操作是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或记录的过程。

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

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

数据结构实验七

数据结构实验七

数据结构实验报告——实验7一、实验目的掌握二叉链表及二叉树的创建、遍历;二、实验内容1、(必做题)假设二叉树中数据元素类型是字符型,请采用二叉链表实现二叉树的以下基本操作:(1)根据二叉树的先序序列和中序序列构造二叉树;(2)根据先序遍历二叉树;(3)根据中序遍历二叉树;(4)根据后序遍历二叉树。

测试数据包括如下错误数据:先序:1234;中序:12345先序:1234;中序:1245先序:1234;中序:42312、(必做题)对于一棵二叉树,请实现:(1)计算二叉树的叶子数目;(2)计算二叉树的深度。

3、(选做题)给定n个权值,请构造它们的最优二叉树(赫夫曼树)。

三、算法描述(采用自然语言描述)1、分别输入n个先序序列和中序序列,先序序列中第一个字符为根节点,在中序序列中找到根节点所在的位置,在根节点左边的为左子树节点,在根节点右边的为右子树节点,然后采用递归的形式依次对左右子树进行构造;二叉树的遍历也是采用递归的形式,先序遍历二叉树:先序遍历根,先序遍历左子树,先序遍历右子树;中序遍历二叉树:中序遍历左子树,中序遍历根,中序遍历右子树;后序遍历二叉树:后序遍历左子树,后序遍历右子树,后序遍历根。

四、详细设计五、程序代码(给出必要注释)1、#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define N 100typedef char ElementType ;typedef struct node{ElementType data ;struct node * leftChild ;struct node * rightChild ;}BTNode;BTNode *createBT(char *pre , char *in ,int n) {BTNode *b;char *p ;int k ;if(n<=0)return NULL;b=(BTNode *)malloc(sizeof(BTNode));b->data = *pre ;int j=0;for(p=in;p<in+n;p++){if(*p == *pre)break;}k=p-in;b->leftChild = createBT(pre+1,in,k);b->rightChild = createBT(pre+1+k,p+1,n-k-1);return b ;void showBTPreOrder(BTNode *b){if(b != NULL){printf("%c ",b->data);showBTPreOrder(b->leftChild);showBTPreOrder(b->rightChild);}}void showBTInOrder(BTNode *b){if(b!=NULL){showBTInOrder(b->leftChild);printf("%c ",b->data);showBTInOrder(b->rightChild);}}void showBTTailOrder(BTNode *b){if(b==NULL)return;showBTTailOrder(b->leftChild);showBTTailOrder(b->rightChild);printf("%c ",b->data);}int main(){char pre[N];char in[N];int n = 0;char ch;BTNode* b=NULL;printf("请输入先序序列\n");while((ch = getchar())&&ch!='\n')pre[n++] = ch;printf("请输入中序序列\n");n = 0;while((ch = getchar())&&ch!='\n')in[n++] = ch;b=createBT(pre,in,n);printf("先序遍历二叉树:\n");showBTPreOrder(b);printf("\n");printf("中序遍历二叉树:\n");showBTInOrder(b);printf("\n");printf("后序遍历二叉树:\n");showBTTailOrder(b);printf("\n");return 0 ;}2、#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define N 100typedef char ElementType ;typedef struct node{ElementType data ;struct node * leftChild ;struct node * rightChild ;}BTNode;BTNode *createBT(char *pre , char *in ,int n) {BTNode *b;char *p ;int k ;if(n<=0)return NULL;b=(BTNode *)malloc(sizeof(BTNode));b->data = *pre ;int j=0;for(p=in;p<in+n;p++){if(*p == *pre)break;}k=p-in;b->leftChild = createBT(pre+1,in,k);b->rightChild = createBT(pre+1+k,p+1,n-k-1);return b ;}int Count(BTNode * top){if(top == NULL){return 0;}else if ((top->leftChild==NULL) && (top->rightChild==NULL)){ return 1;}else{return Count(top->leftChild)+Count(top->rightChild);}}int TreeDepth(BTNode * top){int rightdep=0;int leftdep=0;if(top==NULL)return -1;if(top->leftChild!=NULL)leftdep=TreeDepth(top->leftChild);elseleftdep=-1;if(top->rightChild!=NULL)rightdep=TreeDepth(top->rightChild);elserightdep=-1;return (rightdep>leftdep) ? rightdep+1 : leftdep+1;}int main(){char pre[N];char in[N];int n = 0;char ch;BTNode* b=NULL;printf("请输入先序序列\n");while((ch = getchar())&&ch!='\n')pre[n++] = ch;printf("请输入中序序列\n");n = 0;while((ch = getchar())&&ch!='\n')in[n++] = ch;b=createBT(pre,in,n);printf("二叉树的叶子数目为:%d\n",Count(b));printf("二叉树的深度为:%d\n",TreeDepth(b));return 0 ;}六、测试和结果(给出测试用例,并给出测试结果)1、2、七、用户手册(告诉用户如何使用程序,使用注意事项等)两个程序只能输入字符,并且两次输入的字符个数要一样,字符个数上限为100。

数据结构实验报告七查找

数据结构实验报告七查找

云南大学软件学院数据结构实验报告(本实验项目方案受“教育部人才培养模式创新实验区(X3108005)”项目资助)实验难度: A □ B □ C □序号学号姓名成绩123指导教师(签名)学期:2010秋季学期任课教师:实验题目: 查找算法设计与实现姓名: 王辉学号: 20091120154电子邮件:完成提交时间: 2010 年 12 月 27 日云南大学软件学院2010学年秋季学期《数据结构实验》成绩考核表学号:姓名:本人承担角色:综合得分:(满分100分)指导教师:年月日(注:此表在难度为C时使用,每个成员一份。

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

难度A满分70分,难度B满分90分)一、【实验构思(Conceive)】(10%)1 哈希表查找。

根据全年级学生的姓名,构造一个哈希表,选择适当的哈希函数和解决冲突的方法,设计并实现插入、删除和查找算法。

熟悉各种查找算法的思想。

2、掌握查找的实现过程。

3、学会在不同情况下运用不同结构和算法求解问题。

4 把每个学生的信息放在结构体中:typedef struct //记录{NA name;NA tel;NA add;}Record;5 void getin(Record* a)函数依次输入学生信息6 人名折叠处理,先将用户名进行折叠处理折叠处理后的数,用除留余数法构造哈希函数,并返回模值。

并采用二次探测再散列法解决冲突。

7姓名以汉语拼音形式,待填入哈希表的人名约30个,自行设计哈希函数,用线性探测再散列法或链地址法处理冲突;在查找的过程中给出比较的次数。

完成按姓名查询的操作。

将初始班级的通讯录信息存入文件。

二、【实验设计(Design)】(20%)(本部分应包括:抽象数据类型的功能规格说明、主程序模块、各子程序模块的伪码说明,主程序模块与各子程序模块间的调用关系)1抽象数据类型的功能规格说明和结构体:#include<stdio.h>#include<stdlib.h>#include<string>#include <windows.h>#define MAXSIZE 20 //电话薄记录数量#define MAX_SIZE 20 //人名的最大长度#define HASHSIZE 53 //定义表长#define SUCCESS 1#define UNSUCCESS -1#define LEN sizeof(HashTable)typedef int Status;typedef char NA[MAX_SIZE];typedef struct //记录{NA name;NA tel;NA add;}Record;typedef struct //哈希表{Record *elem[HASHSIZE]; //数据元素存储基址int count; //当前数据元素个数int size; //当前容量}HashTable;2 主函数与各子函数的调用关系:(通过switch(num)函数按不同功能要求分别调用相关函数)int main(int argc, char* argv[]){system("color 61");int c,flag=1;HashTable *H;H=(HashTable*)malloc(LEN);for(int i=0;i<HASHSIZE;i++)H->elem[i]=NULL;H->size=HASHSIZE;H->count=0;Record a[MAXSIZE];while (1){printf("\n ★☆★☆★☆★☆★☆wang hui★☆★☆★☆★☆★☆★☆");printf("\n ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★");printf("\n ★☆★☆我的未来不是梦★☆★☆");printf("\n ★☆★☆无聊中郁闷死★☆★☆");printf("\n ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★");printf("\n ┏━━━━━━━━━━━━━┓");printf("\n ★┃欢迎欢迎欢迎欢迎欢迎欢迎┃★");printf("\n 〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓"); printf("\n ★★★★★★★哈希表的设计与实现★★★★★★");printf("\n 【】. 添加用户信息");printf("\n 【】. 读取所有用户信息");printf("\n 【】. 以姓名建立哈希表(再哈希法解决冲突) ");printf("\n 【】. 以电话号码建立哈希表(再哈希法解决冲突) ");printf("\n 【】. 查找并显示给定用户名的记录");printf("\n 【】. 查找并显示给定电话号码的记录");printf("\n 【】. 清屏");printf("\n 【】. 保存");printf("\n 【】. 退出程序");printf("\n 温馨提示:");printf("\n Ⅰ.进行操作前请先输出");printf("\n Ⅱ.进行操作前请先输出");printf("\n ★★★★★★★〓〓〓〓〓〓〓〓〓★★★★★★");printf("\n");printf("请输入一个任务选项>>>");printf("\n");int num;scanf("%d",&num);switch(num){case 1:getin(a);break;case 2:ShowInformation(a);break;case 3:CreateHash1(H,a); /* 以姓名建立哈希表*/break;case 4:CreateHash2(H,a); /* 以电话号码建立哈希表*/break;case 5:c=0;SearchHash1(H,c);break;case 6:c=0;SearchHash2(H,c);break;case 7:Cls(a);break;case 8:Save();break;case 9:return 0;break;default:printf("你输错了,请重新输入!");printf("\n");}}system("pause");return 0;}三、【实现描述(Implement)】(30%)(本部分应包括:抽象数据类型具体实现的函数原型说明、关键操作实现的伪码算法、函数设计、函数间的调用关系,关键的程序流程图等,给出关键算法的时间复杂度分析。

云南大学软件学院数据库实验7:DB2_Customization

云南大学软件学院数据库实验7:DB2_Customization

云南大学软件学院实验报告课程:数据库原理与实用技术实验学期:2011-2012学年第二学期任课教师:专业:学号:姓名:成绩:Exercise 1_DB2 Customization Section 2 - Creating a New User ID1. Use the User Manager application to create your new user ID called inst1. Answer:1) create your new user ID called inst1.(用户名:inst1全名:inst1 Instance SysAdmin描述:System Administrator for INST1 Instance密码:inst1用户组:Administrators)右击计算机,选择管理,.2)更改inst1的账户类型在控制面板里,. Section 4 - Creating the Instance1. Open up a DB2 Command Window and issue the following command: db2ilist Record the output:Answer:在开始菜单里找到IBM的DB2,打开命令行工具输入db2ilist,查看主机的实例得:2. For your lab environment, you will create another instance called INST1. (创建称为inst1 的新实例)Answer:在命令窗口中输入如下命令:1)输入db2icrt inst1,创建称为inst1 的新实例2)查看你所创建的新实例inst1输入db2ilist后显示:3. Reissue the command to list your instances. Now which instances are listed?Answer:实例有:inst1 和DB2,Section 5 - Creating the DB2 System Administrator Group(建立DB2 系统管理员用户组)按以下要求建立DB2 系统管理员用户组adm1(adm1 应小写而且),并且使inst1 和db2admin成为该组成员组名:adm1描述:inst1 Instance SysAdmin Group可以桌面上,右击“计算机”,选择“管理”,右如下界面创建新组adm1(adm1 应小写而且),并且使inst1 和db2admin成为该组成员,同样,先建adm1再按照要求添加那2个用户,就可以了结果:Section 6 - Setting the Environment1. Perform the following tasks to check your DB2 environment variables.What is the DB2INSTANCE (default instance) Value in System Variables?Answer:做如下的选择Change the system variable value of DB2INSTANCE to INST1.所以,没有包含X:\SQLLIB\BIN2. Do the following to verify your DB2 environment variables are correct. Answer:选择开始菜单—>程序—>附件—>命令提示符;输入: set | more3. Check the values of your registry variables(注册变量表) (hint: use db2set on aDB2 Command Window).在DB2的命令窗口中What is the value for your DB2 Administration Server?Answer:4. What is your system name?Answer:Section 7 - Exploring and Setting Database Manager Configuration Parameters4. Record the following values:(打开控制中心,按照要求去找)a. Does the AUTHENTICATION parameter have a value (look under theAdministration)? What is the purpose of this parameter? What are the possible values for this parameter?answer:b. Does the SYSADM_GROUP parameter have a value (look underAdministration)? What is the value of this parameter? What is the hint associated with it?answer:c. What is the value of NODETYPE (look under Environment) answer:。

云南大学软件学院计算机网络原理实验七

云南大学软件学院计算机网络原理实验七

实验七、Link States Algorithm 的实现序号:_____ 姓名: __________ 学号:2016 成绩 _________1. 实验目的:通过编程模拟实现LSA.2. 实验环境:软件开发平台,可以使用任何编程语言。

3. 实验要求(1)求网络中任何两个结点之间的最短路径(网络中至少有4个节点)。

(2)得到任何一个节点上的转发表。

4. 实验内容、拓扑结构通过链路状态算法计算A点到其它各点的cost,最终输出A的路由表。

算法提示:In itializati on:2 N' = {u} /*u is source node*/3 for all no des j /* j is dest no de*/4 if j adj ace nt to u5 then D(j) = c(u,j)6 else D(j) = g77 Loop8 find i not in N' such that D(i) is a minimum9 add i to N'10 update D(j) for all j adjace nt to i and not in N':11 D(j) = min( D(j), D(i) + c(i,j))12 /* new cost to j is either old cost to j or known13 shortest path cost to i plus cost from i to j */14 until all nodes in N'4.实验分析,回答下列问题(1)给出LSA算法的主要思想。

LSA 算法即链路状态选路算法, 该算法中,网络拓扑和所有的链路费用都是已知的。

它的具体实现依据Dijkstra 算法,其主要思想是计算从某节点(源节点, u )到网络中所有其他节点的最短路径。

其算法是迭代算法, 即经算法的第k 次迭代后,可知道到k 个目的节点的最低 费用路径,在在到所有目的节点的最低费用路径之中,这k 条路径具有k 个最低费用。

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

云南大学软件学院数据结构实验
云南大学软件学院数据结构实验
———————————————————————————————— 作者:
———————————————————————————————— 日期:
实验难度:A□B □ C □
序号
学号
姓名
成绩
指导教师
(签名)
学 期:2017秋季学期
任课教师:ﻩ刘宇
实验题目:
组员及组长:
承担工作:
ﻩﻩﻩz.real=(z1.real*z2.real-z1.imag*z2.imag)/(z1.real*z1.real-z1.imag*z1.imag);
ﻩz.imag = (z1.imag*z2.real-z1.real*z2.imag)/(z1.real*z1.real-z1.imag*z1.imag);
用到的数学知识:复数四则运算,与或非运算,进行分支判断;
程序设计知识:目标分析->设计算法->程序编写->后期调试。
二、【实验设计(Design)】(20%)
(本部分应包括:抽象数据类型的定义和基本操作说明,程序包含的模块以及各模块间的调用关系,关键算法伪码描述及程序流程图等,如有界面则需包括界面设计,功能说明等)
ﻩ{
ﻩﻩif(fushu[k]=='+'||fushu[k] =='-')//判断是否为完整复数
ﻩﻩflag1++;
ﻩﻩﻩelseif(fushu[k]=='i')/*判断是否为纯实数*/
ﻩﻩflag2++;
}
ﻩif(flag2 > 1)
{
ﻩﻩprintf("ERROR!");
ﻩﻩsystem("pause");

数据结构实验报告[1]

数据结构实验报告[1]

云南大学数据结构实验报告第一次实验学号:姓名:一、实验目的1、复习变量、数据类型、语句、函数;2、掌握函数的参数和值;3、了解递归。

二、实验内容1、(必做题)采用函数统计学生成绩:输入学生的成绩,计算并输出这些学生的最低分、最高分、平均分。

2、(必做题)采用递归和非递归方法计算k阶裴波那契序列的第n项的值,序列定义如下:f0=0, f1=0, …, fk-2=0, fk-1=1, fn= fn-1+fn-2+…+fn-k(n>=k) 要求:输入k(1<=k<=5)和n(0<=n<=30),输出fn。

3、(选做题)采用递归和非递归方法求解汉诺塔问题,问题描述如下:有三根柱子A、B、C,在柱子A上从下向上有n个从大到小的圆盘,在柱子B和C上没有圆盘,现需将柱子A上的所有圆盘移到柱子C上,可以借助柱子B,要求每次只能移动一个圆盘,每根柱子上的圆盘只能大的在下,小的在上。

要求:输入n,输出移动步骤。

三、算法描述(采用自然语言描述)1、①先输入需统计的学生人数。

②根据学生人数输入成绩,计算成绩总和和平均分。

③比较成绩大小,得出最低分和最高分。

④输出计算结果。

2、⑴①写出不同情况下求k阶裴波那契序列的第n项的值的递归函数。

②输入k和n。

③输出计算结果。

四、详细设计(画出程序流程图)1、2、⑴五、程序代码(给出必要注释)1、#include <stdio.h>#include <stdlib.h>#define N 100 /*先预计输入人数在0~100内,如果人数多于100再将100改成更大的数*/void main(){int i,x[N],a;int max,min;float ave,sum=0.0;printf("请输入不多于%d的学生人数:",N);scanf("%d",&a); /*输入学生数*/for(i=0;i<a;i++){printf("请输入第个%d学生成绩(整数):",i+1);scanf("%d",&x[i]);sum=sum+x[i];} /*输入分数*/ave=sum/a; /*计算平均分*/max=x[0];min=x[0];for(i=0;i<a;i++){if(x[i]>=max){max=x[i];}if(x[i]<=min){min=x[i];} }printf("平均分是:%f",ave);printf("最高分是:%d",min);printf("最低分是:%d",max);/*输出平均分,最低分,最高分*/ return 0;}2、⑴#include <stdio.h>#include <stdlib.h>int k;int Fibonacci (int n1){if(n1<k-1)return 0;else if(n1==k-1||n1==k)return 1;else if(n1==k+1)return 2;elsereturn (2*Fibonacci(n1-1)-Fibonacci(n1-k-1));}int main(){int n,fn=0;printf("请输入整数k(大于等于1):");scanf("%d",&k);printf("请输入整数n(大于k):");scanf("%d",&n);while(k==1){printf("f%d=1\n",n);break;}while(k>1){fn=Fibonacci(n);printf("f%d=%d",n,fn);break;}return 0;}六、测试和结果(给出测试用例以及测试结果)1、2、七、用户手册(告诉用户如何使用程序)1、打开并运行程序,根据提示输入学生人数和学生成绩,每次输入后都按enter键。

云大 信息 linux 实验七

云大 信息 linux 实验七
2、通过另外一台Windows机器,用FileZilla客户端访问Ftp服务器,并实现下载文件和上传文件的功能。
四、实验步骤
1、为你的Linux系统分配一个IP地址:192.168.134.7(x为一个数字),通过另外一台Windows机器,用ftp命令访问Ftp服务器,并实现下载文件和上传文件的功能。
《Linux操作系统》实 验 报 告
年级2012级专业电子信息科学与技术
学生姓名吕佳琪学号***********
任课教师余鹏飞
实验成绩
云南大学信息学院
实验七Linux下Ftp服务器的架设
开课教室:文汇楼32082014年5月14日
一、实验目的:
在Linux系统里架设Vsftpd服务器,熟悉Ftp的各项操作;
文字流畅
其他:
评价教师签名:
年月日
虽然不能删除,但对/etc/passwd及/etc/group中的ftp用户及ftp用户组的一些相关的东西是能修改的。
4.vsFTPd服务器启动和关闭是极容易的;可以直接把服务器运行调到后台运行;这是几乎所有服务器管理的运行方式;
教 师 评 价
评定项目
A
B
C
D
评定项目
A
B
C
D
实验结果正确
操作熟练
报告规范
图1:检查虚拟机下vsFTP的服务器
图2:开启vsFTP服务
图3:测试vsftp是否已启动
图4:在windows下使用ftp命令进入Linux的服务
图5
图6:登录显示程序未连接,输入相关命令
图7:重新登录成功
图8:下载welcome文件
图9:上传文件
图10:在FileZilla下上传文件

云南大学软件学院数据结构实验6

云南大学软件学院数据结构实验6

云南大学软件学院数据结构实验6预览说明:预览图片所展示的格式为文档的源格式展示,下载源文件没有水印,内容可编辑和复制实验难度:A □ B □ C □学期:2017秋季学期任课教师:实验题目:组员及组长:承担工作:联系电话:电子邮件:完成提交时间:年月日一、【实验构思(Conceive)】(10%)(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计等相关知识,对问题进行概要性地分析)1.基本思路:用无向网表示校区内的各建筑的平面图,图中顶点表示主要建筑,存放建筑的编号、名称、简介等信息,图中的边表示建筑间的道路,存放路径长度等信息,将导游图看作一张带权无向图,顶点表示校园的各个建筑,边表示各建筑之间的道路,边上的权值表示距离;根据用户的输入信息用迪杰斯特拉算法计算出任意两个地点之间的最短路径,并用二维数组来存储相关的信息,输出给用户;同时用数组存储各个地点的相关信息,当用户输入要了解的地点名称是,调用相关函数输出该地点的相关信息给用户。

2、在程序中运用到了图的相关知识以及迪杰斯特拉算法和哈密尔顿图的遍历等,无向图的相关知识和相关操作,还有图的存储及相关的数据结构。

二、【实验设计(Design)】(20%)(本部分应包括:抽象数据类型的定义和基本操作说明,程序包含的模块以及各模块间的调用关系,关键算法伪码描述及程序流程图等,如有界面则需包括界面设计,功能说明等)主程序模块:该模块包含一个main函数,在main函数中调用其他函数和子程序。

int main(){int v0, v1;int i, num;char flag;Create(NUM, 11);do{flag = Menu();switch (flag){case'1':system("cls");//清空屏幕的当前内容List();//输出景点列表printf("\请选择起点景点(0~26):");scanf("%d", &v0);printf("\请选择终点景点(0~26):");scanf("%d", &v1);ShortPath(v0);//求出最短路径Output(v0, v1);//输出结果printf("\请按任意键继续...\");getchar();//利用getchar()函数让程序运行到上一行时,等待下下一个按键时才返回getchar();break;system("cls");List();printf("\请输入您要查找的景点编号:"); scanf("%d", &num);for (i = 0; i<="" p="">{if (num == g.vex[i].number){printf("\你要查找的景点信息如下:"); printf("\%s:", g.vex[i].sight);printf("%s\\", g.vex[i].description); printf("\按任意键返回...");getchar();getchar();break;}}if (i == NUM){printf("\没有找到!");printf("\按任意键返回...");getchar();getchar();}break;case'e':exit(0);}} while (flag != '0');}流程图:子程序模块包括:地点列表函数、输出函数、哈密尔顿图的遍历函数、迪杰斯特拉算法判断最短路径函数、创建图的函数。

数据结构上机实验7

数据结构上机实验7

数据结构上机实验(七)哈夫曼编码班级:学号:姓名:上机时间:地点:一、实验目的1.进一步掌握结构体变量的含义。

2.掌握二叉树的结构特征,以及各种存储结构的特点及使用范围。

3.掌握哈夫曼树的构造及哈夫曼编码。

二、实验内容根据输入的结点及其权值建立一棵哈夫曼树,并对输入的结点进行哈夫曼编码,打印输出编码结果。

三、实验过程1.了解常用函数所在的头文件stdlib.hstdlib 头文件里包含了C语言的一些函数该文件包含了的C语言标准库函数的定义stdlib.h里面定义了五种类型、一些宏和通用工具函数。

类型例如size_t、wchar_t、div_t、ldiv_t和lldiv_t;宏例如EXIT_FAILURE、EXIT_SUCCESS、RAND_MAX 和MB_CUR_MAX等等;常用的函数如malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit()等等。

具体的内容你自己可以打开编译器的include目录里面的stdlib.h头文件看看。

conio.hconio.h不是C标准库中的头文件。

conio是Console Input/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作,比如getch()函数等等。

&表示引用传递。

在函数参数表中,出现带&这个的形参,表示引用传递。

2.程序实现(以下代码仅起参考作用)#include<stdio.h>#define MAX 21typedef struct{char data; // 结点值int weight; // 权重int parent; // 父节点int left; // 左结点int right; // 右结点}huffnode;typedef struct{char cd[MAX];int start;}huffcode;void main(){huffnode ht[2*MAX];huffcode hcd[MAX],d;int i,k,f,l,r,n,c,m1,m2;printf("元素个数:");scanf("%d",&n);for (i=1;i<=n;i++){getchar();printf("第%d个元素=>\n\t结点值:",i);scanf("%c",&ht[i].data);printf("\t权重:");scanf("%d",&ht[i].weight);}for (i=1;i<=2*n-1;i++)ht[i].parent=ht[i].left=ht[i].right=0;for (i=n+1;i<=2*n-1;i++) // 构造Huffman树{m1=m2=32767; // l和r为最小权重的两个结点位置l=r=0;for (k=1;k<=i-1;k++)if(ht[k].parent==0)if(ht[k].weight<m1){m2=m1;r=l;m1=ht[k].weight;l=k;}else if(ht[k].weight<m2){m2=ht[k].weight;r=k;}ht[l].parent=i;ht[r].parent=i;ht[i].weight=ht[l].weight+ht[r].weight;ht[i].left=l;ht[i].right=r;}for (i=1;i<=n;i++) // 根据Huffman树求Huffman编码{d.start=n+1;c=i;f=ht[i].parent;while (f!=0){if(ht[f].left==c)d.cd[--d.start]='0';else d.cd[--d.start]='1';c=f;f=ht[f].parent;}hcd[i]=d;}printf("输出哈夫曼编码:\n");for (i=1;i<=n;i++){printf("%c: ",ht[i].data);for(k=hcd[i].start;k<=n;k++)printf("%c",hcd[i].cd[k]);printf("\n");}}注意:每输入一个数据敲一下回车键。

  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搜索算法有了熟练的掌握。

相关文档
最新文档