服务器之家

服务器之家 > 正文

C数据结构中串简单实例

时间:2021-05-20 16:07     来源/作者:Colin丶

C数据结构简单实例

运行截图:

C数据结构中串简单实例

实例代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
 
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
 
#define MAXSIZE 40 /* 存储空间初始分配量 */
 
typedef int Status;     /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef char String[MAXSIZE+1]; /* 0号单元存放串的长度 */
 
/* 输出字符串T */
void StrPrint(String T)
{
    int i;
    for(i=1;i<=T[0];i++)
        printf("%c",T[i]);
    printf("\n");
}
 
/* 若S为空串,则返回TRUE,否则返回FALSE */
Status StrEmpty(String S)
{
    if(S[0]==0)
        return TRUE;
    else
        return FALSE;
}
 
/* 生成一个其值等于chars的串T */
Status StrAssign(String T,char *chars)
{
    int i;
    if(strlen(chars)>MAXSIZE)
        return ERROR;
    else
    {
        T[0]=strlen(chars);
        for(i=1;i<=T[0];i++)
            T[i]=*(chars+i-1);
        return OK;
    }
}
 
/* 返回串的元素个数 */
int StrLength(String S)
{
    return S[0];
}
 
/* 初始条件: 串S和T存在 */
/* 操作结果: 若S>T,则返回值>0;若S=T,则返回值=0;若S < T,则返回值< 0 */
int StrCompare(String S,String T)
{
    int i;
    for(i=1;i<=S[0]&&i<=T[0];++i)
        if(S[i]!=T[i])
            return S[i]-T[i];
    return S[0]-T[0];
}
 
/* 用T返回S1和S2联接而成的新串。若未截断,则返回TRUE,否则FALSE */
Status Concat(String T,String S1,String S2)
{
    int i;
    if(S1[0]+S2[0]<=MAXSIZE)
    { /* 未截断 */
        for(i=1;i<=S1[0];i++)
            T[i]=S1[i];
        for(i=1;i<=S2[0];i++)
            T[S1[0]+i]=S2[i];
        T[0]=S1[0]+S2[0];
        return TRUE;
    }
    else
    { /* 截断S2 */
        for(i=1;i<=S1[0];i++)
            T[i]=S1[i];
        for(i=1;i<=MAXSIZE-S1[0];i++)
            T[S1[0]+i]=S2[i];
        T[0]=MAXSIZE;
        return FALSE;
    }
}
 
/* 用Sub返回串S的第pos个字符起长度为len的子串。 */
Status SubString(String Sub,String S,int pos,int len)
{
    int i;
    if(pos < 1||pos>S[0]||len < 0||len>S[0]-pos+1)
        return ERROR;
    for(i=1;i<=len;i++)
        Sub[i]=S[pos+i-1];
    Sub[0]=len;
    return OK;
}
 
/* 返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0。 */
/* 其中,T非空,1≤pos≤StrLength(S)。 */
int Index(String S, String T, int pos)
{
    int i = pos;    /* i用于主串S中当前位置下标值,若pos不为1,则从pos位置开始匹配 */
    int j = 1;              /* j用于子串T中当前位置下标值 */
    while (i <= S[0] && j <= T[0]) /* 若i小于S的长度并且j小于T的长度时,循环继续 */
    {
        if (S[i] == T[j])   /* 两字母相等则继续 */
    {
            ++i;
        ++j;
    }
    else                /* 指针后退重新开始匹配 */
    {
        i = i-j+2;      /* i退回到上次匹配首位的下一位 */
        j = 1;          /* j退回到子串T的首位 */
    }
    }
    if (j > T[0])
        return i-T[0];
    else
        return 0;
}
 
/* 初始条件: 串S和T存在,1≤pos≤StrLength(S)+1 */
/* 操作结果: 在串S的第pos个字符之前插入串T。完全插入返回TRUE,部分插入返回FALSE */
Status StrInsert(String S,int pos,String T)
{
    int i;
    if(pos< 1||pos>S[0]+1)
        return ERROR;
    if(S[0]+T[0]<=MAXSIZE)
    { /* 完全插入 */
        for(i=S[0];i>=pos;i--)
            S[i+T[0]]=S[i];
        for(i=pos;i < pos+T[0];i++)
            S[i]=T[i-pos+1];
        S[0]=S[0]+T[0];
        return TRUE;
    }
    else
    { /* 部分插入 */
        for(i=MAXSIZE;i<=pos;i--)
            S[i]=S[i-T[0]];
        for(i=pos;i < pos+T[0];i++)
            S[i]=T[i-pos+1];
        S[0]=MAXSIZE;
        return FALSE;
    }
}
 
