`
smallsmile
  • 浏览: 135318 次
  • 性别: 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;
}
有没有更复杂的

相关推荐

    题目整理(链表).pdf

    链表的知识点包括链表的基本概念、链表的类型、链表的操作、链表的应用、链表的优缺点、链表的实现、链表的算法、链表的题目、链表的实际应用、链表的高级应用、链表的优化、链表的安全、链表的发展、链表的研究、...

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

    在C++中,哈希表(Hash Table)是一种高效的数据结构,它通过使用哈希函数将数据映射到数组的特定位置,实现了快速查找、插入和删除操作。哈希表通常用于存储键值对,其中键经过哈希函数处理后转化为数组索引,值则...

    C++ hash.zip

    在本例中,我们关注的是使用C++实现的散列存储结构,具体是通过分离链表法处理冲突。下面将详细讨论这个主题。 首先,散列函数是将输入数据(通常是一个字符串或任何其他可哈希的值)映射到一个固定大小的数组索引...

    hash链地址法

    在HashList3.cpp和HashList3.h这两个文件中,可能包含了一个用C++实现的链地址法哈希表类。这个类可能包括以下关键组成部分: 1. **哈希函数(Hash Function)**:这是将关键码转化为数组下标的函数,通常要求快速...

    用到了模板链表的实现

    在`Hash_0310`这个文件或工程中,我们可以假设它包含了上述链表实现的源代码。可能还包括了对链表的一些测试用例,以验证其功能正确性。通过阅读和分析这个工程,可以深入理解模板链表的实现细节,以及如何在实际...

    C语言实现的Hash哈希表

    C语言中,我们可以通过指针来实现链地址法,每个数组元素指向一个链表头节点,链表节点包含关键字和其他信息。 创建哈希表时,需要考虑初始容量的选择。初始容量一般选择为质数,可以减少哈希冲突的概率。随着插入...

    C++哈希模板(基于邻接表) 散列

    这个"Cmy_Hash_Table_Template"文件很可能是包含了上述功能的C++源代码,可以作为初学者学习哈希表和链表操作的一个实例。通过阅读和理解这段代码,你可以深入理解哈希表的工作机制,以及如何在C++中实现这些概念。...

    hashChains.zip

    散列链地址法是数据结构和算法领域中解决哈希冲突的一种常见方法,它在C++编程中尤其...在C++中,可以利用标准库的链表容器或自定义链表结构实现。合理设计哈希函数和选择合适的数组大小是优化散列链地址法性能的关键。

    哈希表hashtable实现

    哈希表(Hash Table)是一种数据结构,它通过计算元素的哈希值并将其映射到数组中的特定位置来存储和检索数据。哈希表在计算机科学中扮演着至关重要的角色,因为它提供了快速的查找、插入和删除操作,通常的时间...

    数据结构课程设计hash表

    在`hash.cpp`和`hash.h`这两个文件中,我们可以推测出这可能是一个C++实现的哈希表项目。`.cpp`文件通常包含函数的实现,而`.h`文件则可能包含了类的定义和接口声明。这个哈希表可能采用了模板类的方式,以便能处理...

    pointer(array) control & Hash Control

    在C++编程中,"pointer(array) control & Hash Control" 主要涉及了对内存中对象的间接访问,以及高效的数据结构——哈希表的使用。这些概念在开发中经常用于管理和操作动态数据,特别是需要快速查找和存储的情况。 ...

    用C语言实现一个简单的哈希表(hash table)

    - 在这个C语言实现中,哈希函数可能是一个简单的模运算,例如`hash(key) = key % size`,其中`size`是哈希表的大小。 3. **冲突解决:链地址法**: - 链地址法是为每个数组元素创建一个链表,当新键映射到已有的...

    哈希表的实现

    在C++中,我们可以自定义数据结构来实现一个简单的哈希表。 首先,我们需要理解哈希函数的基本概念。哈希函数的目标是将键转化为数组的索引,这个过程应该尽可能地减少键值之间的冲突。冲突是指不同的键被映射到了...

    C++实现的一个哈希表类

    这个简单的C++哈希表实现适用于教学和小型项目,但在实际应用中,可能需要更复杂和优化的哈希函数以及冲突解决策略,例如开放寻址法或双哈希法,以确保高效性能。同时,为了适应大量数据和并发访问,可以考虑使用...

    c实现的哈希表(除留余数法、链地址法)(包含设计文档)

    4. **C语言实现**:在C语言中,实现哈希表可能涉及到结构体定义(如键值对结构和链表节点结构),动态内存分配(为数组和链表节点分配空间),以及指针操作(遍历和修改链表)。同时,为了保证代码的可读性和可维护...

    VC.module.code.create.hash.table.rar_ hash module_Table_hash VC

    但如果你想自定义哈希函数或冲突解决策略,或者需要优化内存使用,那么自定义哈希表的实现就显得尤为重要。 在"VC编程哈希表创建设计模块代码"这个压缩包中,可能包含了实现上述功能的源代码文件。这些文件可能包括...

    uthash User Guide

    1. **哈希函数和哈希表**:uthash中的每个结构体元素都包含一个名为`UT_hash_handle`的隐藏字段,这个字段用于存储哈希值和链表指针。哈希函数用于将结构体的关键字段转换为哈希值,以确定元素在哈希表中的位置。ut...

    hashtab2_C语言_哈希表删除、添加、寻找_codeblocks_

    如果哈希表使用链地址法处理冲突,插入操作就是将新元素插入到链表的头部或尾部。 5. **删除元素**:删除操作需要找到待删除元素的哈希值,然后在对应的链表中找到该元素并移除。在链表中查找元素可能需要遍历链表...

    数据结构_C++ 源码

    C++中可以通过自定义结构体和指针实现,或者使用STL中的`std::list`。 3. **栈(Stack)**:栈是一种后进先出(LIFO)的数据结构,常见的操作有压栈(push)、弹栈(pop)和查看栈顶元素(top)。C++提供了`std::...

Global site tag (gtag.js) - Google Analytics