尝试将项目添加到链接列表

时间:2016-12-19 02:34:34

标签: c linked-list hashtable

我正在尝试实现一个包含链表列表的哈希表。该数组具有固定大小。但是,当我尝试将项目插入哈希表时,我遇到了问题。

这是哈希表的代码

#include "Registro.h"

#define ARRAYSIZE 20

struct HashTable{
    _RegistryList * array[ARRAYSIZE];
};

typedef struct HashTable _HashTable;

int hashFunction(int val){
    return val % ARRAYSIZE;
}  

_HashTable * init_HashT(){

    _HashTable * nueva = (_HashTable*)malloc(sizeof(_HashTable));

    for(int i = 0 ;  i < ARRAYSIZE ; i++){
        nueva->array[i] = NULL;
    }

    return nueva;
}


_Register * searchHashT(int num, _HashTable * hashT){
    int index = hashFunction(num);
    _Register * temp = NULL;

    if(hashT->array[index] != NULL){
        temp = hashT->array[index]->first;

        while(temp != NULL){

            if(temp->id == num){
                printf("FOUND!");
                return temp;
            }

            temp = temp->next;
        }

    }else{
        printf("\nNo existing registry with that ID.\n");
    }

    return temp;
}


void addToHashTable(_Register * registro, _HashTable *hashT){
    int index = hashFunction(registro->id);

    insertRegis(registro,hashT->array[index]);
}

void printHashTableContent(_HashTable * hashT){
    for(int i = 0 ; i < ARRAYSIZE ; i++){
        if(hashT->array[i] != NULL){
            printRegisterFromList(hashT->array[i]);
        }
    }
}

这是RegistryList标头的代码:

#include "DefCampo.h"

struct Register{
    int id;
    _FieldList *FieldList;
    //_FieldList *listaCamposDefi;
    struct Register *next;
};

typedef struct Register _Register;

struct Regislist{
    _Register *first;
};

typedef struct Regislist _RegistryList;

_Register* init_Register(int num, _FieldList* list){

    _Register * newRegis = (_Register*)malloc(sizeof(_Register));
    newRegis->id = num;
    newRegis->FieldList = list;
    newRegis->next = NULL;

    return newRegis;
};

_RegistryList* init_RegistryList(){

    _RegistryList * registryList = (_RegistryList*)malloc(sizeof(_RegistryList));
    registryList->first = NULL;

    return registryList;
};

void insertRegis(_Register *regis, _RegistryList *list){

    if((list)->first == NULL){
        (list)->first = regis;
    }
    else{
        _Register *temp = (list)->first;
        while(temp->next != NULL){
            temp = temp->next;
        }
        temp->next = regis;
        //temp->next->next = NULL;
    }

};

void printRegisterFromList(_RegistryList * list){
    _Register *temp = list->first;

    printf("\n%s\n","---- Registry List Content ----");
    while(temp != NULL){
        printf("ID : %d\t\n",temp->id);
        temp = temp->next;
    }
    printf("\n");
    return;
};

这是我的main.c:

int main() {

    _Field * c1 = newField("Hello",0);
    _Field * c2 = newField("4", 1);
    _Field * c3 = newField("Hallo",0);
    _Field * c4 = newField("1", 1);
    _Field * c5 = newField("Hola",0);
    _Field * c6 = newField("3", 1);
    _Field * c7 = newField("Konnichiwa",0);
    _Field * c8 = newField("7", 1);
    _Field * c9 = newField("Goodbye",0);
    _Field * c10 = newField("2", 1);
    _Field * c11 = newField("adieu",0);
    _Field * c12 = newField("tschuss", 0);

    _FieldList * listaC1 = newFieldList();
    _FieldList * listaC2 = newFieldList();
    _FieldList * listaC3 = newFieldList();

    insertField(c1,listaC1);
    insertField(c2,listaC1);
    insertField(c3,listaC1);
    insertField(c4,listaC1);
    insertField(c5,listaC2);
    insertField(c6,listaC2);
    insertField(c7,listaC2);
    insertField(c8,listaC2);
    insertField(c9,listaC3);
    insertField(c10,listaC3);
    insertField(c11,listaC3);
    insertField(c12,listaC3);

    printFieldFromList(listaC1);
    printFieldFromList(listaC2);
    printFieldFromList(listaC3);

    _Register * regis1 = init_Register(1,listaC1);
    _Register * regis2 = init_Register(2,listaC2);
    _Register * regis3 = init_Register(3,listaC3);

    _RegistryList * LR = init_RegistryList();
    insertRegis(regis1,LR);
    insertRegis(regis2,LR);
    insertRegis(regis3,LR);

    printRegisterFromList(LR);

    _HashTable * hashT = init_HashT();
    addToHashTable(regis1, hashT); //this is where it messes up

    return 0;
}

它总是以退出代码11结束进程。我用调试器运行它(它告诉我EXC_BAD_ACCESS),它引导我到insertRegister函数中的这一特定行:

if((list)->first == NULL){

我一直试图改变某些部分无济于事。我真的很感激一些帮助。

1 个答案:

答案 0 :(得分:0)

init_HashT执行此操作:nueva->array[i] = NULL;。因此insertRegis(registro,hashT->array[index])NULL的指针传递给insertRegis。然后解引用该NULL指针:if((list)->first == NULL)                     –钾盐

  

if((list)->first == NULL)行是否不正确?

这取决于您如何实现。 list必须预先分配,并且在传递给insertRegis时永远不能为NULL,否则该函数需要处理第一次分配列表。                     –钾盐