欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > 数据结构——哈希表使用

数据结构——哈希表使用

2025/2/21 3:24:31 来源:https://blog.csdn.net/weixin_48141383/article/details/145620681  浏览:    关键词:数据结构——哈希表使用

        目标:利用哈希表存放若干个单词,用户输入某个单词,查询在哈希表中是否存在该单词

主函数 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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词