gpt4 book ai didi

c - 尝试将项目添加到链接列表时出错

转载 作者:行者123 更新时间:2023-11-30 16:52:28 25 4
gpt4 key购买 nike

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

这是哈希表的代码

#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 header 的代码:

#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) – 凯勒姆

Is the line if((list)->first == NULL) incorrect then?

这取决于您如何实现。 list 必须预先分配,并且在传递给 insertRegis 时决不能为 NULL,或者该函数需要首次处理列表分配。 – 凯勒姆

关于c - 尝试将项目添加到链接列表时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41215050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com