Skip to content

Commit 55f9b0a

Browse files
串的顺序存储结构部分实现
1 parent 3742238 commit 55f9b0a

File tree

3 files changed

+260
-64
lines changed

3 files changed

+260
-64
lines changed

da-hua-shu-ju-jie-gou/05-string/README.md

Lines changed: 122 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -32,24 +32,130 @@ endADT
3232
### 串的 Index 实现
3333
```c
3434
int Index(String S, String T, int pos) {
35-
int n, m, i;
35+
int lenS = StrLength(S);
36+
int lenT = StrLength(T);
37+
int i=0;
38+
if (pos<1||pos>MAXSIZE||pos>lenS || pos + lenT > lenS+1) {
39+
return ERROR;
40+
}
41+
for (i=1; i<=lenS-lenT+1; i++) {
42+
String sub;
43+
SubString(sub, S, i, lenT);
44+
if (StrCompare(sub, T) == 0) {
45+
break;
46+
}
47+
}
48+
return i;
49+
}
50+
```
51+
## 串的存储结构
52+
### 串的顺序存储结构实现
53+
```c
54+
Status StrAssign(String S, char *chars) {
55+
for (int i=1; i<MAXSIZE; i++) {
56+
S[i] = *(chars+i-1);
57+
if(S[i] == '\0') {
58+
S[0] = i-1;
59+
break;
60+
}
61+
}
62+
return OK;
63+
}
64+
Status StrCopy(String T, String S) {
65+
for(int i=0;i<=S[0]; i++) {
66+
T[i] = S[i];
67+
}
68+
return OK;
69+
}
70+
Status ClearString(String S) {
71+
for(int i=0;i<=S[0]; i++) {
72+
S[i] = 0;
73+
}
74+
S[0] = 0;
75+
return OK;
76+
}
77+
Status StringEmpty(String S) {
78+
return S[0] == 0 ? TRUE : FALSE;
79+
}
80+
int StrLength(String S) {
81+
return S[0];
82+
}
83+
int StrCompare(String S, String T) {
3684

37-
String sub;
38-
// if (pos>0) { // 暂未理解Index 的定义,若第0个字符就已重合如何处理,暂时注释
85+
int len = fmin(StrLength(S), StrLength(T));
3986

40-
n = StrLength(S);
41-
m = StrLength(T);
42-
i = pos;
43-
44-
while (i<=n-m+1) {
45-
SubString(sub, S, i, m);
46-
if (StrCompare(sub, T) != 0) {
47-
++i;
48-
} else {
49-
return i;
50-
}
87+
// 循环对比每一个字符
88+
for (int i=0; i<len; i++) {
89+
char s = S[i+1];
90+
char t = T[i+1];
91+
if (s<t) {
92+
return -1; // S<T
93+
}
94+
if (s>t) {
95+
return 1; // S>T
5196
}
52-
// }
53-
return 0;
97+
}
98+
99+
if (StrLength(S) == StrLength(T)) {
100+
return 0; // S==T
101+
} else if (StrLength(S)<StrLength(T)) {
102+
// S<T
103+
return -1;
104+
} else if (StrLength(S)>StrLength(T)) {
105+
// S>T
106+
return 1;
107+
}
108+
return OK;
109+
}
110+
Status Concat(String T, String S1, String S2) {
111+
int len1 = StrLength(S1);
112+
int len2 = StrLength(S2);
113+
if ( len1 + len2 > MAXSIZE) {
114+
return ERROR;
115+
}
116+
117+
for (int i=1; i<=len1; i++) {
118+
T[i]=S1[i];
119+
}
120+
for (int i=1; i<=len2; i++) {
121+
T[len1+i] = S2[i];
122+
}
123+
T[0] = len1+len2;
124+
return OK;
125+
}
126+
Status SubString(String Sub, String S, int pos, int len) {
127+
if (pos<1||pos>MAXSIZE||pos>StrLength(S) || pos + len > StrLength(S)+1) {
128+
return ERROR;
129+
}
130+
for (int i=1; i<=len; i++) {
131+
Sub[i] = S[pos+i-1];
132+
}
133+
Sub[0] = len;
134+
return OK;
135+
}
136+
int Index(String S, String T, int pos) {
137+
int lenS = StrLength(S);
138+
int lenT = StrLength(T);
139+
int i=0;
140+
if (pos<1||pos>MAXSIZE||pos>lenS || pos + lenT > lenS+1) {
141+
return ERROR;
142+
}
143+
for (i=1; i<=lenS-lenT+1; i++) {
144+
String sub;
145+
SubString(sub, S, i, lenT);
146+
if (StrCompare(sub, T) == 0) {
147+
break;
148+
}
149+
}
150+
return i;
151+
}
152+
Status Replace(String S, String T, String V) {
153+
return OK;
154+
}
155+
Status StrInsert(String S, int pos, String T) {
156+
return OK;
157+
}
158+
Status StrDelete(String S, int pos, int len) {
159+
return OK;
54160
}
55161
```

