C语言 为hashmap创建一个可变数量的链表



下面是我的代码中重要的部分,没有帮助的部分被注释掉了:

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include "hmap.h"
struct val_word{
char *final_word;
struct val_word* next;
};

int main (int argc, char **argv){
  //Check if dictionary file is given 
  FILE *fp1;
  char key [125];
  char val [125];
  char temp;
  struct val_word *storage;
  char c;
  int i;
  int j;
  int l;

  HMAP_PTR dictionary = hmap_create(0, 0.75);
  fp1 = fopen(argv[1], "r");
  do{
    c = fscanf(fp1, "%s", key);

    // Convert string to lowercase
    strcpy(val, key);
    //Alphabetically sort string

    struct val_word* word_node = malloc(sizeof(struct val_word));
    word_node->final_word = val;
    word_node->next = NULL;
    storage = hmap_get(dictionary, key);

    if(storage == NULL){
        hmap_set(dictionary, key, word_node);
    }
    else{
        struct val_word *temp2 = storage;
        while(temp2->next != NULL){
            temp2 = temp2->next;
        }
        word_node->final_word = val;
        word_node->next = NULL;
        temp2->next = word_node;
        hmap_set(dictionary, key, storage);
    }

  } while (c != EOF);
  fclose(fp1);
  while(storage->next != NULL){
    printf("The list is %sn", storage->final_word);
    storage = storage->next;
  }

  return 0;
}

我得到了一个长度未知的字典文件,以及一个我无法触摸的哈希表实现文件。哈希表存储单词的混乱版本,键是按字母顺序排序的单词版本。例如:

部分字典包含:hello, hello, hello, holel

key表示:hello

val将是存储上述4个单词的链表。

hmap_get获取给定键的值,hmap_set设置给定键的值。

我的代码处理一切都很好,直到我试图打印位于键处的列表。该列表将具有正确的大小,但只存储作为输入的LAST值。因此,添加到上面的例子中,我的列表将是(按时间顺序):

  1. leloh
  2. elloh -> elloh
  3. holl -> holl -> holl
  4. ehlo -> ehlo -> ehlo

由于某种原因,它还将按字母顺序正确排列的字符串存储为最后一个字符串,我没有提供hmap_set函数。我很困惑

然而,这个列表是完全有意义的。我只有一个节点,而且它在for循环中。我没有更改变量名,因此所有指针都指向同一个节点,并且节点在每次循环迭代中都会更改它所包含的字符串。

所以,我想知道我将如何解决这个问题。我不能动态命名变量,我不能创建一个动态链表数组因为我觉得那样会违背哈希表的目的。我不知道用什么数据类型来存储这个

任何帮助都是感激的,谢谢!

将注释转换为答案-这样代码更容易阅读

问题是,我认为,你不断读取新的值到val(从key复制),但你只有一个变量。

在将字符串存储在散列映射中之前,需要复制字符串。因此,查找strdup()函数并使用strdup()而不是strcpy()复制key中的字符串。将strdup()返回的值赋给word_node->final_word

如果您不允许使用strdup(),请编写您自己的变体:

char *dup_str(const char *str)
{
    size_t len = strlen(str) + 1;
    char *dup = malloc(len);
    if (dup != 0)
        memmove(dup, str, len);
    return dup;
}

相关内容

  • 没有找到相关文章

最新更新