数据结构---哈希表

版权声明:本文章刊载的内容,多数为读者作者笔记,笔记内容来自于潭州教育提供的学习资源以及读者本人阅读的文章,特此声明! 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;
    }
}

7.演示

猜你喜欢

转载自blog.csdn.net/qq_41453285/article/details/84982011