1

我正在尝试从链式数组哈希表中检索项目。检索函数属于一个类表,其中哈希表是其成员。该表是客户端类的成员。这是一个类,所以我们可以使用的东西非常有限(例如......没有字符串,只有字符数组)。我想从客户端传入一个项目数组以及项目的名称或我想从中生成哈希键的项目的特征。

...调用检索函数的 main 的一部分(传入的 int 是一个标志,它确定我按名称或按效果搜索的天气)

    program.reference.retrieve("Abecean Longfin", program.client_item, 1);

    cout << program.client_list[0].name;

    getchar();
    return 0;
}

……

项目.h

#include <iostream>
#include <fstream>
#include <cctype>
#include <cstdlib>
#include <cstring>
#include <cmath>

using namespace std;

const int ASIZE = 30;
const int SIZE = 92;
const int HNSIZE = 41;
const int HESIZE = 17;

struct item
{
    item();
    ~item();
    char * name;
    char * effect1;
    char * effect2;
    char * effect3;
    char * effect4;
    int count;
    //int keygen(int,int);
    /*int name_key;
    int ef1_key;
    int ef2_key;
    int ef3_key;
    int ef4_key;*/
};

.... 检索功能

int table::retrieve(char item_in[],item*item_list, int name_flag)
{
    int i = 0;
    if(name_flag)
    {
        node * temp;
        int key = keygen(item_in,HNSIZE);
        if(!(name_table.ht[key]))
        return 0;
        else
        temp = name_table.ht[key];
        while(temp)
        {
            if(!strcmp(item_in,temp->ingredient->name))
            item_list[i] = *temp->ingredient;
            ++i;
            temp = temp->next;
        }
    }
    else
    {
        node * temp;
        int key = keygen(item_in,HESIZE);
        if(!(ef1_table.ht[key]) && !(ef2_table.ht[key]) && !(ef3_table.ht[key]) && !(ef4_table.ht[key]))
        return 0;
        else
        {
            temp = ef1_table.ht[key];
            while(temp)
            {
                if(!strcmp(item_in,temp->ingredient->effect1))
                item_list[i] = *temp->ingredient;
                ++i;
                temp = temp->next;
            }
            temp = ef2_table.ht[key];
            while(temp)
            {
                if(!strcmp(item_in,temp->ingredient->effect2))
                item_list[i] = *temp->ingredient;
                ++i;
                temp = temp->next;
            }
            temp = ef3_table.ht[key];
            while(temp)
            {
                if(!strcmp(item_in,temp->ingredient->effect3))
                item_list[i] = *temp->ingredient;
                ++i;
                temp = temp->next;
            }
            temp = ef4_table.ht[key];
            while(temp)
            {
                if(!strcmp(item_in,temp->ingredient->effect4))
                item_list[i] = *temp->ingredient;
                ++i;
                temp = temp->next;
            }
        }
    }
}

……

客户端.h

#include "table.h"

struct client
{
    client();
    int fill_list(int,int,int);
    int copy(char*,char*,int);
    int display(char*, int, item*);
    item * client_list;
    table reference;
    table inventory;
    item client_item;
};

……

表.h

#include "hash.h"

class table
{
public:
    table();
    ~table();
    int fill(item*);
    int insert(item&, nHash&);
    int insert(item&, eHash&, int);
    int retrieve(char*,item*,int);
    int remove(int,item&);
    int remove(int);
    int check_hash(int,int,int);
    int keygen(char*, int);
    int from_list(int, item&);
    int into_list(int, item&);
    item* get_list();

private:
    item * item_list;
    nHash name_table;
    eHash ef1_table;
    eHash ef2_table;
    eHash ef3_table;
    eHash ef4_table;
};

……

注册机功能

int table::keygen(char*input, int hash_size)
{
    if(input)
    {
        int key = 0;
        int i = 0;
        while(input[i])
        {
            key = key + input[i] * 101 * input[i++];
        }

        return key%hash_size;
    }
    else
        return -1;
}

.... 添加了 client_item 初始化

client::client()
{
    client_item.name = new char[ASIZE];
    client_item.effect1 = new char[ASIZE];
    client_item.effect2 = new char[ASIZE];
    client_item.effect3 = new char[ASIZE];
    client_item.effect4 = new char[ASIZE];
    client_list = NULL;
}

我确定我还需要包括其他内容。但是,我认为这会让事情变得顺利。我对编程和 C++ 还是很陌生。

我遇到的问题是当我尝试计算名称时取消引用 NULL 指针。至少我认为这就是“访问冲突读取位置 0x00000000”是什么。

4

0 回答 0