我应该如何处理关闭寻址的哈希表?
数据结构:
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);
}
}
}
打印时出现分段错误,为什么?
谢谢。
编辑:
包含分段错误的完整代码(找不到调试器中的其他错误):
**
完整的可编辑代码:
答案 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变量是个坏主意。