Hash表——The Hash table
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"
#define NAMESIZE 24
#define HASHSIZE 256
typedef LIST HASH;
typedef struct stuinfo{
int id;
char name[NAMESIZE];
int math;
}DATA;
static void print_s(const void *data)
{
const DATA *stup = data;
printf("%d %s %d\n",
stup->id,
stup->name,
stup->math);
}
static int IdCmp(const void *key, const void *data)
{
const int *id = key;
const DATA *stup = data;
return (*id - stup->id);
}
static int NameCmp(const void *key, const void *data)
{
const char *name = key;
const DATA *stup = data;
return strcmp(name, stup->name);
}
int hash_init(HASH *hash, int size)
{
int i, j;
for(i = 0; i < HASHSIZE; i++)
{
hash[i] = ListCreate(size);
if(NULL == hash[i])
{
for(j = 0; j < i; j++)
ListDispose(hash[j]);
return -1;
}
}
return 0;
}
int getnum(int nu)
{
return (nu % HASHSIZE);
}
int hash_insert(HASH *hash, const DATA *data)
{
int i = getnum(data->id);
return ListInsert(hash[i], data, HEADINSERT);
}
void hash_display(HASH *hash)
{
int i;
int count = 0;
for(i = 0; i < HASHSIZE; i++)
{
count = 0;
PtrNode p = hash[i]->head.next;
for(; p != &hash[i]->head; p = p->next, count++);
printf("%d ", count);
}
printf("\n");
}
void hash_dispose(HASH *hash)
{
int i;
for(i = 0; i < HASHSIZE; i++)
{
ListDispose(hash[i]);
hash[i] = NULL;
}
}
void *hash_find(HASH *hash, int id)
{
int i = getnum(id);
return ListFind(hash[i], &id, IdCmp);
}
int main()
{
int i;
int id = 5;
char name[NAMESIZE] = "stu3";
DATA stu, *stup;
HASH hash[HASHSIZE] = {0};
hash_init(hash, sizeof(DATA));
srand(time(NULL));
for(i = 0; i < 9999; i++)
{
id = stu.id = rand();
snprintf(stu.name,NAMESIZE,
"stu%d", i + 1);
stu.math = rand() % 100;
hash_insert(hash, &stu);
}
stup = hash_find(hash, id);
if(stup == NULL)
printf("not find\n");
else
print_s(stup);
hash_display(hash);
hash_dispose(hash);
return 0;
}
-----------------------------------------------------------
#ifndef _LIST_H__
#define _LIST_H__
#define HEADINSERT 1
#define TAILINSERT 2
struct listnode;
struct headnode;
typedef struct headnode *LIST;
typedef struct listnode *PtrNode;
typedef void print(const void *);
typedef int cmp(const void *, const void *);
LIST ListCreate(int);
int ListInsert(LIST, const void *, int);
void *ListFind(LIST, const void *, cmp *);
int ListDelete(LIST, const void *, cmp *);
int ListFetch(LIST, const void *, cmp *, void *);
void ListDisplay(LIST, print *);
void ListDispose(LIST);
struct listnode{
void *data;
struct listnode *prev;
struct listnode *next;
};
struct headnode{
int size;
struct listnode head;
};
#endif
---------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"
LIST ListCreate(int size)
{
LIST handle = malloc(sizeof(*handle));
if(NULL == handle)
return NULL;
handle->size = size;
handle->head.data = NULL;
handle->head.prev = handle->head.next = &handle->head;
return handle;
}
int ListInsert(LIST l, const void *data, int mode)
{
PtrNode cur = malloc(sizeof(*cur));
if(NULL == cur)
return -1;
cur->data = malloc(l->size);
if(NULL == cur->data)
{
free(cur);
return -2;
}
memcpy(cur->data, data, l->size);
if(mode == HEADINSERT)
{
cur->next = l->head.next;
cur->prev = &l->head;
}
else if(mode == TAILINSERT)
{
cur->next = &l->head;
cur->prev = l->head.prev;
}
else
{
free(cur->data);
free(cur);
return -3;
}
cur->prev->next = cur;
cur->next->prev = cur;
return 0;
}
static PtrNode find(LIST l, const void *key, cmp *funp)
{
PtrNode p = l->head.next;
for(;p != &l->head && funp(key, p->data); p = p->next);
return p;
}
void *ListFind(LIST l, const void *key, cmp *funp)
{
return find(l, key, funp)->data;
}
int ListDelete(LIST l, const void *key, cmp *funp)
{
PtrNode p = find(l, key, funp);
if(p == &l->head)
return -1;
p->prev->next = p->next;
p->next->prev = p->prev;
//p->prev = p->next = NULL;
free(p->data);
free(p);
//p = NULL;
return 0;
}
int ListFetch(LIST l, const void *key, cmp * funp, void *data)
{
PtrNode p = find(l, key, funp);
if(p == &l->head)
return -1;
memcpy(data, p->data, l->size);
p->prev->next = p->next;
p->next->prev = p->prev;
//p->prev = p->next = NULL;
free(p->data);
free(p);
//p = NULL;
return 0;
}
void ListDisplay(LIST l, print *funp)
{
PtrNode p = l->head.next;
while(p != &l->head)
{
funp(p->data);
p = p->next;
}
}
void ListDispose(LIST l)
{
PtrNode p = l->head.next;
PtrNode q;
while(p != &l->head)
{
q = p;
p = p->next;
free(q->data);
free(q);
}
free(l);
}
Hash表——The Hash table的更多相关文章
- Hash表(hash table ,又名散列表)
直接进去主题好了. 什么是哈希表? 哈希表(Hash table,也叫散列表),是根据key而直接进行访问的数据结构.也就是说,它通过把key映射到表中一个位置来访问记录,以加快查找的速度.这个映射函 ...
- hash-1.hash表和hash算法
1.hash表 哈希表,也叫散列表,是根据关键码(Key)而直接访问的数据结构,也就是它把Key映射到表中一个位置来访问记录,即,把key计算成hashcode,把hashcode存到表中.这个把ke ...
- hash表、hash算法
概念: 散列表(Hash table.也叫哈希表),是依据关键码值(Key value)而直接进行訪问的数据结构. 也就是说,它通过把关键码值映射到表中一个位置来訪问记录,以加快查找的速度.这个映射函 ...
- Hash表及hash算法的分析
Hash表中的一些原理/概念,及根据这些原理/概念: 一. Hash表概念 二. Hash构造函数的方法,及适用范围 三. Hash处理冲突方法,各自特征 四. ...
- Hash表的扩容(转载)
Hash表(Hash Table) hash表实际上由size个的桶组成一个桶数组table[0...size-1] . 当一个对象经过哈希之后.得到一个对应的value , 于是我们把这个对象放 ...
- php 数据结构 hash表
hash表 定义 hash表定义了一种将字符组成的字符串转换为固定长度(一般是更短长度)的数值或索引值的方法,称为散列法,也叫哈希法.由于通过更短的哈希值比用原始值进行数据库搜索更快,这种方法一般用来 ...
- 【数据结构】Hash表简介及leetcode两数之和python实现
文章目录 Hash表简介 基本思想 建立步骤 问题 Hash表实现 Hash函数构造 冲突处理方法 leetcode两数之和python实现 题目描述 基于Hash思想的实现 Hash表简介 基本思想 ...
- NGINX(三)HASH表
前言 nginx的hash表有几种不同的种类, 不过都是以ngx_hash_t为基础的, ngx_hash_t是最普通的hash表, 冲突采用的是链地址法, 不过这里冲突的元素不是一个链表, 而是一个 ...
- 【数据结构】非常有用的hash表
这篇博客的目的是让尚未学会hash表的朋友们对hash表有一个直观的理解,并且能根据本文定义出属于自己的第一个hash表,但算不上研究文,没有深究概念和成功案例. 什么是has ...
随机推荐
- 转 C#开发微信门户及应用(1)--开始使用微信接口
微信应用如火如荼,很多公司都希望搭上信息快车,这个是一个商机,也是一个技术的方向,因此,有空研究下.学习下微信的相关开发,也就成为日常计划的重要事情之一了.本系列文章希望从一个循序渐进的角度上,全面介 ...
- JavaScript学习心得(二)
一选择DOCTYPE DOCTYPE是一种标准通用标记语言的文档类型声明,目的是告诉标准通用标记语言解析器使用什么样的文档类型定义(DTD)来解析文档. 网页从DOCTYPE开始,即<!DOCT ...
- CentOS 6.0 图文安装教程
CentOS 6.0下载地址:wget http://ftp.riken.jp/Linux/centos/6.0/isos/i386/CentOS-6.0-i386-bin-DVD.iso 下边就是安 ...
- 十大响应式Web设计框架
http://www.csdn.net/article/2014-05-13/2819739-responsive-frameworks-for-web-design 对于设计师而言,网站设计中的任意 ...
- LightOj_1104 Birthday Paradox
题目链接 题意: 若一年有n天, 问至少需要多少个人才能满足其中两个人生日相同的概率大于等于0.5? 思路: 经典问题:生日悖论 换成其互斥事件:m个人, 每个人生日都不相同的概率 ≤ 0.5 时最小 ...
- Uva_11361 Investigating Div-Sum Property
题目链接 题意: 在[A,B]区间内找出满足条件的数有多少个. 条件:这个数本身 能够整除K, 且各位数字之和能够整除K. 思路: 数据范围过大2^31 2^31 = 2147483648 ~ 2*1 ...
- ExtJS中动态设置TextField的readOnly属性
第一种方式: textField, 如果知道textField的id = 'textField' 话,就可以利用如下的方法: 则代码如下:Ext.getCmp("textField" ...
- tyvj P1716 - 上帝造题的七分钟 二维树状数组区间查询及修改 二维线段树
P1716 - 上帝造题的七分钟 From Riatre Normal (OI)总时限:50s 内存限制:128MB 代码长度限制:64KB 背景 Background 裸体就意味着 ...
- NWERC 2012 Problem I Idol
又是个2-sat的模板题: 反正评委的选择必须有一个是正确的,1错误,那么2就必须正确: 这就是一个2-sat问题. 直接上白书的模板啊,不过稍微要注意的一点是对于第一个点必须要选择,不然就违反了题意 ...
- struts2 集成webservice 的方法
由于项目需求的需要,要在原来用Struts2的框架之上集成webservice,因为之前单单做webservice的时候没有多大问题,使用 Spring 和 Xfire就可以轻松地发布服务,但是,当和 ...