为hashmap创建可变数量的链接列表

时间:2015-10-26 01:53:04

标签: c loops linked-list hashtable

以下是我的代码的重要部分,其中包含了无用的部分:

#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 %s\n", storage->final_word);
    storage = storage->next;
  }


  return 0;

}

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

字典的一部分包含:leloh,hello,elloh,holel

密钥将是:ehllo

val 将是存储前述4个单词的链接列表。

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

我的代码处理好一切,直到我尝试打印位于某个键的列表。 该列表的大小正确,但仅存储它作为输入所用的最后值。因此,添加到上面的示例中,我的列表将是(按时间顺序):

  1. leloh
  2. elloh - &gt; elloh
  3. holel - &gt; holel - &gt; holel
  4. ehllo - &gt; ehllo - &gt; ehllo - &gt; ehllo
  5. 由于某种原因,它还将正确按字母顺序排列的字符串存储为最后一个字符串,我没有提供hmap_set函数。非常困惑。

    然而,这个清单非常有意义。我只有一个节点,它在for循环中。我不更改变量名称,因此指针都指向同一个节点,并且节点通过循环的每次迭代更改它包含的字符串。

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

    感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:1)

将评论转移到答案中 - 代码更易于阅读。

问题是,我认为,您继续将新值读入val(从key复制),但您只有一个变量。

您需要在将字符串存储在哈希映射中之前复制字符串。因此,请查找strdup()函数,并使用key代替strdup()strcpy()中复制字符串。将从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;
}