版权声明:本文章刊载的内容,多数为读者作者笔记,笔记内容来自于潭州教育提供的学习资源以及读者本人阅读的文章,特此声明! https://blog.csdn.net/qq_41453285/article/details/84982011
一、理论知识
待续
二、代码实现
1.节点结构体、哈希表结构体
typedef int ElemType;
struct MyNode//处理冲突
{
ElemType data;
MyNode* pNext;
};
struct HashTable//哈希表
{
MyNode* value[10];//结构体数组
};
2.哈希表的创建
//外部传入一个哈希表指针,在函数内部进行创建,并将头指针返回
HashTable* CreateHashTable()
{
HashTable* tempTable = new HashTable;
memset(tempTable, 0, sizeof(HashTable));//全部赋值为0
return tempTable;
}
3.向哈希表中插入数据
//插入数据时,对数据进行10取余,然后找到在指针数组中的对应下标进行插入
bool InsertDataIntoHashTable(HashTable * table, ElemType NewData)
{
if (!table)
return false;
MyNode* newNode;
if (!(newNode = table->value[NewData % 10]))
{
newNode = new MyNode;
newNode->data = NewData;
newNode->pNext = NULL;
table->value[NewData % 10] = newNode;
return true;
}
else
{
while (newNode->pNext)
{
newNode = newNode->pNext;
}
newNode->pNext = new MyNode;
newNode->pNext->data = NewData;
newNode->pNext->pNext = NULL;
return true;
}
}
4.查找数据,并将数据所在节点指针返回
MyNode * FindDataFromHashTable(HashTable * table, ElemType findData)
{
if (!table)
return nullptr;
MyNode* tempNode=table->value[findData % 10];
while (tempNode)
{
if (tempNode->data == findData)
return tempNode;
tempNode = tempNode->pNext;
}
return nullptr;
}
5.删除数据
bool DeleteDataFromHasgTable(HashTable * table, ElemType DelData)
{
if (!table)
return false;
MyNode* findNode = FindDataFromHashTable(table, DelData);
if (!findNode)
return false;
MyNode* tempNode;
if (findNode == (tempNode=table->value[DelData % 10]))
table->value[DelData % 10] = findNode->pNext;
else
{
while (tempNode->pNext != findNode)
{
tempNode = tempNode->pNext;
}
tempNode = findNode->pNext;
}
delete findNode;
findNode = nullptr;
return true;
}
6.清空哈希表
void ClearAllHashTable(HashTable * table)
{
if (!table)
{
printf("哈希表为空,无法清除!\n");
return;
}
else
{
MyNode* tempNode;
MyNode* delNode;
for (int i = 0; i < 10; ++i)
{
tempNode = table->value[i];
while (tempNode)
{
delNode = tempNode;
tempNode = tempNode->pNext;
delete delNode;
delNode = nullptr;
}
}
delete table;
table = nullptr;
}
}