добавление объекта в связанный список - PullRequest
0 голосов
/ 04 декабря 2018

Мне нужно создать хеш-таблицу, в которой каждая ячейка в массиве должна быть связанным списком, в случае коллизий пользователь может добавить значения типа 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;
}

}

у меня также есть функция add, она принимает 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 голосов
/ 04 декабря 2018

В вашем примере кода

int one = 1;

add(table, &one);

вы передаете адрес переменной int one через функцию add() в createObject(), которая выделяет структуру Object и копирует указатель вполе data объекта, поэтому ожидается, что ваш объект содержит адрес.

Если вы хотите увидеть значение вашей примерной переменной one, вам придется привести указатель void* к правильномутип данных, который в данном случае равен int *, и разыменовывает указатель, когда вы хотите его напечатать.

printf("**%d** ", *(int*)table->arr[index]->data );

Другой вариант - изменить Object для фактического хранения значения int вместо void* и разыменовать указатель при копировании фактических данных в объект.

(Как уже упоминалось, ваш код содержит больше проблем.)

...