Предупреждение о несовместимом типе указателя в самоссылающихся структурах при попытке реализовать хеш-таблицу - PullRequest
1 голос
/ 16 мая 2019

Я пытаюсь реализовать хеш-таблицу с указателями на двойной связанный список, который хранит информацию на языке Си.Проблема в том, что я продолжаю получать предупреждения от компилятора, что я не понимаю, почему.Все предупреждения - это «предупреждение: назначение из несовместимого типа указателя»

Вот мои структуры:

typedef struct stru_contacto_list{
char *nome;
char *email;
char *telefone;
struct stru_contacto_list *prev, *next;
}contacto_list;




typedef struct stru_contacto{
contacto_list *info;
struct stru_contact *next_hash;
}contacto_hash;

typedef struct{
contacto_hash **val;
}hash_tableC;

Вот код, который поможет вам лучше понять, что происходит:

Инициализация хеш-таблицы

void initContactos(hash_tableC *c){
    int i;
    c->val = 
       (contacto_hash**)malloc(sizeof(contacto_hash)*DEFAULTSIZE);
    for(i = 0; i < DEFAULTSIZE; i++){
        c->val[i] = NULL;
    }
}

Вот некоторый код, откуда я получаю предупреждения, здесь я пытаюсь добавить 'contact_hash' в хеш-таблицу, поместив его в заголовок связанного списка, связанногок индексу в hash_table.

void addContact(){

    int index, flag;

    contacto_hash *novo = 
                    (contacto_hash*)malloc(sizeof(contacto_hash));

    contacto_list *novoL = 
                    (contacto_list*)malloc(sizeof(contacto_list));


    flag = addContactToList(novoL);

    if (flag){
        free(novo);
        return;
    }

    novo->info = novoL;
    novo->next_hash = NULL;

    index = hashing(novoL->nome);

    if (contactos->val[index] != NULL)
        novo->next_hash =  contactos->val[index]; /* THE WARNING*/
    contactos->val[index] = novo;

}

Некоторый другой небольшой фрагмент кода, где я получаю то же «предупреждение: назначение из несовместимого типа указателя»:

contacto_hash* find(char *nome, int indice){
    /*Returns the previous contact_hash i want to find*/

    contacto_hash *atual, *prev;

    if (contactos->val[indice] == NULL)
        return NULL;

    atual = contactos->val[indice];
    prev = atual;

    while (atual != NULL) {
        if (strcmp(atual->info->nome, nome) == 0){
            return prev;
        }
        prev = atual;
        atual = atual->next_hash; /* THE WARNING */
    }
    return NULL;
}

Предупреждение от компилятора: «предупреждение: назначение изнесовместимый тип указателя "

...