>我需要创建一个哈希表,数组中的每个单元格都必须是链表,以防发生冲突,用户可以添加字符或整数类型的值,
Object* createObject(void* data)
{
if (data != NULL)
{
Object* object = (Object*)malloc(sizeof(Object));
if (object == NULL)
return NULL;
object->data = data;
object->next = NULL;
return object;
}
}
我还有一个函数 add 它需要 void*,然后创建一个结构对象并将其插入列表,问题是当我打印表格时,它会打印地址并将地址添加到列表中
int add(Table* table, void* data)
{
int d = 1;
int key = 0;
int index = 0;
if (table == NULL || data == NULL)
return -1;
//Object*obj_data=createObject(data);
if (table->Table_tybe == 0)
{
key = intHashFun((int*)data, table->size);//it returns the hash function int value
}
else
key = strHashFun((char*)data, table->size);
index = key*d;
Object*tmp = table->arr[index];
Object*obj = tmp;
while (tmp != NULL)
{
obj = tmp;
tmp = tmp->next;
}
if (obj == NULL) {
table->arr[index] = createObject(data);
printf("**%d** ", table->arr[index]->data);
table->arr[index]->next = NULL;
}
else
{
int j = 0;
if (obj->next == NULL)
{
//tmp->next=createObject(data);
obj->next = createObject(data);
obj = obj->next;
obj->next = NULL;
return;
}
这是结构
typedef struct Object {
void* data;
struct Object* next;
}Object;
typedef struct Table {
Object** arr;
int size;
int Table_tybe;
int Table_length;//list length
}Table;
int size = 3;
int listlength = 5;
Table* table = createTable(size, 0, listlength);
int one = 1;
add(table, &one);
在示例代码中
int one = 1;
add(table, &one);
您将int
变量的地址通过函数add()
one
传递给createObject()
,后者分配一个Object
结构并将指针复制到对象的data
字段中,因此您的对象应包含该地址。
如果要查看示例变量的值one
则必须将void*
指针转换为正确的数据类型(在本例中int *
),并在要打印指针时取消引用该指针。
printf("**%d** ", *(int*)table->arr[index]->data );
另一种选择是将Object
更改为实际存储int
值而不是void*
,并在将实际数据复制到对象时取消引用指针。
(正如其他人已经提到的,您的代码包含更多问题。