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 ...
随机推荐
- 基础-函数3(IIFE立即执行函数)
参考链接: http://benalman.com/news/2010/11/immediately-invoked-function-expression/#iife http://segmentf ...
- js获取时间加多山天和时间戳转换成日期
function huoqu(){ var data = $("#data").val();//获取的时间 var day = $('#day').val();//往后 ...
- PYTHON开发--面向对象基础二
一.成员修饰符 共有成员 私有成员, __字段名 - 无法直接访问,只能间接访问 1. 私有成员 1.1 普通方法种的私有成员 class Foo: def __init__(self, n ...
- git 创建多个账户ssh
创建一个账户 创建ssh本地秘钥. $ ssh-keygen -t rsa -C "youremail@xxx.com" 一路回车,会在~/.ssh/目录下生成id_rsa和id_ ...
- 浙工大C语言入门指南 (仅供参考)
C语言书籍推荐 浙工大图书馆中,计算机的书都集中在三楼TP区.我个人推荐下面这么几本书. <Head First C>.Head First系列的书质量基本都很高.该书有很多插图,总体上就 ...
- C# 下载资源
//创建一个初始化请求对象 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri("http://wwww.b ...
- Apache添加虚拟主机目录
<VirtualHost 127.0.0.2:80> DocumentRoot d:/abcd ServerName 127.0.0.2:80</VirtualHost> &l ...
- 到底该如何入门Keras、Theano呢?(浅谈)
目前刚刚开始学习Theano,可以说是一头雾水,后来发现Keras是对Theano进行了包装,直接使用Keras可以减少很多细节程序的书写,它是模块儿化的,使用比较方便,但更为细节的内容,还没有理解, ...
- nutch-1.7 编译
转载自:http://peigang.iteye.com/blog/1563288 从nutch-.3开始 本地抓取(单击) 和 分布式抓取(集群)所使用的配置文件和命令单独分开. 资源:下载地址:h ...
- httpclient 超时设置
最近项目客户反应超时经常出现:现已经总结超时设置: 使用是apache的HttpClient: DefaultHttpClient:请求超时httpclient.getParams().setPara ...