哈希表及完整注释

简介: 哈希表及完整注释

  #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++;
      }
  }
相关文章
|
2月前
|
索引
15. 索引是越多越好嘛? 什么样的字段需要建索引, 什么样的字段不需要 ?
是否越多索引越好?并非如此。应根据需求建索引:主键自动索引,频繁查询、关联查询、排序、查找及统计分组字段建议建索引。但表记录少,频繁增删改操作,频繁更新的字段,以及使用频率不高的查询条件则不需要建索引。
36 0
|
2月前
|
存储 关系型数据库 索引
10. 在一个非主键字段上创建了索引, 想要根据该字段查询到数据, 需要查询几次 ?
在非主键字段上创建索引,查询数据通常需两次。对于MyISAM,先通过索引找到数据行指针,再获取数据;而InnoDB则先找主键ID,再从主键索引中查找数据。
22 0
|
1月前
|
SQL 关系型数据库 MySQL
MySQL数据库——索引(6)-索引使用(覆盖索引与回表查询,前缀索引,单列索引与联合索引 )、索引设计原则、索引总结
MySQL数据库——索引(6)-索引使用(覆盖索引与回表查询,前缀索引,单列索引与联合索引 )、索引设计原则、索引总结
30 1
|
2月前
|
算法
[leetcode 哈希表] 模版
[leetcode 哈希表] 模版
|
8月前
|
数据建模 Java 数据库
PowerDesigner使用之为表中字段添加索引
PowerDesigner使用之为表中字段添加索引
203 1
|
12月前
|
索引
索引是越多越好嘛? 什么样的字段需要建索引, 什么样的字段不需要 ?
索引是越多越好嘛? 什么样的字段需要建索引, 什么样的字段不需要 ?
93 0
|
12月前
|
关系型数据库 MySQL 索引
Mysql索引是越多越好嘛? 什么样的字段需要建索引, 什么样的字段不需要 ?
MySQL索引的数量并不是越多越好,过多的索引可能会导致性能下降和存储空间的浪费。
227 0
SWUSTOJ 1013: 哈希表(开放定址法处理冲突)
SWUSTOJ 1013: 哈希表(开放定址法处理冲突)
85 0
|
SQL 关系型数据库 MySQL
表索引——隐藏索引和删除索引
前言 MySQL 8开始支持隐藏索引。隐藏索引提供了更人性化的数据库操作。
|
存储 SQL 关系型数据库
【名词解释与区分】聚集索引、非聚集索引、主键索引、唯一索引、普通索引、前缀索引、单列索引、组合索引、全文索引、覆盖索引
【名词解释与区分】聚集索引、非聚集索引、主键索引、唯一索引、普通索引、前缀索引、单列索引、组合索引、全文索引、覆盖索引
270 1
【名词解释与区分】聚集索引、非聚集索引、主键索引、唯一索引、普通索引、前缀索引、单列索引、组合索引、全文索引、覆盖索引