Skip to content

Commit f5c3dbb

Browse files
authored
Merge pull request #5 from wangzheng0822/master
merge
2 parents 2029a4d + b9ed4f1 commit f5c3dbb

File tree

83 files changed

+5356
-54
lines changed

Some content is hidden

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

83 files changed

+5356
-54
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,7 @@
2121

2222
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
2323
hs_err_pid*
24+
25+
# editor files
26+
.vscode
27+
.*.swp

README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
11
# 数据结构和算法之美
2-
# 请点击查看:[https://time.geekbang.org/column/intro/126](https://time.geekbang.org/column/intro/126)
2+
# [https://time.geekbang.org/column/intro/126](https://time.geekbang.org/column/intro/126)
3+
4+
# Java rate limiting library/framework
5+
# https://github.com/wangzheng0822/ratelimiter4j

c-cpp/.gitignore

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# main files
2+
main.*
3+
4+
# executives
5+
a.out
6+
7+
# objective files
8+
*.o
9+
*.obj

c-cpp/05_array/Array_gp.c

Lines changed: 278 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,278 @@
1+
#include "Array.h"
2+
3+
#include <string.h>
4+
#include <stdbool.h>
5+
6+
Array* arrayCreate()
7+
{
8+
struct Array *array = NULL;
9+
array = malloc(sizeof(*array));
10+
if (NULL == array)
11+
{
12+
return NULL;
13+
}
14+
15+
array->p = NULL;
16+
17+
array->size = 0;
18+
array->typeSize = 0;
19+
array->len = 0;
20+
21+
array->dup = NULL;
22+
array->free = NULL;
23+
array->match = NULL;
24+
25+
return array;
26+
}
27+
28+
void arrayInit(Array *array, int size, int typeSize)
29+
{
30+
if (NULL == array
31+
|| typeSize <= 0
32+
|| size < 0)
33+
{
34+
return;
35+
}
36+
37+
void *p = calloc(1, size* typeSize);
38+
if (NULL == p)
39+
{
40+
return;
41+
}
42+
43+
array->p = p;
44+
array->len = 0;
45+
array->size = size;
46+
array->typeSize = typeSize;
47+
}
48+
49+
int arrayInsert(Array *array, size_t pos, void *const value)
50+
{
51+
if (NULL == array)
52+
{
53+
return -1;
54+
}
55+
56+
if (array->len >= array->size)
57+
{
58+
return -2;
59+
}
60+
61+
if (pos > array->size || pos <= 0)
62+
{
63+
return -3;
64+
}
65+
66+
char *pBegin = array->p;
67+
for (size_t i = array->len; i > pos - 1; --i)
68+
{
69+
void *pNew = pBegin + i * array->typeSize;
70+
void *pOld = pBegin + (i - 1) *array->typeSize;
71+
if (NULL != array->dup)
72+
{
73+
array->dup(pNew, pOld);
74+
}
75+
else
76+
{
77+
memcpy(pNew, pOld, array->typeSize);
78+
}
79+
}
80+
81+
void *pCopy = (void*)(pBegin + ((pos - 1) * array->typeSize));
82+
if (NULL != array->dup)
83+
{
84+
array->dup(pCopy, value);
85+
}
86+
else
87+
{
88+
memcpy(pCopy, value, array->typeSize);
89+
}
90+
++array->len;
91+
return 0;
92+
}
93+
94+
size_t arraySearchValue(Array *array, void* const value)
95+
{
96+
if (NULL == array)
97+
{
98+
return -1;
99+
}
100+
101+
char *pBegin = array->p;
102+
size_t i = 0;
103+
for (; i < array->len; ++i)
104+
{
105+
int nCmp = 0;
106+
if (NULL != array->match)
107+
{
108+
nCmp = array->match(pBegin + i * array->typeSize, value);
109+
}
110+
else
111+
{
112+
nCmp = memcmp(pBegin + i * array->typeSize, value, array->typeSize);
113+
}
114+
115+
if (nCmp == 0)
116+
{
117+
break;
118+
}
119+
}
120+
121+
return i;
122+
}
123+
124+
void* arrayIndex(Array *array, size_t index)
125+
{
126+
if (NULL == array)
127+
{
128+
return NULL;
129+
}
130+
131+
if (index > array->len
132+
|| index <= 0)
133+
{
134+
return NULL;
135+
}
136+
137+
char *pBegin = array->p;
138+
return pBegin + array->typeSize * (index - 1);
139+
}
140+
141+
int arrayModify(Array *array, size_t pos, void *const value)
142+
{
143+
if (NULL == array)
144+
{
145+
return -1;
146+
}
147+
if (pos > array->len
148+
|| pos <= 0)
149+
{
150+
return -2;
151+
}
152+
153+
char *pBegin = array->p;
154+
void *pOld = pBegin + (pos - 1) * array->typeSize;
155+
if (NULL != array->dup)
156+
{
157+
array->dup(pOld, value);
158+
}
159+
else
160+
{
161+
memcpy(pOld, value, array->typeSize);
162+
}
163+
164+
return 0;
165+
}
166+
167+
size_t arrayLen(Array *array)
168+
{
169+
if (NULL == array)
170+
{
171+
return 0;
172+
}
173+
174+
return array->len;
175+
}
176+
177+
size_t arraySize(Array *array)
178+
{
179+
if (NULL == array)
180+
{
181+
return 0;
182+
}
183+
184+
return array->size;
185+
}
186+
187+
void arrayEmpty(Array *array)
188+
{
189+
if (NULL == array)
190+
{
191+
return;
192+
}
193+
194+
free(array->p);
195+
array->p = NULL;
196+
free(array);
197+
array = NULL;
198+
}
199+
200+
void arrayDelValue(Array *array, void *value)
201+
{
202+
if (NULL == array)
203+
{
204+
return;
205+
}
206+
207+
char* pBegin = array->p;
208+
bool bCopy = false;
209+
for (size_t i = 0; i < array->len; ++i)
210+
{
211+
if (!bCopy)
212+
{
213+
int nCmp = 0;
214+
if (NULL != array->match)
215+
{
216+
nCmp = array->match(pBegin + i * array->typeSize, value);
217+
}
218+
else
219+
{
220+
nCmp = memcmp(pBegin + i * array->typeSize, value, array->typeSize);
221+
}
222+
223+
if (0 == nCmp)
224+
{
225+
bCopy = true;
226+
continue;
227+
}
228+
}
229+
else
230+
{
231+
void *pOld = pBegin + (i + 1) * array->typeSize;
232+
void *pNew = pBegin + i * array->typeSize;
233+
if (NULL != array->dup)
234+
{
235+
array->dup(pNew, pOld);
236+
}
237+
else
238+
{
239+
memcpy(pNew, pOld, array->typeSize);
240+
}
241+
}
242+
}
243+
244+
if (bCopy)
245+
{
246+
--array->len;
247+
}
248+
}
249+
250+
void arrayDelIndex(Array *array, size_t pos)
251+
{
252+
if (NULL == array)
253+
{
254+
return;
255+
}
256+
257+
if (pos > array->len || pos <= 0)
258+
{
259+
return;
260+
}
261+
262+
char* pBegin = array->p;
263+
for (size_t i = pos - 1; i < array->len - 1; ++i)
264+
{
265+
void *pOld = pBegin + (i + 1) * array->typeSize;
266+
void *pNew = pBegin + i * array->typeSize;
267+
if (NULL != array->dup)
268+
{
269+
array->dup(pNew, pOld);
270+
}
271+
else
272+
{
273+
memcpy(pNew, pOld, array->typeSize);
274+
}
275+
}
276+
277+
--array->len;
278+
}

