gpt4 book ai didi

c - uthash:2级哈希表,在嵌套表中添加新元素

转载 作者:行者123 更新时间:2023-11-30 16:44:20 29 4
gpt4 key购买 nike

我有一个 2 级哈希表,如所解释的 here (uthash),具有两个不同的结构,如下声明。哈希结构 b 通过哈希结构 a 中的参数 d 保存 s 值的总数及其频率(为了更好地理解,请查看下面的设计)。

更新函数应该像这样工作:如果第一次遇到 s,则将其添加到 struct myb 中,并添加到 struct mya 中。如果它已经在 struct myb 中,则检查它的 d 值是否是第一次遇到,如果有则将其添加到 struct mya 中,否则增加它的值。

但是,当我运行代码时,它将第一个遇到的 d 值保存在哈希结构 mya 中(并在这种情况下递增),但我没有添加在同一 s 值上收到的其他 d 值...代码中有什么问题?

   d1:3           d2:5    
/ /
s1 - d2:4 s2 - d4:3
\ \
d3:1 d5:2

---------------------------
#include <stdio.h>
#include <string.h>
#include "uthash.h"


struct a{
int x;
int count;
UT_hash_handle hh;
};

struct b{
char s[24];
int total;
struct a *mya;
UT_hash_handle hh;
};


void update(struct b **myb, const char *s, u_int32_t d){
struct b *pb;

HASH_FIND_STR(*myb, s, pb);
if(pb == NULL) {
pb = (struct b*)malloc(sizeof(struct b));
if(!pb) return;

strncpy(pb->s, s, sizeof(pb->s));
pb->total = 1;
pb->mya = NULL;
HASH_ADD_STR(*myb, s, pb);


struct a *pa = (struct a*)malloc(sizeof(struct a));
if(!pa) return;

pa->x = d;
pa->count = 1;
HASH_ADD_INT(pb->mya, x, pa);
}
else{
struct a *pp=NULL;
pb->total++;

HASH_FIND_INT(pb->mya, &d, pp);
if(pp == NULL){
pp = (struct a*)malloc(sizeof(struct a));
if(!pp) return;

pp->count = 1;
HASH_ADD_INT(pb->mya, x, pp);
}
else pp->count++;
}
}


void printAll(struct b *myb){
struct b *pb, *tmp;
struct a *pa, *tmp2;
int i = 0, j = 0;

HASH_ITER(hh, myb, pb, tmp) {
i++;
printf("%d) %s: %u\n", i, pb->s, pb->total);

HASH_ITER(hh, pb->mya, pa, tmp2) {
j++;
printf("\t%d) %u: %u\n", j, pa->x, pa->count);
}
j = 0;
}
}



struct b *myb = NULL;

int main(int argc, char **argv ){

char str[10][24] = {"abc","abc","def","abc","hij","def","hij","def","abc","hij"};
int values[10] = {10, 10, 9, 8, 5, 2, 6, 2, 5, 5};
int i;

for(i=0; i<10; i++)
update(&myb,str[i],values[i]);

printf("hash table\n");
printAll(myb);


return 0;

}

最佳答案

比较 update() 函数的(大部分)工作版本的两个分支。看看在每种情况下如何初始化新的struct a。如果您还没有看到它,请记住哪个成员存储了您观察到未记录的值。

没错:当您将新的struct a 添加到已存在的struct b 时,您无法设置其x 成员。这完全说明了问题。

无论如何,我会分解出用于创建和初始化新struct a的代码,以便您可以消除当前的重复。作为一个额外的优势,如果问题发生在具有分配和初始化 struct a 特定目的的函数中,那么它很可能更容易识别。

关于c - uthash:2级哈希表,在嵌套表中添加新元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44572176/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com