`
smallsmile
  • 浏览: 134266 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C++ 自定义HASH表实现[冲突指针链表法]

阅读更多

 #include<string.h>
 #include<ctype.h>
 #include<malloc.h> /* malloc()等 */
 #include<limits.h> /* INT_MAX等 */
 #include<stdio.h> /* EOF(=^Z或F6),NULL */
 #include<stdlib.h> /* atoi() */
 #include<io.h> /* eof() */
 #include<math.h> /* floor(),ceil(),abs() */
 #include<process.h> /* exit() */
 /* 函数结果状态代码 */
 #define TRUE 1
 #define FALSE 0
 #define OK 1
 #define ERROR 0
 #define INFEASIBLE -1
 #define EQ(a,b) ((a)==(b))
 #define LT(a,b) ((a)<(b))
 #define LQ(a,b) ((a)<=(b))
  typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
 typedef int Boolean;

 #define NULLKEY 0 /* 0为无记录标志 */
 #define N 10 /* 数据元素个数 */
 typedef int KeyType; /* 设关键字域为整型 */

 class ElemType{
     public:
       KeyType key;
       int ord;
       ElemType *next;
       ElemType(KeyType key,int ord){
           this->key=key;
           this->ord=ord;
           this->next=NULL;
       }
 };
 
 int hashsize[]={11,19,29,37}; /* 哈希表容量递增表,一个合适的素数序列 */
 int m=0; /* 哈希表表长,全局变量 */
 typedef struct
 {
   ElemType *elem; /* 数据元素存储基址,动态分配数组 */
   int count; /* 当前数据元素个数 */
   int sizeindex; /* hashsize[sizeindex]为当前容量 */
 }HashTable;

 #define SUCCESS 1
 #define UNSUCCESS 0
 #define DUPLICATE -1
 
 Status InitHashTable(HashTable *H)
 { /* 操作结果: 构造一个空的哈希表 */
   int i;
   (*H).count=0; /* 当前元素个数为0 */
   (*H).sizeindex=0; /* 初始存储容量为hashsize[0] */
   m=hashsize[0];
   (*H).elem=(ElemType*)malloc(m*sizeof(ElemType));
   if(!(*H).elem)
     exit(OVERFLOW); /* 存储分配失败 */
   for(i=0;i<m;i++)
     (*H).elem[i].key=NULLKEY; /* 未填记录的标志 */
   return OK;
 }
 
  unsigned Hash(KeyType K)
 { /* 一个简单的哈希函数(m为表长,全局变量) */
   return K%m;
 }
 Status InsertData(HashTable *H,ElemType e)
 {
     //计算HASH
     int p;
     ElemType *x;
     p=Hash(e.key);
     if ((*H).elem[p].key==NULLKEY){//若没有数据,直接添加
         (*H).elem[p]=e;
          ++(*H).count;
     }else{
         x=&(*H).elem[p];
         while ((*x).next!=NULL){
            x=(*x).next;
            printf("&x is %d\n",x);
         }
         (*x).next=&e;
          printf("OK in\n");
         ++(*H).count;
     }
     
 }
void DeletData(HashTable *H, ElemType e)
 {
      //计算HASH
     int p;
     ElemType *x;
     p=Hash(e.key);
     if ((*H).elem[p].ord==e.ord){//在头位置,直接删除
          if ((*H).elem[p].next==NULL){
             (*H).elem[p].key=NULLKEY;
          }else{
              (*H).elem[p]=(*(*H).elem[p].next);
          }
          --(*H).count;
          printf("x is deleted");
     }else{
         x=&(*H).elem[p];
         while ((*((*x).next)).ord!=e.ord){//找到并删除
            x=(*x).next;
            if ((*x).next==NULL){
               printf("没有这个");
               exit(0);
            }
         }
         //删除
         (*x).next=(*((*x).next)).next;
          printf("OK delet\n");
         --(*H).count;
     }
    
 }
 
 void DestroyHashTable(HashTable *H)
 { /* 初始条件: 哈希表H存在。操作结果: 销毁哈希表H */
   free((*H).elem);
   (*H).elem=NULL;
   (*H).count=0;
   (*H).sizeindex=0;
 }


int main(){
   
   ElemType a(12,39);

   ElemType b(2,33);
  
   ElemType c(1,23);
 
   HashTable h;
   Status j;
   KeyType k;
   InitHashTable(&h);
   InsertData(&h,a);
   printf("insert a\n");
   InsertData(&h,b);
   printf("insert b\n");
   InsertData(&h,c);
   printf("insert c\n");
}

 

注:本代码参考严蔚敏老师的《数据结构》

分享到:
评论
1 楼 deepfuture 2010-11-28  
  unsigned Hash(KeyType K)
{ /* 一个简单的哈希函数(m为表长,全局变量) */
   return K%m;
}
有没有更复杂的

相关推荐

    C++语言实现hash表详解及实例代码

    C++语言实现hash表详解 概要:  hash表,有时候也被称为散列表。个人认为,hash表是介于链表和二叉树之间的一种中间结构。链表使用十分方便,但是数据查找十分麻烦;二叉树中的数据严格有序,但是这是以多一个指针...

    浅谈C++容器

    Hash 表的操作包括插入元素、删除元素、查找元素和遍历 Hash 表等。 这些容器类都是基于数据结构的基本知识,它们是对数据结构的实例化。因此,了解数据结构的概念是非常重要的。只有了解了数据结构的概念,才能更...

    高级进阶c语言教程..doc

    4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. C编程拾粹 42 10. C语言中实现数组的动态...

    免费下载:C语言难点分析整理.doc

    4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. C编程拾粹 42 10. C语言中实现数组的动态...

    C语言难点分析整理.doc

    4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. C编程拾粹 42 10. C语言中实现数组的...

    c语言难点分析整理,C语言

    4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. C编程拾粹 42 10. C语言中实现数组的动态...

    高级C语言 C 语言编程要点

    4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. C编程拾粹 42 10. C语言中实现数组的动态...

    史上最强的C语言资料

    4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. C编程拾粹 42 10. C语言中实现数组的动态...

    高级C语言详解

    4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. C编程拾粹 42 10. C语言中实现数组的动态...

    C语言难点分析整理

    4. C/C++实现冒泡排序算法 32 5. C++中指针和引用的区别 35 6. const char*, char const*, char*const的区别 36 7. C中可变参数函数实现 38 8. C程序内存中组成部分 41 9. C编程拾粹 42 10. C语言中实现数组的动态...

    c++容器list、vector、map、set区别与用法详解

    封装链表,以链表形式实现,不支持[]运算符。 对随机访问的速度很慢(需要遍历整个链表),插入数据很快(不需要拷贝和移动数据,只需改变指针的指向)。 新添加的元素,list可以任意加入。 vector 封装数组,使用...

    leetcode316-leetcode_and_swordoffer:LeetCode分类题解,语言为C++

    LeetCode、剑指Offer刷题笔记(C++实现) LeetCode 题目按类型分类 Hash 链表 双指针 快慢指针 滑动窗口 区间合并 字符串操作 数字操作 数组操作 栈 单调栈 堆 递归 分治/二分查找 动态规划 树形DP 0-1背包 [474_一和...

    leetcode卡-leetcode:每日算法练习

    1.先完成卡片上的进度,熟悉基础的数据结构(堆,队列,hash表,链表,树等)。 对常见算法(归并,双指针,二分查找,贪心算法等)有一定了解。 2.找一些经典的题,先想想思路,多想想试试做一下,然后看题解照着多写死...

    南理工初试试题

    (4)(3分)按以上数据, 用链地址法处理冲突(Hash函数H(key)=key % 13),画出示意图(不要写算法) 3.(3分)已知三棵树的森林如下,试把它转化为二叉树 A G N / \ / | \ / \ B C H I K O P / | \ / \ / | \...

    leetcode中国-leetcode_algo:leetcode相关算法和模板使用python

    链表与邻接表:树与图的存储 栈与队列:单调队列、单调栈 kmp Trie 并查集 堆 Hash表 C++ STL使用技巧 搜索与图论 —— 代码模板链接 常用代码模板3——搜索与图论 DFS与BFS 树与图的遍历:拓扑排序 最短路 最小生成...

    算法基础课程:算法备赛学程

    2.数据结构链表与合并表:树与图的存储栈与实例:单调、、单调栈kmp Trie并查集堆Hash表C ++ STL使用技巧 3.搜索与图论 DFS与BFS树与图的遍历:拓扑排序最短最小最小生成树 4.数学知识 质数约数欧拉函数快速幂扩展...

    高级C语言.PDF

    1. C 语言中的指针和内存泄漏 ............................................................................................................. 5 2. C语言难点分析整理 ..........................................

    世界500强面试题.pdf

    第一篇 面试题 ................................................................................ 8 1.1. 简介 ..................................1.6.7. 给定链表的头指针和一个结点指针,在 O(1)时间删除该结点 ....

    一些C面试题,希望能对大家有帮助

    2.对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现? c用宏定义,c++用inline 3.直接链接两个信令点的一组链路称作什么? PPP点到点连接 4.接入网用的是什么接口? 5.voip都用了那些协议? 6....

    PaperTest Q&amp;A笔试综述

    14)压栈·优先级·位序·宏· Union·指针 32 15)new&amp; malloc… 35 16) enum 35 2.面冋对象编程 面面面 35 1)构造函数虚函数静态成员函数…… 35 2)copy&amp; assignment… 36 3)列表初始化 37 ...

Global site tag (gtag.js) - Google Analytics