1. 程式人生 > >資料結構---雜湊表

資料結構---雜湊表

一、理論知識

待續

二、程式碼實現

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.演示