哈希表及完整注释

简介: 哈希表及完整注释

  #include "stdio.h"
  #include "stdlib.h"
  typedef struct{
      int* elem;  //数据元素存储基址,动态分配数组
      int count;  //当前数据元素个数
  }HashTable;
  int m=0;        //散列表表长,全局变量
                  //HASHSIZE 定义散列表长为数组的长度
  typedef enum {  //或者不要typedef,将Status放在前面,调用的函数前面加enum
      OK=1,SUCCESS=1,UNSUCCESS=0,HASHSIZE=12,NULLKEY=-32768
  }Status;
  Status InitHashTable(HashTable *H){ //初始化散列表
      int i;
      m=HASHSIZE;
      H->count=m;
      H->elem=(int *)malloc(m*sizeof(int));
      for(i=0;i<m;i++)
          H->elem[i]=NULLKEY;
      return OK;
  }
  int Hash(int key){  //散列函数  key相当于qq账号
      return key%m;   //除留余数法 返回钥匙
  }
  void InsertHash(HashTable* H,int key){ //插入关键字进散列表
      int addr=Hash(key);                //求散列地址
      printf("The subscript of the inserted array position:%d\n",addr);
      while(H->elem[addr]!=NULLKEY)      //如果不为空,则冲突
          addr=(addr+1)%m;               //开发定址法的线性探测
      H->elem[addr]=key;                 //直到有空位后插入关键字
  }
  Status SearchHash(HashTable H,int key,int* addr){ //插入关键字进散列表
      *addr=Hash(key);                              //求散列地址
      while(H.elem[*addr]!=key){                    //如果不为空,则冲突
          *addr=(*addr+1)%m;                        //开发定址法的线性探测
          if(H.elem[*addr]==NULLKEY||*addr==Hash(key)){
              //如果循环回到原点
              //则说明关键字不存在
              return UNSUCCESS;
          }
      }
      return SUCCESS;
  }
  int main(){
      int i=0;
      HashTable H;
      InitHashTable(&H);
      while(i<HASHSIZE){
          InsertHash(&H,i);     //插入12个数
          i++;
      }
      int key=0;
      int addr;                //返回下标的作用
      while(key<HASHSIZE){
        if(SearchHash(H,key,&addr)==SUCCESS){  //搜索到了这个数的位置
              printf("Print the position of this number:%d\n",addr);
          } else{
              printf("UNSUCCESS\n");
          }
          key++;
      }
  }
相关文章
|
25天前
|
数据库 索引
联合索引和单独列有什么区别
【10月更文挑战第15天】联合索引和单独列有什么区别
40 2
|
5月前
|
SQL 关系型数据库 MySQL
MySQL数据库——索引(6)-索引使用(覆盖索引与回表查询,前缀索引,单列索引与联合索引 )、索引设计原则、索引总结
MySQL数据库——索引(6)-索引使用(覆盖索引与回表查询,前缀索引,单列索引与联合索引 )、索引设计原则、索引总结
98 1
|
数据建模 Java 数据库
PowerDesigner使用之为表中字段添加索引
PowerDesigner使用之为表中字段添加索引
391 1
|
关系型数据库 MySQL 索引
Mysql索引是越多越好嘛? 什么样的字段需要建索引, 什么样的字段不需要 ?
MySQL索引的数量并不是越多越好,过多的索引可能会导致性能下降和存储空间的浪费。
310 0
|
存储 SQL 关系型数据库
【名词解释与区分】聚集索引、非聚集索引、主键索引、唯一索引、普通索引、前缀索引、单列索引、组合索引、全文索引、覆盖索引
【名词解释与区分】聚集索引、非聚集索引、主键索引、唯一索引、普通索引、前缀索引、单列索引、组合索引、全文索引、覆盖索引
399 1
【名词解释与区分】聚集索引、非聚集索引、主键索引、唯一索引、普通索引、前缀索引、单列索引、组合索引、全文索引、覆盖索引
SWUSTOJ 1013: 哈希表(开放定址法处理冲突)
SWUSTOJ 1013: 哈希表(开放定址法处理冲突)
107 0
|
C#
C# 该行已经属于另一个表
C# 该行已经属于另一个表
107 0
|
存储 安全 Java
看懂哈希表及RandomPool结构
Java中最常用的哈希表莫过于HashMap和HashSet了,两者的结构一致,原理一致,唯独区别在于HashMap有伴随数据Value而HashSet没有。
119 0
看懂哈希表及RandomPool结构
|
JavaScript 前端开发
你的哈希表写法可能并不对
欢迎关注我:前端西瓜哥
114 0
合并查询结果与为表和字段取别名
合并查询结果与为表和字段取别名
176 0
合并查询结果与为表和字段取别名