现在的位置: 首页 > 综合 > 正文

C语言实现哈希链表查找

2013年12月16日 ⁄ 综合 ⁄ 共 1621字 ⁄ 字号 评论关闭

 

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

抱歉!评论已关闭.