目錄:
- 代碼:
- 分析:
代碼:
BSTree.h
BSTree.c
二叉排序樹(Binary Sort Tree) 又稱為二叉查找樹(Binary Search Tree)
Hash.h
#ifndef _HASH_H_
#define _HASH_H_typedef void Hash;//定義哈希表類型
typedef void HashKey;//定義哈希表鍵類型
typedef void HashValue;//定義定義哈希表值類型typedef int (Hash_Compare)(HashKey*, HashKey*);//定義參數為兩個哈希表鍵類型指針返回值是整形的函數類型Hash* Hash_Create();//聲明創建哈希表函數
void Hash_Destroy(Hash* hash);//聲明銷毀哈希表函數
void Hash_Clear(Hash* hash);//聲明清空哈希表函數
int Hash_Add(Hash* hash, HashKey* key, HashValue* value, Hash_Compare* compare);//聲明添加值函數
HashValue* Hash_Remove (Hash* hash, HashKey* key, Hash_Compare* compare);//聲明移除值函數
HashValue* Hash_Get(Hash* hash, HashKey* key, Hash_Compare* compare);//聲明獲取值函數
int Hash_Count(Hash* hash);//聲明獲取數量函數#endif
Hash.c
#include <stdio.h>
#include <malloc.h>
#include "Hash.h"
#include "BSTree.h"typedef struct _tag_HashNode HashNode;//定義哈希表節點類型
struct _tag_HashNode
{BSTreeNode header;HashValue* value;
};
//定義遞歸釋放節點函數
void recursive_clear(BSTreeNode* node)
{if( node != NULL ){recursive_clear(node->left);recursive_clear(node->right);free(node);}
}Hash* Hash_Create()//定義創建哈希表函數
{return BSTree_Create();//創建一個樹
}void Hash_Destroy(Hash* hash)//定義銷毀哈希表函數
{Hash_Clear(hash);//清空哈希表BSTree_Destroy(hash);//再銷毀樹
}void Hash_Clear(Hash* hash)//定義清空哈希表函數
{//先清除釋放節點的空間。這釋放的其實是HashNode類型的空間//是在Hash_Add新建的node節點,因為轉換類型成樹的節點,但還是那塊內存開頭//所以會釋放HashNode中的Value.recursive_clear(BSTree_Root(hash));BSTree_Clear(hash);//再將樹清空重置
}
//定義添加值函數
int Hash_Add(Hash* hash, HashKey* key, HashValue* value, Hash_Compare* compare)
{int ret = 0;HashNode* node = (HashNode*)malloc(sizeof(HashNode));//新建節點if( ret = (node != NULL) )//創建成功{node->header.key = key;//將新建的鍵賦給樹點的鍵node->value = value;//將新建的值賦給哈希節點的值ret = BSTree_Insert(hash, (BSTreeNode*)node, compare);//將哈希轉換插入到樹if( !ret )//如果不成功釋放新建節點{free(node);}}return ret;
}
//定義移除值函數
HashValue* Hash_Remove(Hash* hash, HashKey* key, Hash_Compare* compare)
{HashValue* ret = NULL;HashNode* node = (HashNode*)BSTree_Delete(hash, key, compare);//從樹中刪除節點,并返回刪除節點if( node != NULL )//如果有該節點{ret = node->value;//取得節點內的值free(node);//釋放該節點}return ret;//返回值
}
//定義獲取值函數
HashValue* Hash_Get(Hash* hash, HashKey* key, Hash_Compare* compare)
{HashValue* ret = NULL;HashNode* node = (HashNode*)BSTree_Get(hash, key, compare);//從樹中獲取節點if( node != NULL )//如果有該節點{ret = node->value;//取得值}return ret;//返回值
}int Hash_Count(Hash* hash)//定義獲取數量函數
{return BSTree_Count(hash);
}
main.c
#include <stdio.h>
#include <stdlib.h>
#include "Hash.h"struct Student
{char* id;char* name;int age;
};int compare_id(HashKey* k1, HashKey* k2)//比較字符串
{return strcmp((char*)k1, (char*)k2);
}int main(int argc, char *argv[])
{Hash* hash = Hash_Create();struct Student s1 = {"9001201", "Delphi", 30};struct Student s2 = {"0xABCDE", "Java", 20};struct Student s3 = {"koabc", "C++", 40};struct Student s4 = {"!@#$%^", "C#", 10};struct Student s5 = {"Python", "Python", 10};struct Student* ps = NULL;Hash_Add(hash, s1.id, &s1, compare_id);Hash_Add(hash, s2.id, &s2, compare_id);Hash_Add(hash, s3.id, &s3, compare_id);Hash_Add(hash, s4.id, &s4, compare_id);Hash_Add(hash, s5.id, &s5, compare_id);ps = Hash_Get(hash, "koabc", compare_id);printf("ID: %s\n", ps->id);printf("Name: %s\n", ps->name);printf("Age: %d\n", ps->age);Hash_Destroy(hash);return 0;
}
分析: