Ошибка сегментации в хэш-таблице - C - PullRequest
0 голосов
/ 14 марта 2019

В настоящее время я работаю над заданием по программированию для класса. Я получаю ошибку seg в одной из моих функций и не могу найти корень проблемы. Я сделал все возможное и обнаружил, что ошибка сегмента происходит в «if (myNode-> key == key)». Любые мудрые слова помогут!

struct node*searchForPerson(const char *value){
int key=convertToKey(value);
struct node *myNode;

int i=0;
int j = (key % 8)+(i*(key%5));


while (i < size - 1 && hashTable[j].head != NULL && hashTable[j].index != key ) {
    i++;
    j=(key % 8)+(i*(key%5));
}
myNode=hashTable[j].head;

if(myNode->key==key) {

    printf(" found\n");
    return myNode;
}
else{
printf("not found\n");
    return NULL;
    }
}

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

void insertToHash(int key,  char *value){

int i = 0;
int j = (key % 8)+(i*(key%5));
struct node *newnode = createNode(key, value);
/*head of list for the bucket with index "hashIndex"*/
if (!hashTable[j].head) {
    hashTable[j].head = newnode;
    hashTable[j].count=1;
    return;
}

while (i < size - 1 && hashTable[j].head != NULL) {
    i++;
    j=(key % 8)+(i*(key%5));
}
//adding new node to the list
hashTable[j].head=newnode;
hashTable[j].count++;
return;



hashTable[j].head = newnode;
hashTable[j].count++;
}

1 Ответ

1 голос
/ 14 марта 2019

Вы должны добавить оператор if, который гарантирует, что hashTable[j].head не NULL.

Имейте в виду, что ваше условие while является условием ANDing 3, поэтому, если любое из них станет ложным, цикл завершится. В частности, сразу после цикла вы не знаете, вышел ли он, потому что

  1. i теперь больше или равно size - 1
  2. hashTable[j].head теперь равно NULL
  3. hashTable[j].index теперь равно key

Если регистр равен (2), то myNode будет NULL, поэтому myNode->key будет разыменовывать нулевой указатель, что приведет к segfault.

...