| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1815 人关注过本帖
标题:链式哈希表分享
只看楼主 加入收藏
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
结帖率:97.5%
收藏
已结贴  问题点数:20 回复次数:8 
链式哈希表分享
数据结构这玩意还是得静下心来学。最后哈希表输出节后会输出相同地址的表,这个没有处理。我想得是用快排先把指针地址传进去,排成有序的地址。然后想到地址穿进去,要考虑地址的长度。最后,想了下表是通过哈希值建立的,不能随意更改,不然会导致冲突。

假如在一个哈希表中不存在冲突,即关键字和哈希表地址一一对应,实际复杂度(1),秒杀任何排序查找
如果存在冲突,O<n  所以说这执行效率极其高。在大数据中查找具有很大优势

程序代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

#define HASHSIZE    101
#define WORDSIZE    30

struct Hlist
{
    char *keyword;
    char *def;
    struct Hlist *next;

};

struct Hlist *hashtab[HASHSIZE];        /*哈希表指针数组,存放每个元素指向的表头*/
struct Hlist *install(char *, char *);    /*创建哈希表*/
struct Hlist *find(char *);                /*查找是否存在表中*/
char *setmalloc(char *);                /*name和defn创建空间,便面之间赋值指向原来的地址*/
int getline(char *, int);                /*简单的输入函数*/
unsigned hash(char *);                    /*哈希函数,根据用户自己的方法求哈希值,尽量很少冲突*/

int main()
{
    int c, n, i = 0;
    char name[WORDSIZE], def[WORDSIZE];
    struct Hlist *p, *np[HASHSIZE];        
    printf("Please input keyword and difine numbrs\n");
    scanf("%d", &n);                    
    while ((c = getchar()) != EOF && c != '\n');
    while (n-->0)
    {
        printf("Please input keyword\n");
        getline(name, WORDSIZE);
        printf("Please input define\n");
        getline(def, WORDSIZE);
        if (isalnum(*name) && isalnum(*def))
            np[i++] = install(name, def);        /*接收每次创建和修改的地址*/
        else
            printf("Please input make up word and digit \n");
    }
    n = i;
    i = 0;
    while (n-- > 0) {                            /*哈希表输出*/
        for (; np[i] != NULL; np[i] = np[i]->next)        
            printf("%s %s\n", np[i]->keyword, np[i]->def);
        ++i;
    }
}

struct Hlist *install(char *name, char *def)
{
    struct Hlist *p;
    unsigned hashval;
    
    if ((p = find(name)) == NULL)
    {
        p = (struct Hlist *)malloc(sizeof(*p));
        if (p == NULL || (p->keyword = setmalloc(name)) == NULL)
        return NULL;
        hashval = hash(name);            
        p->next = hashtab[hashval];        /*链表尾插法,链入到最开始指针数组的地址(即NULL)*/
        hashtab[hashval] = p;            //整个重点就是这两条代码
    }
    else
        free(p->def);
    if ((p->def = setmalloc(def)) == NULL)
        return NULL;
    return p;
}

char *setmalloc(char *s)                /*开辟空间函数*/
{
    char *p;

    p = (char *)malloc(strlen(s) + 1);
    if (p != NULL)
    {
        strcpy(p, s);
        return p;
    }
        
    return NULL;
}

struct Hlist *find(char *s)                        /*查找函数*/
{
    struct Hlist *p;
    for (p = hashtab[hash(s)]; p != NULL; p = p->next)
        if (!strcmp(s, p->keyword))
            return p;
    return NULL;
}

unsigned hash(char *s)                            /*得到哈希值函数(也就是keyword关键字值)*/
{
    unsigned hashval;

    for (hashval = 0; *s != '\0'; s++)
        hashval = *s + 31 * hashval;
    return hashval % HASHSIZE;
}

程序代码:
#include<stdio.h>
#include "Calc.h"

int getline(char *s, int limit)
{
    int c, i;
    i = 0;
    while (--limit > 0 && (c = getchar()) != EOF && c != '\n')
    {
        s[i++] = c;
        
    }
    s[i] = '\0';
    return i;

}


[此贴子已经被作者于2017-5-19 08:33编辑过]

搜索更多相关主题的帖子: def struct char name NULL 
2017-05-19 01:29
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:10 
有时间要看看这方面的内容才行~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-19 06:52
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
记得以前写过一种结构~就是多个指针指向同一个地址~然后修改那个地址的值其余值就会相关联变动~~不过当时技术还不成熟就没有多去研究了~~现在看来这可以用于设计一些关联结构~例如可以在制作游戏的时候把人物信息用一个结构体保存~~相关人物信息指向这个结构体~这样修改人物信息就不用一个一个去修改了~直接修改那个结构体就行了~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-19 07:13
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:0 
回复 3楼 九转星河
数据结构帖子,总会有你的身影,还会产生自己的想法自己总结。是我们值得学习的地方。 i love you ,我相信这能表达我对你的看法~~~~~~~~~~~~~
2017-05-19 08:20
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:10 
回复 3楼 九转星河
看你的描述有点像原子。
PS:这里说的原子并非原子操作。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-19 08:24
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 5楼 renkejun1942
表示还没接触过原子方面的内容~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-19 09:30
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 6楼 九转星河
关于我说的原子很少有书上提到,我那程序员朋友听我说原子也以为是原子操作。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-19 09:44
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 7楼 renkejun1942
那你说说你所理解的原子是指什么内容?~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-19 10:24
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
现在不太方便,在上班,我的小手机打字不太方便。下班再说吧。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-19 10:39
快速回复:链式哈希表分享
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025519 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved