From 6a74972080aafa7556d0e5eb6b2a98ed13562c4f Mon Sep 17 00:00:00 2001 From: Fleey Date: Sun, 10 Nov 2024 02:00:53 +0800 Subject: [PATCH] fix(lang: c, chapters: searching, sorting): Some serious errors (#1531) * fix: correct hash table insertion * Use a pointer to a pointer instead of a single pointer in the insert function, ensuring proper updates to the hash table * Bug fixes: This fixes issues with empty results. * fix: correct issues in radix sort * Replaced loop-based array copy with memcpy to ensure efficient memory copying in countingSortDigit * Fixed a bug in radixSort where the maximum value search loop skipped the last element * Bug fix: Ensures all elements are checked when determining the maximum value in the array * perf: improve memory management by adding explicit memory release * revert: Revert to using the old loop override array method and drop specific api's like memcpy. --- codes/c/chapter_searching/two_sum.c | 10 +++++----- codes/c/chapter_sorting/counting_sort.c | 1 + codes/c/chapter_sorting/radix_sort.c | 6 +++++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/codes/c/chapter_searching/two_sum.c b/codes/c/chapter_searching/two_sum.c index 54b410be3..953515d99 100644 --- a/codes/c/chapter_searching/two_sum.c +++ b/codes/c/chapter_searching/two_sum.c @@ -37,12 +37,12 @@ HashTable *find(HashTable *h, int key) { } /* 哈希表元素插入 */ -void insert(HashTable *h, int key, int val) { - HashTable *t = find(h, key); +void insert(HashTable **h, int key, int val) { + HashTable *t = find(*h, key); if (t == NULL) { HashTable *tmp = malloc(sizeof(HashTable)); tmp->key = key, tmp->val = val; - HASH_ADD_INT(h, key, tmp); + HASH_ADD_INT(*h, key, tmp); } else { t->val = val; } @@ -59,7 +59,7 @@ int *twoSumHashTable(int *nums, int numsSize, int target, int *returnSize) { *returnSize = 2; return res; } - insert(hashtable, nums[i], i); + insert(&hashtable, nums[i], i); } *returnSize = 0; return NULL; @@ -83,4 +83,4 @@ int main() { printArray(res, returnSize); return 0; -} +} \ No newline at end of file diff --git a/codes/c/chapter_sorting/counting_sort.c b/codes/c/chapter_sorting/counting_sort.c index f5120fcaf..aa77d1c82 100644 --- a/codes/c/chapter_sorting/counting_sort.c +++ b/codes/c/chapter_sorting/counting_sort.c @@ -65,6 +65,7 @@ void countingSort(int nums[], int size) { // 使用结果数组 res 覆盖原数组 nums memcpy(nums, res, size * sizeof(int)); // 5. 释放内存 + free(res); free(counter); } diff --git a/codes/c/chapter_sorting/radix_sort.c b/codes/c/chapter_sorting/radix_sort.c index 2a201a23e..d50f9e29d 100644 --- a/codes/c/chapter_sorting/radix_sort.c +++ b/codes/c/chapter_sorting/radix_sort.c @@ -16,6 +16,7 @@ int digit(int num, int exp) { void countingSortDigit(int nums[], int size, int exp) { // 十进制的位范围为 0~9 ,因此需要长度为 10 的桶数组 int *counter = (int *)malloc((sizeof(int) * 10)); + memset(counter, 0, sizeof(int) * 10); // 初始化为 0 以支持后续内存释放 // 统计 0~9 各数字的出现次数 for (int i = 0; i < size; i++) { // 获取 nums[i] 第 k 位,记为 d @@ -39,13 +40,16 @@ void countingSortDigit(int nums[], int size, int exp) { for (int i = 0; i < size; i++) { nums[i] = res[i]; } + // 释放内存 + free(res); + free(counter); } /* 基数排序 */ void radixSort(int nums[], int size) { // 获取数组的最大元素,用于判断最大位数 int max = INT32_MIN; - for (size_t i = 0; i < size - 1; i++) { + for (int i = 0; i < size; i++) { if (nums[i] > max) { max = nums[i]; }