数据结构——哈希表使用

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

主函数 ++main.c++↓↓↓↓↓

cpp 复制代码
#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;
}

封装函数 ↓↓↓↓↓

cpp 复制代码
#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;
}

结构体函数↓↓↓↓↓

cpp 复制代码
#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
相关推荐
CSharp精选营20 小时前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
刘马想放假4 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠5 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
Darling噜啦啦12 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠13 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾13 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres82113 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q13 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒13 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
WL学习笔记13 天前
单项不带头不循环链表
数据结构·链表