c语言哈希查找链表法,C语言实现哈希链表查找

本文介绍了使用C/C++实现哈希表,包括hash()函数计算字符串哈希值,lookup()函数在哈希表中查找定义,以及install()函数将名称与定义安装到哈希表中。重点展示了安装和查找操作,并通过print()函数展示表内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include

#define HASHSIZE 101

struct nlist { /*table entry*/

struct nlist *next; /*next entry in chain */

char *name; /* defined name */

char *defn; /* replacement text */

};

static struct nlist *hashtable[HASHSIZE]; /* pointer table */

/************************************************************************/

/* hash : form hash value for string s

/************************************************************************/

unsigned hash( char *s ){

unsigned hashval;

for (hashval = 0; *s != '\0' ; s ++) {

hashval = *s + 31 * hashval;

}

return hashval % HASHSIZE;

}

/************************************************************************/

/* lookup : look for s in hashtab

/************************************************************************/

struct nlist *lookup(char *s){

struct nlist *np;

for (np = hashtable[hash(s)]; np != NULL; np = np->next) {

if (strcmp(s, np->name) == 0)

{

return np;/* found */

}

}

return NULL;

}

char *strdup(char *);

/************************************************************************/

/* install : put (name, defn ) in hashtable

/************************************************************************/

struct nlist *install(char *name, char *defn){

struct nlist *np;

unsigned hashval;

if ((np = lookup(name)) == NULL) {/* not found*/

np = (struct nlist *)malloc(sizeof(struct nlist));

if (np == NULL || (np->name = strdup(name) ) == NULL) {

return NULL;

}

hashval = hash(name);

np->next = hashtable[hashval];

hashtable[hashval] = np;

}else{

free((void*)np->defn);

}

if ((np->defn = strdup(defn)) == NULL) {

return NULL;

}

return np;

};

void printNode(struct nlist *np){

if (np != NULL) {

printf("#define %s %s\t", np->name, np->defn);

printNode(np->next);

}

}

void print(){

int i = 0;

for(; i < HASHSIZE; i ++){

printNode(hashtable[i]);

printf("\n");

}

}

int main(){

install("a", "1");

print();

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值