資料結構---雜湊表
阿新 • • 發佈:2018-12-31
一、理論知識
待續
二、程式碼實現
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;
}
}