c-cpp/05_array/Array_gp.h

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#ifndef __ARRAY_H__
2+
#define __ARRAY_H__
3+
4+
#include <stdio.h>
5+
#include <stdlib.h>
6+
7+
typedef struct Array
8+
{
9+
// p指针的空间大小
10+
size_t size;
11+
// p指针已经使用的空间大小
12+
size_t len;
13+
// 数据类型的大小
14+
size_t typeSize;
15+
// 值复制函数
16+
void(*dup)(void *ptr, void *key);
17+
// 值释放函数
18+
void(*free)(void *ptr);
19+
// 值比较函数
20+
int(*match)(void *ptr, void *key);
21+
// 存放数据的指针
22+
void *p;
23+
}Array;
24+
25+
#define arraySetDupMethod(a, m) ((a)->dup = (m))
26+
#define arraySetFreeMethod(a, m) ((a)->free = (m))
27+
#define arraySetMatchMethod(a, m) ((a)->match = (m))
28+
29+
#define arrayGetDupMethod(a) ((a)->dup)
30+
#define arrayGetFree(a) ((a)->free)
31+
#define arrayGetMatchMethod(a) ((a)->match)
32+
33+
Array* arrayCreate();
34+
void arrayInit(Array *array, int size, int typeSize);
35+
36+
int arrayInsert(Array *array, size_t pos, void *const value);
37+
size_t arraySearchValue(Array *array, void* const value);
38+
void* arrayIndex(Array *array, size_t index);
39+
int arrayModify(Array *array, size_t pos, void *const value);
40+
41+
size_t arrayLen(Array *array);
42+
size_t arraySize(Array *array);
43+
44+
void arrayEmpty(Array *array);
45+
void arrayDelValue(Array *array, void *value);
46+
void arrayDelIndex(Array *array, size_t pos);
47+
48+
#endif // !__ARRAY_H__

0 commit comments

Comments
 (0)