da-hua-shu-ju-jie-gou/05-string/string/string/String.c

Lines changed: 126 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -9,72 +9,153 @@
99
#include "String.h"
1010
#include <string.h>
1111
#include <stdlib.h>
12+
#include <math.h>
1213

1314
#pragma mark - test
1415
void StringTest(void) {
1516
printf("================ StringTest ================\n");
1617

17-
char c1[] = {'a', 'b', 'c', 'd', 'a', 'b', 'c', '\0'};
18-
char c2[] = {'c', 'd', '\0'};
18+
String s1;
19+
StrAssign(s1, "happend");
1920

20-
String s1 = c1;
21-
String s2 = c2;
21+
printf("StrLength(%s): %d\n", s1, StrLength(s1));
2222

23-
printf("s1: %s\ns2: %s\n", s1, s2);
23+
String s2;
24+
StrAssign(s2, "happy");
25+
printf("StrLength(%s): %d\n", s2, StrLength(s2));
2426

25-
int pos = Index(s1, s2, 0);
26-
printf("Index: s1: %s, s2: %s, pos: %d\n",s1, s2, pos);
27+
int result = StrCompare(s1, s2);
28+
printf("StrCompare(%s, %s): %d\n", s1, s2, result);
2729

30+
String s3;
31+
Status status = Concat(s3, s1, s2);
32+
printf("Concat(%s, %s, %s): status: %d\n", s3, s1, s2, status);
33+
34+
String s4;
35+
status = SubString(s4, s3, 1, 7);
36+
printf("SubString(%s, %s, %d, %d): status: %d\n", s4, s3, 1, 7, status);
37+
38+
int index = Index(s3, s2, 1);
39+
printf("SubString(%s, %s, %d): index: %d\n", s3, s2, 1, index);
40+
41+
42+
// String s1 = c1;
43+
// String s2 = c2;
44+
//
45+
// printf("s1: %s\ns2: %s\n", s1, s2);
46+
//
47+
// int pos = Index(s1, s2, 0);
48+
// printf("Index: s1: %s, s2: %s, pos: %d\n",s1, s2, pos);
49+
//
2850

2951
}
3052

3153

