哈希表(封闭寻址)。如何初始化和打印?

时间:2015-12-09 20:23:30

标签: c++ c hash

我应该如何处理关闭寻址的哈希表?

数据结构:

typedef char ktype[9];
typedef void *Infoc;

typedef struct entryc{
    ktype ckey;
    Infoc infoc;
    struct entryc *next;
} Entryc;

typedef Entryc *Chashtable[HASHSIZE];

我正在声明一个结构数组的指针,已初始化:

void initChain(Chashtable *h){
    int i;
    for(i=0; i<HASHSIZE; i++){
        *h[i] = NULL;
    }
}

这是插入代码:

void insertChain(Chashtable *h, ktype k, Infoc inf){
    int n= hash(k, 0);
    char hkey[3];
    sprintf(hkey, "%d", n);
    struct entryc *new = malloc (sizeof(struct entryc));
    strcpy(new->ckey, hkey);
    new->infoc = inf;
    new->next = *h[n];
    *h[n] = new;
}

我想打印哈希表:

void printChain(Chashtable *h){
    int i;
    for(i=0; i<HASHSIZE; i++){
        if((*h[i])){
        printf("-> %s\n", (*h[i])->ckey);
        }
    }
}

打印时出现分段错误,为什么?

谢谢。

编辑:

包含分段错误的完整代码(找不到调试器中的其他错误):

**

  

完整的可编辑代码:

** http://pastebin.com/GHpfqmP3

2 个答案:

答案 0 :(得分:1)

你的指针对于函数args和实​​现都是错误的。 Chashtable是一个struct指针数组。我在任何地方删除了一个级别的间接,现在代码运行,也许不是你想要的!顺便说一下,我必须在hash()函数中进行修补。我希望你能从这里开始。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define HASHSIZE 31
#define EMPTY   " "
#define DELETED "-"

typedef char ktype[9];
typedef void *Infoc;

typedef struct entryc{
    ktype ckey;
    Infoc infoc;
    struct entryc *next;
} Entryc;

typedef Entryc *Chashtable[HASHSIZE];

int hash(ktype k, int z) {
   return rand() % HASHSIZE;
}

void initChain(Chashtable h){
    int i;
    for(i=0; i<HASHSIZE; i++){
        h[i] = NULL;
    }
}

void printChain(Chashtable h){
    int i;
    for(i=0; i<HASHSIZE; i++){
        if((h[i])){
        printf("-> %s\n", (h[i])->ckey);
        }
    }
}

void insertChain(Chashtable h, ktype k, Infoc inf){
    int n= hash(k, 0);
    char hkey[3];
    sprintf(hkey, "%d", n);
    struct entryc *new = malloc (sizeof(struct entryc));
    strcpy(new->ckey, hkey);
    new->infoc = inf;
    new->next = h[n];
    h[n] = new;
}

int main(void) {
    // system ("tput clear");

    Chashtable j;
    initChain(j);
    printChain(j);
    insertChain(j, "myname", "single");
    printChain(j);
    return 0;
}

答案 1 :(得分:0)

我认为你想要分配(初始化)然后检查(打印)h[i]而不是*h[i]的值。

作为一方,你的插页似乎也很不稳定。如果不出意外,几乎所有C编译器都是C ++编译器,new是C ++关键字。因此,用这个名称命名C变量是个坏主意。