/*TODO: 创建通讯录散列表 功能描述: 根据输入的用户信息,电话号码调用散列函数ScoreH(也可自己实现)保存到S中,姓名调用散列函数MarkH(也可自己实现)保存到M中。 哈希值一样的情况要考虑冲突处理,如哈希值加1. 参数说明:AddressBook录入的通讯录 S电话号码散列表 M电话号码散列表 n姓名变量 返回值说明:OK成功 */
时间: 2024-03-23 13:40:24 浏览: 16
根据您的问题描述,您需要实现一个通讯录散列表的创建函数,函数名为 "CreateHashTable"。该函数将录入的通讯录信息进行散列处理,并将电话号码保存到S中,将姓名保存到M中。如果出现哈希值冲突,需要进行冲突处理,如将哈希值加1。该函数的返回值为OK表示创建成功。
以下是一个可能的实现:
```
#define OK 1
#define ERROR 0
#define maxn 80+10
typedef struct {
char name[maxn];
char phone[maxn];
} Contact;
int ScoreH(char* phone) {
// TODO: 实现电话号码散列函数
}
int MarkH(char* name) {
// TODO: 实现姓名散列函数
}
int CreateHashTable(Contact* AddressBook, char** S, char** M, int n) {
int i, j, k;
for (i = 0; i < n; i++) {
j = ScoreH(AddressBook[i].phone);
k = MarkH(AddressBook[i].name);
while (S[j] != NULL && M[k] != NULL) {
j = (j + 1) % maxn; // 处理哈希值冲突
k = (k + 1) % maxn;
}
if (S[j] == NULL) {
S[j] = AddressBook[i].phone;
}
else {
return ERROR; // 可能出现无法插入的情况
}
if (M[k] == NULL) {
M[k] = AddressBook[i].name;
}
else {
return ERROR; // 可能出现无法插入的情况
}
}
return OK;
}
```
在上述代码中,我们定义了一个 Contact 结构体,其中包含了每个通讯录的姓名和电话号码。在创建哈希表的过程中,我们将录入的通讯录信息遍历一遍。对于每个通讯录,我们调用 ScoreH 函数和 MarkH 函数将电话号码和姓名进行散列处理。如果哈希值对应的 S 和 M 数组位置都为空,那么就将电话号码和姓名保存到 S 和 M 中。如果出现哈希值冲突,我们就将哈希值加1,重新计算位置,直到找到一个空的位置为止。如果在遍历的过程中出现无法插入的情况,那么就返回 ERROR 表示创建失败。否则,我们就返回 OK 表示创建成功。