3254
#pragma mark - functions
33-
int Index(String S, String T, int pos) {
34-
int n, m, i;
35-
36-
String sub;
37-
// if (pos>0) {
38-
39-
n = StrLength(S);
40-
m = StrLength(T);
41-
i = pos;
42-
43-
while (i<=n-m+1) {
44-
SubString(sub, S, i, m);
45-
if (StrCompare(sub, T) != 0) {
46-
++i;
47-
} else {
48-
return i;
49-
}
55+
Status StrAssign(String S, char *chars) {
56+
for (int i=1; i<MAXSIZE; i++) {
57+
S[i] = *(chars+i-1);
58+
if(S[i] == '\0') {
59+
S[0] = i-1;
60+
break;
5061
}
51-
// }
52-
return 0;
62+
}
63+
return OK;
5364
}
65+
Status StrCopy(String T, String S) {
66+
for(int i=0;i<=S[0]; i++) {
67+
T[i] = S[i];
68+
}
69+
return OK;
70+
}
71+
Status ClearString(String S) {
72+
for(int i=0;i<=S[0]; i++) {
73+
S[i] = 0;
74+
}
75+
S[0] = 0;
76+
return OK;
77+
}
78+
Status StringEmpty(String S) {
79+
return S[0] == 0 ? TRUE : FALSE;
80+
}
81+
int StrLength(String S) {
82+
return S[0];
83+
}
84+
int StrCompare(String S, String T) {
5485

55-
Status SubString(String Sub, String S, int pos, int len) {
56-
int total_length = (int)strlen(S);//首先获取srcstr的长度
57-
//判断srcstr的长度减去需要截取的substr开始位置之后,剩下的长度
58-
//是否大于指定的长度length,如果大于,就可以取长度为length的子串
59-
//否则就把从开始位置剩下的字符串全部返回。
60-
int real_length = ((total_length - pos) >= len ? len : (total_length - pos)) + 1;
86+
int len = fmin(StrLength(S), StrLength(T));
87+
88+
// 循环对比每一个字符
89+
for (int i=0; i<len; i++) {
90+
char s = S[i+1];
91+
char t = T[i+1];
92+
if (s<t) {
93+
return -1; // S<T
94+
}
95+
if (s>t) {
96+
return 1; // S>T
97+
}
98+
}
6199

62-
String tmp;
63-
if (NULL == (tmp=(char*)malloc(real_length * sizeof(char)))) {
64-
printf("Memory overflow . \n");
65-
exit(0);
100+
if (StrLength(S) == StrLength(T)) {
101+
return 0; // S==T
102+
} else if (StrLength(S)<StrLength(T)) {
103+
// S<T
104+
return -1;
105+
} else if (StrLength(S)>StrLength(T)) {
106+
// S>T
107+
return 1;
108+
}
109+
return OK;
110+
}
111+
Status Concat(String T, String S1, String S2) {
112+
int len1 = StrLength(S1);
113+
int len2 = StrLength(S2);
114+
if ( len1 + len2 > MAXSIZE) {
115+
return ERROR;
66116
}
67-
strncpy(tmp, S+pos, real_length - 1);
68-
tmp[real_length - 1] = '\0';
69117

70-
strcpy(Sub, tmp);
118+
for (int i=1; i<=len1; i++) {
119+
T[i]=S1[i];
120+
}
121+
for (int i=1; i<=len2; i++) {
122+
T[len1+i] = S2[i];
123+
}
124+
T[0] = len1+len2;
71125
return OK;
72126
}
73-
74-
int StrLength(String S) {
75-
return (int)strlen(S);
127+
Status SubString(String Sub, String S, int pos, int len) {
128+
if (pos<1||pos>MAXSIZE||pos>StrLength(S) || pos + len > StrLength(S)+1) {
129+
return ERROR;
130+
}
131+
for (int i=1; i<=len; i++) {
132+
Sub[i] = S[pos+i-1];
133+
}
134+
Sub[0] = len;
135+
return OK;
76136
}
77-
78-
int StrCompare(String S, String T) {
79-
return strcmp(S, T);
137+
int Index(String S, String T, int pos) {
138+
int lenS = StrLength(S);
139+
int lenT = StrLength(T);
140+
int i=0;
141+
if (pos<1||pos>MAXSIZE||pos>lenS || pos + lenT > lenS+1) {
142+
return ERROR;
143+
}
144+
for (i=1; i<=lenS-lenT+1; i++) {
145+
String sub;
146+
SubString(sub, S, i, lenT);
147+
if (StrCompare(sub, T) == 0) {
148+
break;
149+
}
150+
}
151+
return i;
152+
}
153+
Status Replace(String S, String T, String V) {
154+
return OK;
155+
}
156+
Status StrInsert(String S, int pos, String T) {
157+
return OK;
158+
}
159+
Status StrDelete(String S, int pos, int len) {
160+
return OK;
80161
}

da-hua-shu-ju-jie-gou/05-string/string/string/String.h

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,23 @@
3636
#define TRUE 1
3737
#define FALSE 0
3838
typedef int Status; // Status 是函数的类型,其值是函数结果状态码,如 OK 等
39+
#define MAXSIZE 100
3940

40-
typedef char * String;
41+
typedef char String[MAXSIZE+1]; // 串的顺序存储结构,第0位用于存储串的长度
4142

4243
#pragma mark - functions
43-
int Index(String S, String T, int pos);
44-
Status SubString(String Sub, String S, int pos, int len);
44+
Status StrAssign(String S, char *chars);
45+
Status StrCopy(String T, String S);
46+
Status ClearString(String S);
47+
Status StringEmpty(String S);
4548
int StrLength(String S);
4649
int StrCompare(String S, String T);
50+
Status Concat(String T, String S1, String S2);
51+
Status SubString(String Sub, String S, int pos, int len);
52+
int Index(String S, String T, int pos);
53+
Status Replace(String S, String T, String V);
54+
Status StrInsert(String S, int pos, String T);
55+
Status StrDelete(String S, int pos, int len);
4756

4857
#pragma mark - test
4958

0 commit comments

Comments
 (0)