簡體   English   中英

嘗試將項目添加到鏈接列表時出錯

[英]Error when trying to add item to linked list

我正在嘗試實現具有鏈接列表數組的哈希表。 此數組的大小固定。 但是,當我嘗試將項目插入哈希表時遇到問題。

這是哈希表的代碼

#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){

我一直在嘗試更改某些部分而無濟於事。 我真的很感謝您的幫助。

init_HashT這樣做: nueva->array[i] = NULL; 因此, insertRegis(registro,hashT->array[index])NULL指針傳遞給insertRegis 然后取消引用該NULL指針: if((list)->first == NULL) – kaylum

if((list)->first == NULL)不正確嗎?

這取決於您如何實現。 list必須預先分配,並且在傳遞給insertRegis時永遠不能為NULL,或者該函數需要處理第一次分配列表。 –貝殼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM