zoukankan      html  css  js  c++  java
  • 哈希表的C语言实现

      首先介绍一下什么是哈希表。同线性表、树一样,哈希表也是一种数据结构,理想情况下可以不需要任何比较,一次存取便能得到所查记录。所以它的优点就是查找特定记录的速度快。因为哈希表是基于数组的,所以创建后就难于扩展,而且不利于遍历数据。

      下面是哈希表的C实现:

      1 /* 哈希表的C实现
      2   查找使用的方法是“除留余数法”,解决冲突使用的方法是“链地址法”。
      3 */
      4 #include<stdio.h>
      5 #include<malloc.h> //malloc 
      6 #include<string.h> //memset
      7 #define FALSE 0
      8 #define TRUE 1
      9 typedef int STATUS;
     10 //定义哈希表和基本数据节点
     11 typedef struct _NODE
     12 {
     13     int data;
     14     struct _NODE* next;
     15 }NODE;
     16 
     17 typedef struct _HASH_TABLE
     18 {
     19     NODE* value[10];
     20 }HASH_TABLE;
     21 //创建哈希表
     22 HASH_TABLE* create_hash_table()
     23 {
     24     HASH_TABLE* pHashTbl = (HASH_TABLE*)malloc(sizeof(HASH_TABLE));
     25     memset(pHashTbl, 0, sizeof(HASH_TABLE));
     26     return pHashTbl;
     27 }
     28 //在哈希表中查找数据
     29 NODE* find_data_in_hash(HASH_TABLE* pHashTbl, int data)
     30 {
     31     NODE* pNode;
     32     if(NULL ==  pHashTbl)
     33         return NULL;
     34 
     35     if(NULL == (pNode = pHashTbl->value[data % 10]))
     36         return NULL;
     37 
     38     while(pNode){
     39         if(data == pNode->data)
     40             return pNode;
     41         pNode = pNode->next;
     42     }
     43     return NULL;
     44 }
     45 //在哈希表中插入数据
     46 STATUS insert_data_into_hash(HASH_TABLE* pHashTbl, int data)
     47 {
     48     NODE* pNode;
     49     if(NULL == pHashTbl)
     50         return FALSE;
     51 
     52     if(NULL == pHashTbl->value[data % 10]){
     53         pNode = (NODE*)malloc(sizeof(NODE));
     54         memset(pNode, 0, sizeof(NODE));
     55         pNode->data = data;
     56         pHashTbl->value[data % 10] = pNode;
     57         return TRUE;
     58     }
     59 
     60     if(NULL != find_data_in_hash(pHashTbl, data))
     61         return FALSE;
     62 
     63     pNode = pHashTbl->value[data % 10];
     64     while(NULL != pNode->next)
     65         pNode = pNode->next;
     66 
     67     pNode->next = (NODE*)malloc(sizeof(NODE));
     68     memset(pNode->next, 0, sizeof(NODE));
     69     pNode->next->data = data;
     70     return TRUE;
     71 }
     72 //从哈希表中删除数据
     73 STATUS delete_data_from_hash(HASH_TABLE* pHashTbl, int data)
     74 {
     75     NODE* pHead;
     76     NODE* pNode;
     77     if(NULL == pHashTbl || NULL == pHashTbl->value[data % 10])
     78         return FALSE;
     79 
     80     if(NULL == (pNode = find_data_in_hash(pHashTbl, data)))
     81         return FALSE;
     82 
     83     if(pNode == pHashTbl->value[data % 10]){
     84         pHashTbl->value[data % 10] = pNode->next;
     85         free(pNode);
     86         return TRUE;
     87     }
     88 
     89     pHead = pHashTbl->value[data % 10];
     90     while(pNode != pHead ->next)
     91         pHead = pHead->next;
     92     pHead->next = pNode->next;
     93 
     94 }
     95  void main()
     96 {
     97     HASH_TABLE* hashtable=create_hash_table();
     98     insert_data_into_hash(hashtable,1);
     99     //insert_data_into_hash(hashtable,4);
    100     insert_data_into_hash(hashtable,11);
    101     insert_data_into_hash(hashtable,21);
    102     NODE* node1=find_data_in_hash(hashtable,11);
    103     NODE* node2=find_data_in_hash(hashtable,21);
    104     printf("hashtable 1 : %d 
    ",hashtable->value[1]->data);
    105     if(hashtable->value[2]==NULL) printf("hashtable 2 is null
    ");
    106     printf("hashtable 1 : %d 
    ",node1->data);
    107     printf("hashtable 1 : %d 
    ",node2->data);
    108     delete_data_from_hash(hashtable,21);
    109         NODE* node3=find_data_in_hash(hashtable,21);
    110     if(node3==NULL) printf("21 is cancel
    ");
    111     else printf("hashtable 1 : %d 
    ",node3->data);
    112     
    113 
    114 }

      参考来自:http://blog.csdn.net/feixiaoxing/article/details/6885657

  • 相关阅读:
    【EFCORE笔记】客户端与服务端求值&跟踪与非跟踪查询
    【EFCORE笔记】预先加载&显式加载&延迟加载
    【EFCORE笔记】在远程查询数据
    【EFCORE笔记】远程数据查询支持
    【EFCORE笔记】元素操作&集合运算&转换类型
    【EFCORE笔记】生成操作&相等比较&串联运算
    【EFCORE笔记】联接运算与数据分组
    【EFCORE笔记】投影运算与数据分区
    【EFCORE笔记】排序&集运算&筛选&限定
    【EFCORE笔记】团队环境中的迁移
  • 原文地址:https://www.cnblogs.com/sj-lv/p/3454777.html
Copyright © 2011-2022 走看看