From 0a72d37578ccf799d6af4d7010b7f86bb7d7b69d Mon Sep 17 00:00:00 2001 From: Meng Du Date: Wed, 21 Dec 2022 18:57:28 +0800 Subject: [PATCH 1/2] create c folder and finished array --- codes/c/chapter_array_and_linkedlist/array.c | 124 +++++++++++++++++++ codes/c/include/PrintUtil.h | 30 +++++ codes/c/include/include.h | 11 ++ 3 files changed, 165 insertions(+) create mode 100644 codes/c/chapter_array_and_linkedlist/array.c create mode 100644 codes/c/include/PrintUtil.h create mode 100644 codes/c/include/include.h diff --git a/codes/c/chapter_array_and_linkedlist/array.c b/codes/c/chapter_array_and_linkedlist/array.c new file mode 100644 index 000000000..6217a566f --- /dev/null +++ b/codes/c/chapter_array_and_linkedlist/array.c @@ -0,0 +1,124 @@ +/* + * File: array.c + * Created Time: 2022-12-20 + * Author: MolDuM (moldum@163.com) + */ + +#include "../include/include.h" + +/* 随机返回一个数组元素 */ +int randomAccess(int* nums, int size) { + // 在区间 [0, size) 中随机抽取一个数字 + int randomIndex = rand() % size; + // 获取并返回随机元素 + int randomNum = nums[randomIndex]; + return randomNum; +} + +/* 扩展数组长度 */ +int* extend(int* nums, int size, int enlarge) { + // 初始化一个扩展长度后的数组 + int* res = (int *)malloc(sizeof(int) * (size + enlarge)); + // 将原数组中的所有元素复制到新数组 + for (int i = 0; i < size; i++) { + res[i] = nums[i]; + } + // 初始化扩展后的空间 + for (int i = size; i < size + enlarge; i++) { + res[i] = 0; + } + // 返回扩展后的新数组 + return res; +} + +/* 在数组的索引 index 处插入元素 num */ +void insert(int* nums, int size, int num, int index) { + // 把索引 index 以及之后的所有元素向后移动一位 + for (int i = size - 1; i > index; i--) { + nums[i] = nums[i - 1]; + } + // 将 num 赋给 index 处元素 + nums[index] = num; +} + +/* 删除索引 index 处元素 */ +void removeItem(int* nums, int size, int index) { + // 把索引 index 之后的所有元素向前移动一位 + for (int i = index; i < size - 1; i++) { + nums[i] = nums[i + 1]; + } +} + +/* 遍历数组 */ +void traverse(int* nums, int size) { + int count = 0; + // 通过索引遍历数组 + for (int i = 0; i < size; i++) { + count++; + } +} + +/* 在数组中查找指定元素 */ +int find(int* nums, int size, int target) { + for (int i = 0; i < size; i++) { + if (nums[i] == target) + return i; + } + return -1; +} + + +/* Driver Code */ +int main() { + /* 初始化数组 */ + int size = 5; + int arr[5]; + printf("数组 arr = "); + printArray(arr, size); + + int arr2[5] = { 1, 3, 2, 5, 4 }; + printf("数组 arr2 = "); + printArray(arr2, size); + + int* nums = (int *)malloc(sizeof(int) * size); + nums[0] = 1; + nums[1] = 3; + nums[2] = 2; + nums[3] = 5; + nums[4] = 4; + printf("数组 nums = "); + printArray(nums, size); + + /* 随机访问 */ + int randomNum = randomAccess(nums, size); + printf("在 nums 中获取随机元素 %d", randomNum); + + /* 长度扩展 */ + int enlarge = 3; + int* res = extend(nums, size, enlarge); + int* temp = nums; + nums = res; + free(temp); + size += enlarge; + printf("将数组长度扩展至 8 ,得到 nums = "); + printArray(nums, size); + + /* 插入元素 */ + insert(nums, size, 6, 3); + printf("在索引 3 处插入数字 6 ,得到 nums = "); + printArray(nums, size); + + /* 删除元素 */ + removeItem(nums, size, 2); + printf("删除索引 2 处的元素,得到 nums = "); + printArray(nums, size); + + /* 遍历数组 */ + traverse(nums, size); + + /* 查找元素 */ + int index = find(nums, size, 3); + printf("在 nums 中查找元素 3 ,得到索引 = %d\n", index); + + return 0; +} diff --git a/codes/c/include/PrintUtil.h b/codes/c/include/PrintUtil.h new file mode 100644 index 000000000..e471f0388 --- /dev/null +++ b/codes/c/include/PrintUtil.h @@ -0,0 +1,30 @@ +/* + * File: PrintUtil.h + * Created Time: 2022-12-21 + * Author: MolDum (moldum@163.com) + */ + +#include +#include +#include + +// #include "ListNode.h" +// #include "TreeNode.h" + +/** + * @brief Print an Array + * + * @param arr + * @param n + */ + +static void printArray(int* arr, int n) +{ + printf("["); + for (int i = 0; i < n - 1; i++) { + printf("%d, ", arr[i]); + } + printf("%d]\n", arr[n-1]); +} + + diff --git a/codes/c/include/include.h b/codes/c/include/include.h new file mode 100644 index 000000000..aba6b4924 --- /dev/null +++ b/codes/c/include/include.h @@ -0,0 +1,11 @@ +/* + * File: include.h + * Created Time: 2022-12-20 + * Author: MolDuM (moldum@163.com) + */ + +#include +#include +#include + +#include "PrintUtil.h" \ No newline at end of file From e0a3189f91c2af5c0d82d413ddd5c272594951a2 Mon Sep 17 00:00:00 2001 From: MolDuM <39506381+MolDuM@users.noreply.github.com> Date: Wed, 4 Jan 2023 14:56:16 +0800 Subject: [PATCH 2/2] Update array.c 3 changes: 1. In the enlarge part, I didn't change because I didn't find a good way to deal with the local variable and the clear definition. malloc is commonly used in LeetCode so I think it is not bad for a beginner. 2. I changed the initialization of the second array to make it in the same style as C++. 3. In the enlarge part in main, I deleted the code of pointer free to match the array operations. I also changed the operate array in the later part because the enlarged array cannot be assigned to the older array name. BTW, sorry for updating so late. Reading different version documents and book are really tiring and boring. --- codes/c/chapter_array_and_linkedlist/array.c | 30 ++++++-------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/codes/c/chapter_array_and_linkedlist/array.c b/codes/c/chapter_array_and_linkedlist/array.c index 6217a566f..300124a70 100644 --- a/codes/c/chapter_array_and_linkedlist/array.c +++ b/codes/c/chapter_array_and_linkedlist/array.c @@ -76,16 +76,7 @@ int main() { printf("数组 arr = "); printArray(arr, size); - int arr2[5] = { 1, 3, 2, 5, 4 }; - printf("数组 arr2 = "); - printArray(arr2, size); - - int* nums = (int *)malloc(sizeof(int) * size); - nums[0] = 1; - nums[1] = 3; - nums[2] = 2; - nums[3] = 5; - nums[4] = 4; + int nums[5] = { 1, 3, 2, 5, 4 }; printf("数组 nums = "); printArray(nums, size); @@ -96,29 +87,26 @@ int main() { /* 长度扩展 */ int enlarge = 3; int* res = extend(nums, size, enlarge); - int* temp = nums; - nums = res; - free(temp); size += enlarge; printf("将数组长度扩展至 8 ,得到 nums = "); - printArray(nums, size); + printArray(res, size); /* 插入元素 */ - insert(nums, size, 6, 3); + insert(res, size, 6, 3); printf("在索引 3 处插入数字 6 ,得到 nums = "); - printArray(nums, size); + printArray(res, size); /* 删除元素 */ - removeItem(nums, size, 2); + removeItem(res, size, 2); printf("删除索引 2 处的元素,得到 nums = "); - printArray(nums, size); + printArray(res, size); /* 遍历数组 */ - traverse(nums, size); + traverse(res, size); /* 查找元素 */ - int index = find(nums, size, 3); - printf("在 nums 中查找元素 3 ,得到索引 = %d\n", index); + int index = find(res, size, 3); + printf("在 res 中查找元素 3 ,得到索引 = %d\n", index); return 0; }