C中哈希插入键值 传入的哈希表为何必须是双重指针类型?
我自己试过传入
set 的内部实现是双向链表
那我插入操作是无需修改整个外部结构的地址一个个上链即可
但在 传参一致性没问题的如下情况下 我传递结构体指针为何没有进行实际的插入
void insertSet(mySet *set,int mykey)
insertSet(set2,nums2[i])
如上 我发现根本没有插入,有没大手子 能指点一下
typedef struct MY_SET
{
int key;//key值
//type char [100];自定义类型可以不存在 只关心KEY KEY不可以重复
UT_hash_handle hh;
}mySet;
mySet *find(mySet *set,int mykey)//传入指向SET的指针 以及键值、
{
mySet *tmp;
HASH_FIND_INT(set,&mykey,tmp);
return tmp;
}
void insertSet(mySet **set,int mykey)
{
mySet *judge =find(*set,mykey);
if(judge == NULL)
{
judge = (mySet *)malloc(sizeof(mySet) );
judge->key = mykey;
HASH_ADD_INT(*set,key,judge);
}
}
int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize){
//1放入哈希 转为哈希
//2遍历查询哈希表是否出现 若出现放入res
int* res ;
int i,cnt1,cnt2,cnt;
mySet *set1 =NULL;
mySet *set2 =NULL;
mySet *s ,*tmp;
mySet *p;
*returnSize=0;
for(i=0;i<nums1Size;i++)
insertSet(&set1,nums1[i]);
cnt1 =HASH_COUNT(set1);
for(i=0;i<nums2Size;i++)
insertSet(&set2,nums2[i]);
cnt2 =HASH_COUNT(set2);
res = malloc(sizeof(int) * (cnt1+cnt2));
if(cnt1>cnt2)
{
HASH_ITER(hh,set2,s,tmp)
{
if(find(set1,s->key))
res[(*returnSize)++] = s->key;
}
}
else
{
HASH_ITER(hh,set1,s,tmp)
{
if(find(set2,s->key))
res[(*returnSize)++] = s->key;
}
}
return res;
}
因为下面要调用的HASH_ADD_INT函数里需要一个指针类型
如果你的set本身就只是一个一级指针,那到下面*set它变成一个结构体了,不是结构体指针了
包括find函数里也一样需要一个指针类型
你要改,那要把里面所有调用的函数也都改掉,只改一个那肯定下面类型全都不对了
用指针的指针只会有一个原因,就是函数内要修改指针的地址
利用指针向主程序返回值,也就是说调用者的实参要在调用完改变,那么就需要指针,而这个参数类型本身也是指针,那么就是指针的指针。
看下面的演变过程
void foo1(int i)
{
i = 4;
}
int i = 3;
foo(i);
此时i还是3
void foo1(int *i)
{
*i = 4;
}
int i = 3;
foo(&i);
此时i是4
void foo1(int *i)
{
i = (int *)malloc(sizeof(int);
}
int *i = NULL;
foo(i);
此时i是i还是NULL
void foo1(int **i)
{
*i = (int *)malloc(sizeof(int);
}
int *i = NULL;
foo(&i);
此时i是i指向了分配的地址。
我说一下我知道二级指针传递的是指向针指的地址,但是我不清楚为什么插入需要涉及到SET初始指针的修改?每一次插入难不成set的地址是变化的?