C语言实现哈希链表查找

 
#include <stdio.h>

#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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值