将对象添加到链接列表

时间:2018-12-04 09:28:19

标签: c linked-list hashtable

我需要创建一个哈希表,该数组中的每个单元格都必须是一个链表,以防发生冲突,用户可以添加char或int类型的值,

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;
}

}

我还有一个函数,它添加void *,然后创建一个struct object对象,并将其插入到列表中,问题是,当我打印表时,它会打印地址并将地址添加到列表中

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);

1 个答案:

答案 0 :(得分:0)

在您的示例代码中

    File[] listOfFiles = folder.listFiles();

    if(listOfFiles != null){
        for (int i = 0; i < listOfFiles.length; i++) {
            if (listOfFiles[i].isFile()) {
                UserProfileDTO userProfileDTO = (UserProfileDTO) authentication.getPrincipal();
                String username = userProfileDTO.getUsername();
                if(listOfFiles[i].getName().contains(username)){
                    listOfFiles[i].delete();
                }
            }
        }
    }

您通过函数int one = 1; add(table, &one); int变量one的地址传递给add(),该地址分配了createObject()结构并将指针复制到对象的{ {1}}字段,因此预计您的对象包含该地址。

如果要查看样本变量Object的值,则必须将data指针强制转换为正确的数据类型(在这种情况下为one),然后取消引用要打印时的指针。

void*

另一种选择是更改int *以实际存储printf("**%d** ", *(int*)table->arr[index]->data ); 而不是Object的值,并在将实际数据复制到对象时取消引用指针。

(正如其他人已经提到的那样,您的代码包含更多问题。)