我有一个哈希表数据结构,我在其中保存一个带有名称和电话号码的节点链表。我实现了一个插入函数,它会散列姓氏并相应地插入节点。输入是通过控制台手动完成的,完全按预期工作。
我现在正在实现一个函数,该函数将从文件中读取此信息并重复调用insert函数(对于每个列表)。文件中的信息格式如下:
测试用户1234567890
测试用户1234567890
测试用户1234567890
它似乎工作正常,直到我尝试从哈希表中检索值,并且我只能检索添加到表中的最后一个值(从文件中,手动输入工作正常)。我已经将每个输入一直跟随到它们被添加到链接列表的点,并且它们仍然包含正确的值。我还检查了散列函数以确保它没有将它们放在不正确的索引中,但生成的索引在文件和手动输入之间是相同的。
这是我的文件输入代码:
#define DEF_SIZE 50
char* lastName = malloc(DEF_SIZE * sizeof(char));
char* firstName = malloc(DEF_SIZE * sizeof(char));
char* phoneNumber = malloc(DEF_SIZE * sizeof(char));
printf("\nAttempting to load phonebook from file...\n\n");
f = fopen("phone.txt", "r");
if (f == NULL){
printf("Cannot open file.\n");
getchar();
exit(1);
}
int counter = 0;
while (fscanf(f, "%s %s %s", lastName, firstName, phoneNumber) != EOF){
insert(lastName, firstName, phoneNumber, hashTable);
counter++;
}
printf("Successfully inserted %d items from the file.");
我的插入功能:
int insert(char *lastName, char *firstName, char *phoneNumber, node *hashTable[]){
//holder for linked list index
int hashResult;
//get key from last name
hashResult = hashFunction(lastName);
//create node for adding listing
node *addNode = malloc(sizeof *addNode);
//check if malloc is successful
if (addNode == NULL){
return 0;
}
//allocate space for names + number
addNode->lastName = malloc(strlen(lastName) + 1);
addNode->firstName = malloc(strlen(firstName) + 1);
addNode->phoneNumber = malloc(strlen(phoneNumber) + 1);
//add data to node
addNode->lastName = lastName;
addNode->firstName = firstName;
addNode->phoneNumber = phoneNumber;
//if empty linked list, create first item
if (hashTable[hashResult] == NULL){
start p = malloc(sizeof(node));
p->next = NULL;
}
//point new node's pointer to previous node
addNode->next = hashTable[hashResult];
//add node to hash table
hashTable[hashResult] = addNode;
//return successful
return 1;
}
如果有人对此问题有所了解,或者如何寻找原因,我将非常感谢,谢谢。