#include<stdio.h> #include<stdlib.h> int HashSearch1(int ht[], int m, int k, int *p); int H(int k); int main() { int index, i; int r\[\] = { 43, 7, 29, 11, 16, 91, 22, 8, 3 }; int ht\[11\] = { 0 }; for (i = 0; i < 9; i++) { HashSearch1(ht, 11, r\[i\], &index); printf("元素%d的存储下标是%d\\n", r\[i\], index); } for (i = 0; i < 11; i++) printf("%d ", ht\[i\]); getchar(); return 0; } int HashSearch1(int ht[], int m, int k, int *p) /*形参p传指针,返回位置*/ { int i, j, flag = 0; j = H(k); i = j; while (ht\[i\] != 0 && flag == 0) { if (ht\[i\] == k) { \*p = i; return 1; } else i = (i + 1) % m; if (i == j) flag = 1; } if (flag == 1) { printf("溢出"); exit(-1); } else { ht\[i\] = k; \*p = i; return 0; } } int H(int k) { return k % 11; } 1、int H(int k)的作用式什么?(2分) 2、给出代码的运行结果,上诉代码完成的主要功能什么?(8
时间: 2024-04-26 17:25:35 浏览: 51
1、函数H(int k)的作用是将关键字k映射到哈希表中的某个位置,具体来说,这个函数将关键字k对哈希表的大小(11)取模,得到的余数就是k在哈希表中的存储位置。
2、代码的运行结果如下所示:
元素43的存储下标是10
元素7的存储下标是7
元素29的存储下标是7
元素11的存储下标是0
元素16的存储下标是5
元素91的存储下标是3
元素22的存储下标是0
元素8的存储下标是8
元素3的存储下标是3
11 11 11 43 0 16 0 7 8 29 91
该代码的主要功能是实现了哈希查找算法,其中,哈希表的大小为11,要查找的元素存储在数组r中,通过调用函数HashSearch1来将这些元素存储到哈希表ht中,并输出它们在哈希表中的存储位置。最后,输出整个哈希表的内容。在这个过程中,如果哈希表已经被占满,就会输出“溢出”并退出程序。
相关问题
优化以下代码#include<stdio.h> #include<stdlib.h> int HashSearch1(int ht[ ], int m, int k, int *p) { int i, j, flag = 0; j = H(k); i = j; while (ht[i] != 0 && flag == 0) { if (ht[i] == k) { *p = i; return 1; } else i = (i + 1) % m; if (i == j) flag = 1; } if (flag == 1) {printf("溢出"); exit(-1);} else { ht[i] = k; *p = i; return 0; } }
这段代码的优化点主要有以下几个:
1. 减少重复计算:在while循环中,每次都要计算下一个位置的散列地址,可以将计算散列地址的语句移到while循环外面,只计算一次,然后在循环中直接使用计算结果。
2. 简化判断逻辑:在while循环中,每次都要判断是否已经找到空位置或回到起始位置,可以将这两个判断放到一起,用一个判断语句替代,使代码更简洁。
3. 减少不必要的变量:flag变量只用于判断散列表是否已满,可以用一个if语句替代。
下面是优化后的代码:
```c
int HashSearch1(int ht[], int m, int k, int *p) {
int i, j;
j = H(k);
i = j;
int empty = -1; // 记录空位置
while (ht[i] != 0) {
if (ht[i] == k) {
*p = i;
return 1;
}
if (ht[i] == -1 && empty == -1) {
empty = i;
}
i = (i + 1) % m;
if (i == j) break;
}
if (ht[i] == 0 && empty != -1) { // 插入元素
ht[empty] = k;
*p = empty;
return 0;
}
printf("溢出");
exit(-1);
}
```
在优化后的代码中,我们增加了一个变量empty来记录空位置的下标,当第一次遇到空位置时,将其记录下来。如果在遍历完整个散列表后,没有找到元素k的位置,并且存在空位置,则可以将元素k插入到empty处,并将empty作为插入位置返回。如果散列表已满,则输出“溢出”并退出程序。
#include<stdio.h> #include<stdlib.h> int HashSearch1(int ht[ ], int m, int k, int *p) /*形参p传指针,返回位置*/ { int i, j, flag = 0; /*flag=0表示散列表未满*/ j = H(k); /*计算散列地址*/ i = j; /*记载比较的起始位置*/ while (ht[i] != 0 && flag == 0) { if (ht[i] == k) { /*比较若干次查找成功*/ *p = i; return 1; } else i = (i + 1) % m; /*向后探测一个位置*/ if (i == j) flag = 1; /*表已满*/ } if (flag == 1) {printf("溢出"); exit(-1);} /*表满,产生溢出*/ else { /*比较若干次查找不成功,插入*/ ht[i] = k; *p = i; return 0; } }
这段代码是实现了一个散列表中的线性探测法查找和插入元素的函数。其中,ht是散列表数组,m是散列表大小,k是要查找或插入的元素,p是一个指向位置的指针,函数返回值为1表示查找成功,返回值为0表示插入成功。具体实现过程是,首先计算元素k的散列地址j,然后从j开始向后探测,直到找到空位置或者回到j位置。如果找到了元素k,则返回1并将位置i存入指针p中;如果找到了空位置,则将元素k插入该位置并返回0,同时将位置i存入指针p中;如果探测过程中回到了起始位置j,说明散列表已满,产生溢出并退出程序。
阅读全文