#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;
}
C语言实现哈希链表查找
最新推荐文章于 2023-10-12 17:51:16 发布