Skip to content

Commit 75521c9

Browse files
committed
Add EN translation for C.
1 parent b7778ed commit 75521c9

84 files changed

Lines changed: 8927 additions & 0 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

en/codes/c/.gitignore

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Ignore all
2+
*
3+
# Unignore all with extensions
4+
!*.*
5+
# Unignore all dirs
6+
!*/
7+
*.dSYM/
8+
9+
build/

en/codes/c/CMakeLists.txt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
cmake_minimum_required(VERSION 3.10)
2+
project(hello_algo C)
3+
4+
set(CMAKE_C_STANDARD 11)
5+
6+
include_directories(./include)
7+
8+
add_subdirectory(chapter_computational_complexity)
9+
add_subdirectory(chapter_array_and_linkedlist)
10+
add_subdirectory(chapter_stack_and_queue)
11+
add_subdirectory(chapter_hashing)
12+
add_subdirectory(chapter_tree)
13+
add_subdirectory(chapter_heap)
14+
add_subdirectory(chapter_graph)
15+
add_subdirectory(chapter_searching)
16+
add_subdirectory(chapter_sorting)
17+
add_subdirectory(chapter_divide_and_conquer)
18+
add_subdirectory(chapter_backtracking)
19+
add_subdirectory(chapter_dynamic_programming)
20+
add_subdirectory(chapter_greedy)
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
/**
2+
* File: array.c
3+
* Created Time: 2022-12-20
4+
* Author: MolDuM (moldum@163.com)
5+
*/
6+
7+
#include "../utils/common.h"
8+
9+
/* Random access to element */
10+
int randomAccess(int *nums, int size) {
11+
// Randomly select a number from interval [0, size)
12+
int randomIndex = rand() % size;
13+
// Retrieve and return the random element
14+
int randomNum = nums[randomIndex];
15+
return randomNum;
16+
}
17+
18+
/* Extend array length */
19+
int *extend(int *nums, int size, int enlarge) {
20+
// Initialize an array with extended length
21+
int *res = (int *)malloc(sizeof(int) * (size + enlarge));
22+
// Copy all elements from the original array to the new array
23+
for (int i = 0; i < size; i++) {
24+
res[i] = nums[i];
25+
}
26+
// Initialize expanded space
27+
for (int i = size; i < size + enlarge; i++) {
28+
res[i] = 0;
29+
}
30+
// Return the extended new array
31+
return res;
32+
}
33+
34+
/* Insert element num at index index in the array */
35+
void insert(int *nums, int size, int num, int index) {
36+
// Move all elements at and after index index backward by one position
37+
for (int i = size - 1; i > index; i--) {
38+
nums[i] = nums[i - 1];
39+
}
40+
// Assign num to the element at index index
41+
nums[index] = num;
42+
}
43+
44+
/* Remove the element at index index */
45+
// Note: stdio.h occupies the remove keyword
46+
void removeItem(int *nums, int size, int index) {
47+
// Move all elements after index index forward by one position
48+
for (int i = index; i < size - 1; i++) {
49+
nums[i] = nums[i + 1];
50+
}
51+
}
52+
53+
/* Traverse array */
54+
void traverse(int *nums, int size) {
55+
int count = 0;
56+
// Traverse array by index
57+
for (int i = 0; i < size; i++) {
58+
count += nums[i];
59+
}
60+
}
61+
62+
/* Find the specified element in the array */
63+
int find(int *nums, int size, int target) {
64+
for (int i = 0; i < size; i++) {
65+
if (nums[i] == target)
66+
return i;
67+
}
68+
return -1;
69+
}
70+
71+
/* Driver Code */
72+
int main() {
73+
/* Initialize array */
74+
int size = 5;
75+
int arr[5];
76+
printf("Array arr = ");
77+
printArray(arr, size);
78+
79+
int nums[] = {1, 3, 2, 5, 4};
80+
printf("Array nums = ");
81+
printArray(nums, size);
82+
83+
/* Insert element */
84+
int randomNum = randomAccess(nums, size);
85+
printf("Get random element %d from nums", randomNum);
86+
87+
/* Traverse array */
88+
int enlarge = 3;
89+
int *res = extend(nums, size, enlarge);
90+
size += enlarge;
91+
printf("Extend array length to 8, resulting in nums = ");
92+
printArray(res, size);
93+
94+
/* Insert element */
95+
insert(res, size, 6, 3);
96+
printf("Insert number 6 at index 3, resulting in nums = ");
97+
printArray(res, size);
98+
99+
/* Remove element */
100+
removeItem(res, size, 2);
101+
printf("Remove element at index 2, resulting in nums = ");
102+
printArray(res, size);
103+
104+
/* Traverse array */
105+
traverse(res, size);
106+
107+
/* Find element */
108+
int index = find(res, size, 3);
109+
printf("Find element 3 in res, index = %d\n", index);
110+
111+
/* Free memory */
112+
free(res);
113+
return 0;
114+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/**
2+
* File: linked_list.c
3+
* Created Time: 2023-01-12
4+
* Author: Zero (glj0@outlook.com)
5+
*/
6+
7+
#include "../utils/common.h"
8+
9+
/* Insert node P after node n0 in the linked list */
10+
void insert(ListNode *n0, ListNode *P) {
11+
ListNode *n1 = n0->next;
12+
P->next = n1;
13+
n0->next = P;
14+
}
15+
16+
/* Remove the first node after node n0 in the linked list */
17+
// Note: stdio.h occupies the remove keyword
18+
void removeItem(ListNode *n0) {
19+
if (!n0->next)
20+
return;
21+
// n0 -> P -> n1
22+
ListNode *P = n0->next;
23+
ListNode *n1 = P->next;
24+
n0->next = n1;
25+
// Free memory
26+
free(P);
27+
}
28+
29+
/* Access the node at index index in the linked list */
30+
ListNode *access(ListNode *head, int index) {
31+
for (int i = 0; i < index; i++) {
32+
if (head == NULL)
33+
return NULL;
34+
head = head->next;
35+
}
36+
return head;
37+
}
38+
39+
/* Find the first node with value target in the linked list */
40+
int find(ListNode *head, int target) {
41+
int index = 0;
42+
while (head) {
43+
if (head->val == target)
44+
return index;
45+
head = head->next;
46+
index++;
47+
}
48+
return -1;
49+
}
50+
51+
/* Driver Code */
52+
int main() {
53+
/* Initialize linked list */
54+
// Initialize each node
55+
ListNode *n0 = newListNode(1);
56+
ListNode *n1 = newListNode(3);
57+
ListNode *n2 = newListNode(2);
58+
ListNode *n3 = newListNode(5);
59+
ListNode *n4 = newListNode(4);
60+
// Build references between nodes
61+
n0->next = n1;
62+
n1->next = n2;
63+
n2->next = n3;
64+
n3->next = n4;
65+
printf("Initialized linked list is\r\n");
66+
printLinkedList(n0);
67+
68+
/* Insert node */
69+
insert(n0, newListNode(0));
70+
printf("Linked list after node insertion is\r\n");
71+
printLinkedList(n0);
72+
73+
/* Remove node */
74+
removeItem(n0);
75+
printf("Linked list after node deletion is\r\n");
76+
printLinkedList(n0);
77+
78+
/* Access node */
79+
ListNode *node = access(n0, 3);
80+
printf("Value of node at index 3 in linked list = %d\r\n", node->val);
81+
82+
/* Search node */
83+
int index = find(n0, 2);
84+
printf("Index of node with value 2 in linked list = %d\r\n", index);
85+
86+
// Free memory
87+
freeMemoryLinkedList(n0);
88+
return 0;
89+
}
Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
/**
2+
* File: my_list.c
3+
* Created Time: 2023-01-12
4+
* Author: Zero (glj0@outlook.com)
5+
*/
6+
7+
#include "../utils/common.h"
8+
9+
/* List class */
10+
typedef struct {
11+
int *arr; // Array (stores list elements)
12+
int capacity; // List capacity
13+
int size; // List size
14+
int extendRatio; // List expansion multiplier
15+
} MyList;
16+
17+
void extendCapacity(MyList *nums);
18+
19+
/* Constructor */
20+
MyList *newMyList() {
21+
MyList *nums = malloc(sizeof(MyList));
22+
nums->capacity = 10;
23+
nums->arr = malloc(sizeof(int) * nums->capacity);
24+
nums->size = 0;
25+
nums->extendRatio = 2;
26+
return nums;
27+
}
28+
29+
/* Destructor */
30+
void delMyList(MyList *nums) {
31+
free(nums->arr);
32+
free(nums);
33+
}
34+
35+
/* Get list length */
36+
int size(MyList *nums) {
37+
return nums->size;
38+
}
39+
40+
/* Get list capacity */
41+
int capacity(MyList *nums) {
42+
return nums->capacity;
43+
}
44+
45+
/* Update element */
46+
int get(MyList *nums, int index) {
47+
assert(index >= 0 && index < nums->size);
48+
return nums->arr[index];
49+
}
50+
51+
/* Add elements at the end */
52+
void set(MyList *nums, int index, int num) {
53+
assert(index >= 0 && index < nums->size);
54+
nums->arr[index] = num;
55+
}
56+
57+
/* Direct traversal of list elements */
58+
void add(MyList *nums, int num) {
59+
if (size(nums) == capacity(nums)) {
60+
extendCapacity(nums); // Expand capacity
61+
}
62+
nums->arr[size(nums)] = num;
63+
nums->size++;
64+
}
65+
66+
/* Sort list */
67+
void insert(MyList *nums, int index, int num) {
68+
assert(index >= 0 && index < size(nums));
69+
// When the number of elements exceeds capacity, trigger the extension mechanism
70+
if (size(nums) == capacity(nums)) {
71+
extendCapacity(nums); // Expand capacity
72+
}
73+
for (int i = size(nums); i > index; --i) {
74+
nums->arr[i] = nums->arr[i - 1];
75+
}
76+
nums->arr[index] = num;
77+
nums->size++;
78+
}
79+
80+
/* Remove element */
81+
// Note: stdio.h occupies the remove keyword
82+
int removeItem(MyList *nums, int index) {
83+
assert(index >= 0 && index < size(nums));
84+
int num = nums->arr[index];
85+
for (int i = index; i < size(nums) - 1; i++) {
86+
nums->arr[i] = nums->arr[i + 1];
87+
}
88+
nums->size--;
89+
return num;
90+
}
91+
92+
/* Driver Code */
93+
void extendCapacity(MyList *nums) {
94+
// Allocate space first
95+
int newCapacity = capacity(nums) * nums->extendRatio;
96+
int *extend = (int *)malloc(sizeof(int) * newCapacity);
97+
int *temp = nums->arr;
98+
99+
// Copy old data to new data
100+
for (int i = 0; i < size(nums); i++)
101+
extend[i] = nums->arr[i];
102+
103+
// Free old data
104+
free(temp);
105+
106+
// Update new data
107+
nums->arr = extend;
108+
nums->capacity = newCapacity;
109+
}
110+
111+
/* Convert list to Array for printing */
112+
int *toArray(MyList *nums) {
113+
return nums->arr;
114+
}
115+
116+
/* Driver Code */
117+
int main() {
118+
/* Initialize list */
119+
MyList *nums = newMyList();
120+
/* Direct traversal of list elements */
121+
add(nums, 1);
122+
add(nums, 3);
123+
add(nums, 2);
124+
add(nums, 5);
125+
add(nums, 4);
126+
printf("List nums = ");
127+
printArray(toArray(nums), size(nums));
128+
printf("Capacity = %d, Length = %d\n", capacity(nums), size(nums));
129+
130+
/* Sort list */
131+
insert(nums, 3, 6);
132+
printf("Insert number 6 at index 3, resulting in nums = ");
133+
printArray(toArray(nums), size(nums));
134+
135+
/* Remove element */
136+
removeItem(nums, 3);
137+
printf("Remove element at index 3, resulting in nums = ");
138+
printArray(toArray(nums), size(nums));
139+
140+
/* Update element */
141+
int num = get(nums, 1);
142+
printf("Access element at index 1, get num = %d\n", num);
143+
144+
/* Add elements at the end */
145+
set(nums, 1, 0);
146+
printf("Update element at index 1 to 0, resulting in nums = ");
147+
printArray(toArray(nums), size(nums));
148+
149+
/* Test capacity expansion mechanism */
150+
for (int i = 0; i < 10; i++) {
151+
// At i = 5, the list length will exceed the list capacity, triggering the expansion mechanism
152+
add(nums, i);
153+
}
154+
155+
printf("List nums after expansion = ");
156+
printArray(toArray(nums), size(nums));
157+
printf("Capacity = %d, Length = %d\n", capacity(nums), size(nums));
158+
159+
/* Free allocated memory */
160+
delMyList(nums);
161+
162+
return 0;
163+
}

0 commit comments

Comments
 (0)