马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
目的:使用哈希表存放若干个单词,用户输入某个单词,查询在哈希表中是否存在该单词
主函数 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 1
- if (find_hashtable(parray, num))
- {
- printf("%s 单词存在\n", num);
- }
- else
- {
- printf("%s 节点不存在\n", num);
- }
- #endif
- printf("请输入要删除的单词:\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 52
- extern 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
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |