数据结构实验四
return root; } else
return NULL; }
测试结果:
4.哈希表查找。 数据结构为:
typedef struct Hash {
char data[50]; struct Hash *next; }Hash; typedef struct { int data; struct Hash *next; }FirstHash[30]; 将名字拼音字符串的各个字符所对应的 ASCII 码相加,所得的整数做为哈希表的关键字。用除留余数 法构建哈希函数,用伪随机探测再散列法处理冲突。 散列表的查找过程和建表过程类似。假设给定的值为 k,根据建表时设定的散列函数 H,计算出敢列地 址 H(k),若表中该地址对应的空间未被占用,则查找失败,把 k 插人该空单元中;否则将该地址中的值与 k 比较,若相等则查找成功,若不相等,则按事先设定的解决冲突的方法查找下一个地址。如此重复下去, 直至某个地址空间未被占用(查找失败把 k 插人该空单元)或关键字比较相等(查找成功)为止。
然后进行第二趟冒泡排序,即对前 n-1 个记录重复与第一趟冒泡排序类似的过程,结果使关键字次大 的记录被移到第 n-1 个记录位置上。
重复上述过程,直到“在一趟排序过程中没有进行过交换记录的操作”为止。所得录序列就是有序序 列。
冒泡排序算法:
void sort(int n) {
int i,j,buf; for (i=0; i<n-1; ++i) //比较 n-1 轮 {
主要算法(折半查找):
int binarysearch(int R[],int k,int n) {
int low=0,high=n-1,mid; while(low<=high) {
mid=(low+high)/2; if(R[mid]==k) return mid+1; else if(k<R[mid]) high=mid-1; else low=mid+1; } return -1; }
temp = temp->next; } if(temp == NULL)
cout << 0 << endl; else
cout << 1 << endl; }
测试结果:
四、收获与体会
本次实验联系了几种常用的查找算法、排序算法,基本熟悉了顺序查找和折半查找的思想;也着练习 了二叉排序树的创建,值的查找(位置)等,而且对遍历做了进一步练习;对哈希表也做了一些练习,用 取余法存储数据建哈希函数,用伪随机探测再散列法处理冲突,然后对哈希表进行查找。
测试结果:
3. 对于给定的一个有序序列,创建一颗高度最小的二叉排序树。
数据结构为: typedef struct node {
int data; struct node *lchild,*rchild; }BSTNode; 与前一道题一样,先要对初始数组排序,这里采用冒泡排序法,首先从第一个记录开始,将第一个记 录的关键字与第二个记录的关键字进行比较,若两个关键字为逆序(R[0]>R[1]),则交换两记录位置;然后 比较第二个记录与第三个记录,若两关键字为逆序,同样交换两记录位置;依次类推,直至第 n-2 个记录 和第 n-1 个记录比较完为止。上述过程称作第一趟冒泡排序,其结果使得 n 个记录中关键字最大的记录被 移到最后一个位置上。 然后进行第二趟冒泡排序,即对前 n-1 个记录重复与第一趟冒泡排序类似的过程,结果使关键字次大 的记录被移到第 n-1 个记录位置上。 重复上述过程,直到“在一趟排序过程中没有进行过交换记录的操作”为止。所得录序列就是有序序 列。
程序运行 20 分
Hale Waihona Puke 回答问题 15 分实验报告 30 分
特色 考勤违
功能 纪情况 成绩
5分
5分
其它批改意见:
考核 内容
评价在实验 课堂中的表 现,包括实 验态度、编 写程序过程 等内容等。
□功能完善, □功能不全 □有小错 □无法运行
○正确 ○基本正确 ○有提示 ○无法回答
○完整
○较完整 ○一般 ○内容极少
冒泡排序算法:
void sort(int n) {
int i,j,buf; for (i=0; i<n-1; ++i) //比较 n-1 轮 {
for (j=0; j<n-1-i; ++j) //每轮比较 n-1-i 次, {
if (R[j] > R[j+1]) {
buf = R[j]; R[j] = R[j+1]; R[j+1] = buf; } } } return; } 待数组排好序以后在进行二叉排序树的建立,要创建一颗高度最小的二叉排序树,就必须让左右子树 的结点个数越接近越好。所以我直接采用中间值来作为二叉树的根节点;将原数组分成左右均等或者相差 一个数的两个新数组;然后递归的对这两个新数组进行相同的处理,这样对于每一个根节点,其左右子树 的高度相差绝对值不会超过 1。
测试结果:
2.构造二叉排序树,并进行中序遍历。
数据结构为: typedef struct node {
int data; struct node *lchild,*rchild; }BSTNode; 要构造一个二叉排序树,首先要对输入的数组进行排序,本题我先用冒泡排序对数组进行排序,它的 具体步骤为: 首先从第一个记录开始,将第一个记录的关键字与第二个记录的关键字进行比较,若两个关键字为逆 序(R[0]>R[1]),则交换两记录位置;然后比较第二个记录与第三个记录,若两关键字为逆序,同样交换两 记录位置;依次类推,直至第 n-2 个记录和第 n-1 个记录比较完为止。上述过程称作第一趟冒泡排序,其 结果使得 n 个记录中关键字最大的记录被移到最后一个位置上。
5. 拼写检查 1)问题描述:现在有一些英语单词需要做拼写检查,你的工具是一本词典。需要检查的
单词,有的是词典中的单词,有的与词典中的单词相似,你的任务是发现这两种情况。单词 A 与单词 B 相似的情况有三种:
① 删除单词 A 的一个字母后得到单词 B; ② 用任意一个字母替换单词 A 的一个字母后得到单词 B; ③ 在单词 A 的任意位置增加一个字母后得到单词 B。 2)实验要求:发现词典中与给定单词相同或相似的单词。
三、实验过程与实验结果
1.折半查找算法 由于折半查找有两个限制:①要求查找必须采用顺序存储结构,即顺序表;②表中的元素必须按关键
字有序排列。 由于本题一开始所给出的序列有序,所以定义两个变量 low 和 high,初始时分别指向 R[0]和 R[n-1]。
首先将给定值 k 与有序表 R[0]到 R[n-1]的中点 mid=(low+high)/2 上的关键字 R[ mid]进行比较,若相等, 则查找成功。若 k < R[ mid],则说明 k 有可能落在[0... mid-1]区间中,于是修改 high,指向 mid -1 位置,在 R[0]到 R[ mid -1]中继续查找。若 k > R[ mid], 则说明 k 有可能落在[mid +1...n-1]区间中, 于是修改 low,指向 mid +1 位置。在 R[ mid + 1]到 R[n-1]中继续查找。每通过次比较,区间的长度就缩 小一半,如此不断进行下去,直至找到关键字为 k 的元素(查找成功)或 low > high,即查找失败为止。
for (j=0; j<n-1-i; ++j) //每轮比较 n-1-i 次, {
if (R[j] > R[j+1]) {
buf = R[j]; R[j] = R[j+1]; R[j+1] = buf; } } } return; } 待数组排好序以后在进行二叉排序树的建立,这道题我直接创建的是最小高度的二叉排序树,要创建 一颗高度最小的二叉排序树,就必须让左右子树的结点个数越接近越好。所以我直接采用中间值来作为二 叉树的根节点;将原数组分成左右均等或者相差一个数的两个新数组;然后递归的对这两个新数组进行相 同的处理,这样对于每一个根节点,其左右子树的高度相差绝对值不会超过 1。
查找的主要算法:
counts = (int)checkname[i][1] % 29; if(h[counts]->next == NULL)
cout << 0 << endl; else {
Hash *temp = h[counts]->next; while(temp!= NULL && strcmp(temp->data,checkname[i]) != 0) {
建立二叉排序树算法:
BSTNode* CreateBST(int low,int high) {
int mid = (low+high)/2; BSTNode *root; if(low<=high) {
root = (BSTNode*)malloc(sizeof(BSTNode)); root->data=R[mid]; root->lchild=CreateBST(low,mid-1); root->rchild=CreateBST(mid+1,high);
实验报告
学院(系)名称:计算机科学与工程学院
姓名
赵振宇
学号
20175302
专业
班级
2017 级 4 班 实验项目
实验四:查找算法应用
课程名称
数据结构与算法
课程代码
计算机科学与技术 0661913
实验时间
2019 年 6 月 3 日 第 3、4 节 实验地点