From 9a682a0ca0935f19b2725754682862889e621511 Mon Sep 17 00:00:00 2001 From: sherlook Date: Thu, 27 Jul 2023 23:47:59 -0700 Subject: [PATCH] add test_hash --- APP_Framework/Applications/app_test/Kconfig | 6 +- APP_Framework/Applications/app_test/Makefile | 4 + .../Applications/app_test/test_hash/README.md | 2 + .../app_test/test_hash/TestHash执行结果.png | Bin 0 -> 1854394 bytes .../app_test/test_hash/test_hash.c | 132 ++++++++++++++++++ .../app_test/test_hash/test_hash.h | 51 +++++++ 6 files changed, 194 insertions(+), 1 deletion(-) create mode 100644 APP_Framework/Applications/app_test/test_hash/README.md create mode 100644 APP_Framework/Applications/app_test/test_hash/TestHash执行结果.png create mode 100644 APP_Framework/Applications/app_test/test_hash/test_hash.c create mode 100644 APP_Framework/Applications/app_test/test_hash/test_hash.h diff --git a/APP_Framework/Applications/app_test/Kconfig b/APP_Framework/Applications/app_test/Kconfig index 3a103a6b3..1c24508f7 100644 --- a/APP_Framework/Applications/app_test/Kconfig +++ b/APP_Framework/Applications/app_test/Kconfig @@ -239,6 +239,10 @@ menu "test app" menuconfig USER_TEST_TIMER bool "Config test soft timer" default n - + + menuconfig USER_TEST_HASH + bool "Config test hash" + default n + endif endmenu diff --git a/APP_Framework/Applications/app_test/Makefile b/APP_Framework/Applications/app_test/Makefile index 200e9e02a..3c0bbb5a6 100644 --- a/APP_Framework/Applications/app_test/Makefile +++ b/APP_Framework/Applications/app_test/Makefile @@ -101,5 +101,9 @@ ifeq ($(CONFIG_ADD_XIZI_FEATURES),y) SRC_FILES += test_timer.c endif + ifeq ($(CONFIG_USER_TEST_HASH),y) + SRC_FILES += test_hash/test_hash.c + endif + include $(KERNEL_ROOT)/compiler.mk endif diff --git a/APP_Framework/Applications/app_test/test_hash/README.md b/APP_Framework/Applications/app_test/test_hash/README.md new file mode 100644 index 000000000..1fc5546d2 --- /dev/null +++ b/APP_Framework/Applications/app_test/test_hash/README.md @@ -0,0 +1,2 @@ +### 截图和测试流程记录 +![](TestHash执行结果.png) \ No newline at end of file diff --git a/APP_Framework/Applications/app_test/test_hash/TestHash执行结果.png b/APP_Framework/Applications/app_test/test_hash/TestHash执行结果.png new file mode 100644 index 0000000000000000000000000000000000000000..a9f503674c2e460c287615cf7f72449cc27aac1a GIT binary patch literal 1854394 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 G#s3c~;jk_M literal 0 HcmV?d00001 diff --git a/APP_Framework/Applications/app_test/test_hash/test_hash.c b/APP_Framework/Applications/app_test/test_hash/test_hash.c new file mode 100644 index 000000000..42d163c3f --- /dev/null +++ b/APP_Framework/Applications/app_test/test_hash/test_hash.c @@ -0,0 +1,132 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + + +/** +* @file: test_hash.c +* @brief: a application of hash function +* @version: 1.1 +* @author: SHU +* @date: 2023/7/26 +*/ + +#include "test_hash.h" +#include +#include +#include +#include +#ifdef ADD_XIZI_FEATURES + + +HashNode* [HASH_TABLE_MAX_SIZE]; // 初始化哈希表 + +void TestHash(void) { + // 这是一个测试哈希表的函数,其实现对应的功能 + // 实现哈希表的初始化,插入,删除和查找等功能 + InitHashTable(); + + // 插入测试样例 + for (int i = 0; i < 20; i++) { + InsertNode(i, i * 10); + } + + // 查找测试样例 + for (int i = 0; i < 20; i++) { + HashNode* node = FindNode(i); + if (node != NULL) { + printf("Find node key = %d, value = %d\n", node->key, node->value); + } + } + + // 删除测试样例 + for (int i = 0; i < 10; i++) { + DeleteNode(i); + } + + // 再次查找测试样例,其中部分已被删除 + for (int i = 0; i < 20; i++) { + HashNode* node = FindNode(i); + if (node != NULL) { + printf("Find node key = %d, value = %d\n", node->key, node->value); + } else { + printf("Node with key = %d not found\n", i); + } + } + return; +} + + +// 初始化哈希表 +void InitHashTable() { + + for (int i = 0; i < HASH_TABLE_MAX_SIZE; ++i) { + hashTable[i] = NULL; + } +} + +// 计算哈希值 +int HashFunc(int key) { + return key % HASH_TABLE_MAX_SIZE; +} + +// 插入节点 +void InsertNode(int key, int value) { + HashNode* node = malloc(sizeof(HashNode)); + node->key = key; + node->value = value; + node->next = NULL; + + int hashey = HashFunc(key); + if (hashTable[hashkey] == NULL) { + hashTable[hashkey] = node; + } else { + node->next = hashTable[hashkey]; + hashTable[hashkey] = node; + } +} + +// 删除节点 +void DeleteNode(int key) { + int hashkey = HashFunc(key); + HashNode* node = hashTable[hashkey]; + HashNode* pre = NULL; + while (node != NULL) { + if (node->key == key) { + if (pre == NULL) { + hashTable[hashkey] = node->next; + } else { + pre->next = node->next; + } + free(node); + return; + } + pre = node; + node = node->next; + } +} + +// 查找节点 +HashNode* FindNode(int key) { + int hashkey = HashFunc(key); + HashNode* node = hashTable[hashkey]; + while (node != NULL) { + if (node->key == key) { + return node; + } + node = node->next; + } + return NULL; +} + +PRIV_SHELL_CMD_FUNCTION(TestHash, a hash test sample, PRIV_SHELL_CMD_MAIN_ATTR); + +#endif \ No newline at end of file diff --git a/APP_Framework/Applications/app_test/test_hash/test_hash.h b/APP_Framework/Applications/app_test/test_hash/test_hash.h new file mode 100644 index 000000000..6412ec3da --- /dev/null +++ b/APP_Framework/Applications/app_test/test_hash/test_hash.h @@ -0,0 +1,51 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + + +/** +* @file: test_hash.c +* @brief: a application of hash function +* @version: 1.1 +* @author: SHU +* @date: 2023/7/26 +*/ + + +#ifndef TEST_HASH_H +#define TEST_HASH_H + +#define HASH_TABLE_MAX_SIZE 1024 + +// 声明哈希节点结构体 +typedef struct HashNode_Struct HashNode; +struct HashNode_Struct { + int key; + int value; + HashNode* next; +}; + +// 初始化哈希表 +void InitHashTable(void); + +// 计算哈希值 +int HashFunc(int key); + +// 插入节点 +void InsertNode(int key, int value); + +// 删除节点 +void DeleteNode(int key); + +// 查找节点 +HashNode* FindNode(int key); + +#endif // HASH_TABLE_H