#define CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class SET {
int* set; //set用于存放集合元素
int card; //card为能够存放的元素个数
int used; //used为已经存放的元素个数
public:
SET(int card); //card为能够存放的元素个数
~SET();
int size(); //返回集合已经存放的元素个数
int insert(int v); //插入v成功时返回1,否则返回0
int remove(int v); //删除v成功时返回1,否则返回0
int has(int v); //元素v存在时返回1,否则返回0
};
SET::SET(int card) :set(new int[card] {}), card(card), used(0)
{
for (int k = 0; k < card; k++)
{
set[k] = -1; // 假设不存储 - 1
}
}
int SET::insert(int v)
{
if (used == card || has(v)==1 ) return 0;
int hash = v % card;
while (set[hash] != -1)
{
hash = ++hash == card ? 0 : hash;
}
set[hash] = v;
used++;
return 1;
}
int SET::remove(int v)
{
if (has(v) == 0 )
{
return 0;
}
int hash = v % card;
int position = hash;
while (set[position] != -1) // 这个可以避免落掉极端情况
{
if (set[position] == v)
{
set[position] = -1;
used--;
return 1;
}
position = ++position == card ? 0 : position;
}
return 0;
}
int SET::has(int v)
{
int hash = v % card;
int position = hash;
while (set[position] != -1) // 这个可以避免落掉极端情况
{
if (set[position] == v)
{
return 1;
}
if (position == hash)
{
return 0;
}
position = ++position == card ? 0 : position;
}
return 0;
}
SET::~SET()
{
for (int k = 0; k < card; k++)
{
printf("%d ", set[k]);
}
delete []set;
}
int main() {
SET a(3);
a.insert(2);
a.insert(8);
a.insert(7);
cout << a.remove(9) << endl;
return 0;
}
c++ 学习之 利用哈希建立一个 集合
最新推荐文章于 2024-06-30 20:23:11 发布