目标:利用哈希表存放若干个单词,用户输入某个单词,查询在哈希表中是否存在该单词
主函数 main.c ↓↓↓↓↓
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "hashtable.h"int main(void)
{struct list_head *parray = NULL;int i = 0;char str[5][32] = {0};char num[32] = {0};char cnt[32] = {0};for(i = 0; i < 5; i++){gets(str[i]);}parray = create_hashtable();for(i = 0; i < 5; i++){insert_hashtable(parray, str[i]);}show_hashtable(parray);printf("请输入要查询的单词:\n");gets(num);#if 1if (find_hashtable(parray, num)){printf("%s 单词存在\n", num);}else {printf("%s 节点不存在\n", num);}
#endifprintf("请输入要删除的单词:\n");gets(num);delete_hashtable(parray, num);printf("已删除 %s 此单词\n", num);show_hashtable(parray);destroy_hashtable(parray);parray = NULL;return 0;
}
封装函数 ↓↓↓↓↓
#include "hashtable.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>//创建
struct list_head *create_hashtable(void)
{ int i = 0;struct list_head *ptmd = NULL;ptmd = malloc(MAXNUM * sizeof(struct list_head));if(NULL == ptmd){return NULL;}for(i = 0; i < MAXNUM; i++){INIT_LIST_HEAD(&ptmd[i]);}return ptmd;
}//判断
static int asc_compare(struct list_head *pnew, struct list_head *pnode)
{return strcmp((list_entry(pnew, hashnode_t, node)->str), (list_entry(pnode, hashnode_t, node)->str));
}//插入
int insert_hashtable(struct list_head *pheadlist, char *pstr)
{int key = 0;hashnode_t *ptmd = NULL;ptmd = malloc(sizeof(hashnode_t));if(NULL == ptmd){return -1;}strcpy(ptmd->str, pstr);if(pstr[1] >= 'A' && pstr[1] <= 'Z'){key = *pstr - 'A';}else if(pstr[1] >= 'a' && pstr[1] <= 'z'){key = *pstr - 'a' + 26;}list_add_order(&ptmd->node, &pheadlist[key], asc_compare);return 0;
}//打印
int show_hashtable(struct list_head *pheadlist)
{int i = 0;struct list_head *ptmpnode = NULL;for (i = 0; i < MAXNUM; i++){if(i >= 0 && i < 26){printf("%c: ", (char)i + 'A');//或者+65}else{printf("%c: ", (char)i + 'a' - 26);//或者+71}list_for_each(ptmpnode, &pheadlist[i]){printf(" %s----", list_entry(ptmpnode, hashnode_t, node)->str);}printf("\n");}return 0;
}//查找
hashnode_t *find_hashtable(struct list_head *pheadlist, char *pstr)
{int key = 0;struct list_head *ptmpnode = NULL;if(pstr[1] >= 'A' && pstr[1] <= 'Z'){key = *pstr - 'A';}else if(pstr[1] >= 'a' && pstr[1] <= 'z'){key = *pstr - 'a' + 26;}list_for_each(ptmpnode, &pheadlist[key]){if (strcmp(list_entry(ptmpnode, hashnode_t, node)->str, pstr) == 0){return list_entry(ptmpnode, hashnode_t, node);}else if (list_entry(ptmpnode, hashnode_t, node)->str > pstr){break;}}return NULL;
}//删除
int delete_hashtable(struct list_head *parray, char *pstr)
{hashnode_t *ptmpnode = NULL;int cnt = 0;while (1){ptmpnode = find_hashtable(parray, pstr);if (NULL == ptmpnode){break;}list_del(&ptmpnode->node);free(ptmpnode);cnt++;}return cnt;
}//销毁
int destroy_hashtable(struct list_head *parray)
{int i = 0;hashnode_t *ptmpnode = NULL;hashnode_t *pnextnode = NULL;for (i = 0; i < MAXNUM; i++){list_for_each_entry_safe(ptmpnode, pnextnode, &parray[i], node){free(ptmpnode);}}free(parray);return 0;
}
结构体函数↓↓↓↓↓
#ifndef __HASHTABLE_H__
#define __HASHTABLE_H__#include "list.h"typedef struct hashnode
{struct list_head node;char str[32];
}hashnode_t;#define MAXNUM 52extern struct list_head *create_hashtable(void);
extern int insert_hashtable(struct list_head *pheadlist, char *pstr);
extern int show_hashtable(struct list_head *pheadlist);
extern hashnode_t *find_hashtable(struct list_head *pheadlist, char *pstr);
extern int delete_hashtable(struct list_head *parray, char *pstr);
extern int destroy_hashtable(struct list_head *parray);#endif