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
    评论
哈希表是一种利用哈希函数进行快速查找的数据结构。C语言可以通过数组和指针实现哈希表。 首先需要定义一个哈希函数,将关键字转换成哈希表的位置。可以使用简单的取模运算,将关键字的值除以哈希表大小取余数得到哈希表位置。 例如,哈希表大小为10,关键字为20,则哈希表位置为20%10=2。 接下来,定义一个结构体来表示哈希表中的每个元素,包括关键字和值。 ```c struct hash_element { int key; int value; }; ``` 然后,定义一个哈希表数组,将每个元素插入到哈希表中。如果哈希表位置已经被占用,可以使用链表来解决冲突。 ```c #define HASH_SIZE 10 struct hash_element *hash_table[HASH_SIZE]; void insert(int key, int value) { int index = key % HASH_SIZE; struct hash_element *element = malloc(sizeof(struct hash_element)); element->key = key; element->value = value; if (hash_table[index] == NULL) { hash_table[index] = element; } else { struct hash_element *p = hash_table[index]; while (p->next != NULL) { p = p->next; } p->next = element; } } int search(int key) { int index = key % HASH_SIZE; struct hash_element *p = hash_table[index]; while (p != NULL) { if (p->key == key) { return p->value; } p = p->next; } return -1; } ``` 这里的insert函数将关键字和值封装成一个结构体,然后根据哈希函数计算出哈希表位置。如果该位置为空,直接插入元素;否则,遍历链表直到找到空位置插入。 search函数根据哈希函数计算出哈希表位置,然后遍历链表查找关键字。 以上是一个简单的哈希实现,可以根据实际需求进行改进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值