将值从文件输入传递到函数(on循环)仅执行最后一次迭代

时间:2014-08-06 20:30:52

标签: c file file-io hash linked-list

我有一个哈希表数据结构,我在其中保存一个带有名称和电话号码的节点链表。我实现了一个插入函数,它会散列姓氏并相应地插入节点。输入是通过控制台手动完成的,完全按预期工作。

我现在正在实现一个函数,该函数将从文件中读取此信息并重复调用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;
}    

如果有人对此问题有所了解,或者如何寻找原因,我将非常感谢,谢谢。

0 个答案:

没有答案