/* 初始条件: 串S存在,1≤pos≤StrLength(S)-len+1 */
/* 操作结果: 从串S中删除第pos个字符起长度为len的子串 */
Status StrDelete(String S,int pos,int len)
{
    int i;
    if(pos < 1||pos>S[0]-len+1||len < 0)
        return ERROR;
    for(i=pos+len;i<=S[0];i++)
        S[i-len]=S[i];
    S[0]-=len;
    return OK;
}
 
/* 初始条件: 串S,T和V存在,T是非空串(此函数与串的存储结构无关) */
/* 操作结果: 用V替换主串S中出现的所有与T相等的不重叠的子串 */
Status Replace(String S,String T,String V)
{
    int i=1; /* 从串S的第一个字符起查找串T */
    if(StrEmpty(T)) /* T是空串 */
        return ERROR;
    do
    {
        i=Index(S,T,i); /* 结果i为从上一个i之后找到的子串T的位置 */
        if(i) /* 串S中存在串T */
        {
            StrDelete(S,i,StrLength(T)); /* 删除该串T */
            StrInsert(S,i,V); /* 在原串T的位置插入串V */
            i+=StrLength(V); /* 在插入的串V后面继续查找串T */
        }
    }while(i);
    return OK;
}
 
int main()
{
  int i, j, opp, pos;
  char s, str;
    String t,s1,s2,sub;
    Status k;
 
  printf("\n1.StrAssign 生成串 \n2.StrLength 求串长 \n3.StrCompare 串比较 ");
  printf("\n4.Concat 串连接 \n5.SubString 求子串 \n6.Index 求子串位置");
  printf("\n7.StrInsert 子串插入 \n8.StrDelete 子串删除 \n9.Replace 子串替换");
  printf("\n0.退出 \n请选择你的操作:\n");
  while(opp != '0')
  {
    scanf("%d",&opp);
    switch(opp)
    {
    case 1:
      k=StrAssign(s1,"nowamagic.net");
      if(!k)
      {
        printf("串长超过MAXSIZE(=%d)\n",MAXSIZE);
        exit(0);
      }
      printf("串s1为:");
      StrPrint(s1);
      printf("\n");
      break;
 
    case 2:
      printf("串s1长为%d \n",StrLength(s1));
      break;
 
    case 3:
      k=StrAssign(s2,"google.com");
      if(!k)
      {
        printf("串长超过MAXSIZE(%d)\n",MAXSIZE);
        exit(0);
      }
      printf("串s2为:");
      StrPrint(s2);
      printf("\n");
 
      i=StrCompare(s1,s2);
      if(i < 0)
        s=' < ';
      else if(i==0)
        s='=';
      else
        s='>';
      printf("串s1%c串s2\n",s);
      break;
 
    case 4:
      Concat(t,s1,s2);
      StrPrint(t);
      break;
 
    case 5:
      printf("求串s1的子串,请输入子串的起始位置: ");
      scanf("%d", &i);
      printf("请输入子串的长度: ");
      scanf("%d", &j);
      printf("起始位置:%d,子串长度:%d\n", i, j);
      k=SubString(sub,s1,i,j);
      if(k)
      {
        printf("子串sub为: ");
        StrPrint(sub);
      }
      break;
 
    case 6:
      printf("主串s1为: ");
      StrPrint(s1);
      k=StrAssign(sub,"magic");
      printf("子串sub为: ");
      StrPrint(sub);
      i=Index(s1,sub,1);
      printf("s1的第%d个字母起和sub第一次匹配\n",i);
      break;
 
    case 7:
      printf("主串s1为: ");
      StrPrint(s1);
      k=StrAssign(sub,"lol");
      printf("子串sub为: ");
      StrPrint(sub);
      printf("请输入要插入的位置: ");
      scanf("%d", &pos);
      StrInsert(s1,pos,sub);
      StrPrint(s1);
      break;
 
    case 8:
      printf("从串s1的第pos个字符起,删除len个字符,请输入pos: \n");
      scanf("%d", &i);
      printf("再输入len: \n");
      scanf("%d", &j);
      StrDelete(s1,i,j);
      StrPrint(s1);
      break;
 
    case 9:
      printf("主串s1为: ");
      StrPrint(s1);
      StrAssign(t,"a");
      printf("串t为:");
      StrPrint(t);
      StrAssign(sub,"aa");
      printf("串sub为:");
      StrPrint(sub);
      printf("用串s2取代串s1中和串t相同的不重叠的串后,串s1为: ");
      Replace(s1,t,sub);
      StrPrint(s1);
      break;
 
    case 0:
      exit(0);
    }
  }
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021德云社封箱演出完整版 2021年德云社封箱演出在线看
2021德云社封箱演出完整版 2021年德云社封箱演出在线看 2021-03-15
返回顶部