{int i,j=0;
printf(\当前表中信息如下:class/name/num/sex/phonenum\\n\for(i=0;i
{printf(\>elem[i].num,l->elem[i].sex,l->elem[i].phonenum); if(++j==3){j=0;printf(\printf(\
void main() {ST *l; ST *l2;
printf(\
l=initlist();createlist(l);printlist(l); printf(\用折半查询实现class1\\n\searchban(l); printf(\l2=initlist(); createlist(l2); printlist(l2);
printf(\用顺序查询实现class2\\n\searchshun(l2); }
实验十二 有序表查找算法的实现
实验预备知识:
1.理解记录、关键字和查找的相关概念。 2.熟练掌握有序表的存储结构。
一、实验目的
1.掌握排序算法及基本思想及实现的技术;能够根据实际问题特点的要求选择合理的排序方法;理解排序在数据处理中的重要性;
2.学会比较各种排序方法的稳定性分析以及在最好、最坏和平均情况的时间性能分析。 3.掌握顺序查找和折半查找两种查找的算法及实现技术;了解它们各自的优缺点。 4.熟悉各种查找方法的适用范围和条件;掌握顺序查找、折半查找的基本思想及效率分析。
二、实验环境
⒈ 硬件:每个学生需配备计算机一台。操作系统:DOS或Windows; ⒉ 软件:DOS或Windows操作系统+Turbo C;
三、实验要求
1.本次实验较为简单,每个同学独立按时完成,通过实验掌握记录的概念,为以后数据库技术打好基础。
2.如果输入数据较为繁琐,可减低每个班的人数。 3.输入输出数据要有提示,方便用户操作。
四、实验内容
1.在自己的U盘的“姓名+学号”文件夹中创建“实验11”文件夹,本次实验的所有程序和数据都要求存储到本文件夹中。
2.现在某个学院有20名同学分属于2个班级(Class1 和Class2,每个班有10名同学,每个同学记录包括:班级、学号、姓名、性别、电话号码等信息)。
3.以学号为主关键字,以班级为次关键字,建立一个顺序表,表中的每个数据元素是一个记录,其中的某个域用来存储关键字的值,按关键字的值进行顺序查找。为分析排序方法的稳定性,关键字可用次关键字。
4.完成如下函数(其中查找函数用顺序查询和折半查询两种方式实现),注意折半查询只适合有序的顺序表:
3.思考两种查找的效率分析和适用场合。 #include \#include \#include \
typedef struct {int cla; int num;
char name[20]; char sex;
long phonenum; }student;
typedef struct
{student *elem; int length; int sum; }ST;
ST *initlist() {ST *l;
l=(ST*)malloc(sizeof(ST)); if(!l)printf(\没有创建ST!\\n\
l->length=0;l->sum=3;
l->elem=(student*)malloc(3*sizeof(student)); if(!l->elem)printf(\没有创建elem!\\n\return(l); }
int place(ST *l,int c,int num) {int low,high,mid,j=-1,i; low=0;high=l->length-1; while(low<=high) {mid=(low+high)/2;
if(l->elem[mid].num>num)high=mid-1; else {j=mid;low=mid+1;}} i=j;
for(j=mid;j>=i;j--)
{if(j==-1||num>l->elem[j].num)break;
else if(num==l->elem[j].num&&c>l->elem[j].cla)break;} return(++j);}
void move(ST *l,int j) {int i;
for(i=l->length-1;i>=j;i--)
{l->elem[i+1].cla=l->elem[i].cla;
strcpy(l->elem[i+1].name,l->elem[i].name); l->elem[i+1].num=l->elem[i].num; l->elem[i+1].sex=l->elem[i].sex;
l->elem[i+1].phonenum=l->elem[i].phonenum;}}
void createlist(ST *l) {int i,j,c,num;
char nam[20],s;long p;
printf(\输入学生信息(class name num sex phonenum):\\n\for(i=0;i
scanf(\j=!(l->length)?0:place(l,c,num); move(l,j);
l->elem[j].cla=c;
strcpy(l->elem[j].name,nam); l->elem[j].num=num; l->elem[j].sex=s;
l->elem[j].phonenum=p; l->length++;}}
void searchshun(ST *l) {int num,c,i;
printf(\输入查找人的学号和班级号:\scanf(\for(i=0;i<=l->length;i++)
if(l->elem[i].num==num)break; if(i!=l->length)
printf(\>elem[i].num,l->elem[i].sex,l->elem[i].phonenum); else
printf(\无此人!\ }
void printlist(ST *l) {int i,j=0;
printf(\当前表中信息如下:class/name/num/sex/phonenum\\n\for(i=0;i
{printf(\>elem[i].num,l->elem[i].sex,l->elem[i].phonenum); if(++j==3){j=0;printf(\printf(\
void main() {
ST *l2; l2=initlist(); createlist(l2); printlist(l2);
printf(\用顺序查询实现class2\\n\searchshun(l2);
}
实验十三 二叉排序树的查找算法实现
实验预备知识:
1.理解哈希函数和哈希表。
2.掌握各种哈希函数和冲突解决办法。
一、实验目的
1.理解动态查找表的动态生成过程; 2.掌握二叉排序树的建立和查找;
二、实验环境
⒈ 硬件:每个学生需配备计算机一台。操作系统:DOS或Windows; ⒉ 软件:DOS或Windows操作系统+Turbo C;
三、实验要求
1.定义二叉排序树的数据结构;
2.实现二叉排序树的插入算法与查找算法,并建立二叉排序树; 3.进行数据查找和建树过程的比较。
四、实验内容
1.在自己的U盘的“姓名+学号”文件夹中创建“实验12”文件夹,本次实验的所有程序和数据都要求存储到本文件夹中。
2.已知一个个数为12的数据元素序列为{Dec,Feb,Nov,Oct,June,Sept,Aug,Apr,May, July,Jan,Mar},要求:
(1)按各数据元素的顺序(字母大小顺序)构造一棵二叉排序数,并中序打印排序结果。
(2)查找数据\是否存在。
3.已知一棵二叉排序树,其根结点的地址为 root。请编写一个程序,构造出一棵具有相同结点的满二叉树,且它同样是二叉排序树。提示:可利用中序遍历,分别找出各个结点序列的中点元素,然后重新构造一棵二叉排序树。 #include