哈希,链接法解决冲突

Posted rakint

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了哈希,链接法解决冲突相关的知识,希望对你有一定的参考价值。

#include<iostream>
using namespace std;

struct ListNode;
typedef struct ListNode *Position;
struct Hash_table;
typedef Hash_table *Hashtab;
typedef Position List;

#define Min_table_size 10

struct ListNode
{
 int Emelent;
 Position Next;
};

struct Hash_table
{
 int Table_size;
 List *Thelist;//指向链表的链表
};

//////////////相关函数声明//////////////////////
Hashtab Inittable(int Table_size);     //初始化一个散列
Position Find(int x, Hashtab H);      //查找元素x,返回对应的位置
int Hash(int x);  //散列函数
void Insert(int Key, Hashtab H);   //在散列中插入元素Key
void Delete(int Key, Hashtab H);   //在散列中删除元素Key

 

///////////////相关函数定义////////////////////
Hashtab Inittable(int table_size)
{
 Hashtab H;
 if (table_size < Min_table_size)
 {
  cout << "Table size is too small" << endl;
  return NULL;
 }

 H = (Hashtab)malloc(sizeof(Hash_table));
 if (H == NULL)  cout << "out of space" << endl;
 H->Table_size = table_size;
 H->Thelist = (List*)malloc(sizeof(Position) * H->Table_size);//不知道Position里头有多少个元素也可以分配内存吗
 if (H->Thelist == NULL) cout << "out of space" << endl;
 for (int i = 0; i != H->Table_size; ++i)
 {
  H->Thelist[i] = (Position)malloc(sizeof(ListNode));
  if (H->Thelist[i] == NULL) cout << "out of space" << endl;
  else
  {
   H->Thelist[i]->Emelent = i;
   H->Thelist[i]->Next = NULL;
  }
 }
 return H;
}

int Hash(int x)   //对10取余数
{
 return x % 10;
}

Position Find(int x, Hashtab H)
{
 Position P;
 List L;

 L = H->Thelist[Hash(x)];  //指向含有那个元素的表头
 P = L->Next;
 while (P != NULL && P->Emelent != x)
  P = P->Next;
 return P;
}

void Insert(int Key, Hashtab H)
{
 Position Pos, Newcell;
 List L;
 Pos = Find(Key, H);  //先找找看,有没有Key,有就算了
 if (Pos == NULL)
 {
  Newcell = (Position)malloc(sizeof(ListNode));
  if (Newcell == NULL)  cout << "out of space" << endl;
  else    //插入到槽后面的第一个位置
  {
   L = H->Thelist[Hash(Key)];
   Newcell->Next = L->Next;
   Newcell->Emelent = Key;
   L->Next = Newcell;
  }
 }
}

void Delete(int Key, Hashtab H)
{
 Position p, Tmpcell;
 List L;
 p = Find(Key, H);
 if (p == NULL)
  cout << "not find the " << Key << endl;
 else
 {
  L = H->Thelist[Hash(Key)];
  p = L;
  while (p->Next != NULL && p->Next->Emelent != Key)   //寻找Key的前驱节点
  {
   p = p->Next;
  }
  //
  Tmpcell = p->Next;
  p->Next = Tmpcell->Next;
  free(Tmpcell);
 }

}
int main()
{
 Hashtab H = Inittable(11);
 cout << H->Thelist[9]->Emelent << endl;
 Insert(1, H);
 Insert(4, H);
 Insert(9, H);
 Insert(16, H);
 Insert(25, H);
 Insert(19, H);
 Insert(29, H);
 Delete(19, H);
 
 cout << H->Thelist[9]->Next->Next->Emelent << endl;
 return 0;
}










































































































以上是关于哈希,链接法解决冲突的主要内容,如果未能解决你的问题,请参考以下文章

解决哈希冲突方法总结

解决哈希冲突方法总结

哈希冲突处理实践

哈希表原理及如何避免键值冲突法?

Java解决Hash(散列)冲突的四种方法--开放地址法(线性探测,二次探测,伪随机探测)链地址法再哈希建立公共溢出区

数据结构--散列(分离链接法解决冲突)