#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的更多相关文章

  1. Hash表(hash table ,又名散列表)

    直接进去主题好了. 什么是哈希表? 哈希表(Hash table,也叫散列表),是根据key而直接进行访问的数据结构.也就是说,它通过把key映射到表中一个位置来访问记录,以加快查找的速度.这个映射函 ...

  2. hash-1.hash表和hash算法

    1.hash表 哈希表,也叫散列表,是根据关键码(Key)而直接访问的数据结构,也就是它把Key映射到表中一个位置来访问记录,即,把key计算成hashcode,把hashcode存到表中.这个把ke ...

  3. hash表、hash算法

    概念: 散列表(Hash table.也叫哈希表),是依据关键码值(Key value)而直接进行訪问的数据结构. 也就是说,它通过把关键码值映射到表中一个位置来訪问记录,以加快查找的速度.这个映射函 ...

  4. Hash表及hash算法的分析

    Hash表中的一些原理/概念,及根据这些原理/概念: 一.       Hash表概念 二.       Hash构造函数的方法,及适用范围 三.       Hash处理冲突方法,各自特征 四.   ...

  5. Hash表的扩容(转载)

    Hash表(Hash Table)   hash表实际上由size个的桶组成一个桶数组table[0...size-1] . 当一个对象经过哈希之后.得到一个对应的value , 于是我们把这个对象放 ...

  6. php 数据结构 hash表

    hash表 定义 hash表定义了一种将字符组成的字符串转换为固定长度(一般是更短长度)的数值或索引值的方法,称为散列法,也叫哈希法.由于通过更短的哈希值比用原始值进行数据库搜索更快,这种方法一般用来 ...

  7. 【数据结构】Hash表简介及leetcode两数之和python实现

    文章目录 Hash表简介 基本思想 建立步骤 问题 Hash表实现 Hash函数构造 冲突处理方法 leetcode两数之和python实现 题目描述 基于Hash思想的实现 Hash表简介 基本思想 ...

  8. NGINX(三)HASH表

    前言 nginx的hash表有几种不同的种类, 不过都是以ngx_hash_t为基础的, ngx_hash_t是最普通的hash表, 冲突采用的是链地址法, 不过这里冲突的元素不是一个链表, 而是一个 ...

  9. 【数据结构】非常有用的hash表

        这篇博客的目的是让尚未学会hash表的朋友们对hash表有一个直观的理解,并且能根据本文定义出属于自己的第一个hash表,但算不上研究文,没有深究概念和成功案例.         什么是has ...

随机推荐

  1. 取值对比ture of false加引号与不加引号的问题-----Bug笔记-160219

    一.默认情况,当属性值为布尔值类型的时候对比判断不用加引号<input type="radio" name="city" value="BeiJ ...

  2. php5.4安装ecshopphp5.4问题及解决

    includes/cls_template.php line422 将 $tag_sel = array_shift(explode(" ", $tag)); 这句话拆开为两句. $tag_exp = ...

  3. angularjs入门整理

    之前发过一篇博文,从mobile angular ui的demo和其官网初识整个angularjs的大体使用,但是没很好学习,只是通过一些技术博文初步认识,陷入很多坑.所以现在在中文官网正式整理下知识 ...

  4. 使用PHP生成二维码的两种方法(带logo图像)

    一.利用Google API生成二维码 Google提供了较为完善的二维码生成接口,调用API接口很简单,以下是调用代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  5. Mac os 10.9下面配置JAVA_HOME

    刚入手的的MBP,就开始配置java环境,搜了一下网上的都是10.9以前的配置方法.jdk7在10.9的安装目录变化了. 首先到Oracle官网下载最新版本的java,直接默认安装 cd /etc s ...

  6. Delphi的Owner与Parent可以不一致,而且Owner不是必须存在(一共7个问题) good

    问题1:Owner与Parent不一致:新建一个Form,上面放一个Button1,一个Panel1,然后在Panel1上再放一个Button2,测试结果:procedure TForm1.Butto ...

  7. 与QString("我是中文")完全一样,你必须告诉tr这个窄字符串是何种编码?你不告诉它,它就用latin1。于是所谓的乱码问题就出来了。

    在论坛中漂,经常遇到有人遇到tr相关的问题.用tr的有两类人: (1)因为发现中文老出问题,然后搜索,发现很多人用tr,于是他也开始用tr (2)另一类人,确实是出于国际化的需要,将需要在界面上显示的 ...

  8. OnScroll与OnTouchEvent方法的区别与联系

    onScroll()方法和onTouchEvent()方法的执行过程应该是,先onTouchEvent()的ACTION_DOWN,然后是ACTION_MOVE和onScroll()方法同时进行,最后 ...

  9. 14.8.1 Creating InnoDB Tables 创建InnoDB 表

    14.8.1 Creating InnoDB Tables 创建InnoDB 表 创建一个InnoDB表,使用CREATE TABLE 语句,你不需要指定ENGINE=InnoDB 子句 如果Inno ...

  10. python读取文件通过正则过滤需要信息然后保存到新文件里

    import osimport reimport fileinput def getDataFromFile():        rt = "/(.*)/(.*).apk"     ...