Fork me on GitHub

数据结构算法C语言实现(十四)--- 4.1&4.2串的类型定义、表示及实现

  一.简述

  【暂无】

  二.头文件

 1 //4_2_part1.h
 2 /**
 3 author:zhaoyu
 4 */
 5 //2016-6-10
 6 //----串的定长顺序存储表示----
 7 #include "head.h"
 8 #define MAXSTRLEN 255//用户可以在255以内定义最大串长
 9 //这语法还不是很熟悉
10 typedef unsigned char SString[MAXSTRLEN+1];//0 号单元存放串的长度
11 int StrLength(SString T)
12 {
13     for (int i = 1; i <= MAXSTRLEN; ++i)
14     {
15         if ('\0' == T[i])
16         {
17             return i-1;
18         }
19     }
20     return MAXSTRLEN;
21 }
22 
23 /**
24 algorithm 4.2
25 */
26 Status Concat(SString &T, SString S1, SString S2)
27 {
28     //用 T 返回由 S1 和 S2 连接而成的新串。
29     //若未截断,则返回 TRUE,否则返回 FALSE
30     Status uncut;
31     if (S1[0] + S2[0] < MAXSTRLEN)
32     {//未截断
33         int i = 1;
34         for (i = 1; i <= S1[0]; ++i)
35         {
36             T[i] = S1[i];
37         }
38         for (i = 1; i <= S2[0]; ++i)
39         {
40             T[S1[0]+i] = S2[i];
41         }
42         T[0] = S1[0] + S2[0];
43         uncut = TRUE;
44     }
45     else if (S1[0] < MAXSTRLEN)
46     {
47         int i = 1;
48         for (i = 1; i <= S1[0]; i++)
49         {
50             T[i] = S1[i];
51         }
52         for (i = S1[0]+1; i <= MAXSTRLEN; i++)
53         {
54             T[i] = S2[i-S1[0]];
55         }
56         T[0] = MAXSTRLEN;
57         uncut = FALSE;
58     }
59     else
60     {
61         for (int i = 1; i <= MAXSTRLEN; i++)
62         {
63             T[i] = S1[i];
64         }
65         T[0] = S1[0] = MAXSTRLEN;
66         uncut = FALSE;
67     }
68     return uncut;
69 }
70 /**
71 algorithm 4.3
72 */
73 Status SubString(SString &Sub, SString S, int pos, int len)
74 {
75     //用 Sub 返回串 S 的第 pos 个字符起长度为 len 的字串
76     //其中, 1<= pos <<= SreLength(S) 且 0 <= len <= StrLength(S)-pos+1
77     if (pos < 1 || pos > S[0] || len < 0 || len > S[0]-pos+1)
78     {
79         return ERROR;
80     }
81     for (int i = 1; i <= len; i++)
82     {
83         Sub[i] = S[i+pos-1];
84     }
85     Sub[0] = len;
86     return OK;
87 }
88 void PrintSString(SString T)
89 {
90     //if(T[])
91     for (int i = 1; i <= T[0]; ++i)
92     {
93         printf("%c", *(T+i));
94     }
95     printf("\n");
96 }
97 
98 4_2_part1.h
4_2_part1.h
  1 //4_2_part2.h
  2 /**
  3 author:zhaoyu
  4 */
  5 //2016-6-12
  6 #include "head.h"
  7 #include <cstdlib>
  8 #include <cstring>
  9 //----串的对分配存储表示----
 10 typedef struct {
 11     char *ch;//
 12     int length;    
 13 }HString;
 14 
 15 Status StrInsert(HString &S, int pos, HString T)
 16 {//1<= pos <= StrLength(S)+1
 17 //在串的第 pos 个字符之前插入串 T
 18     if (1 < pos || pos > S.length + 1)
 19     {
 20         printf("Illegal pos\n");
 21         return ERROR;
 22     }
 23     if (T.length){//T 非空,则重新分配空间,插入 T
 24         if (!(S.ch = (char *)realloc(S.ch, (S.length +
 25          T.length)*sizeof(char))));
 26         {
 27             exit(OVERFLOW);
 28         }
 29         for (int i = S.length-1; i >= pos-1; i--)
 30         {//为插入 T 为腾出位置
 31             S.ch[i+T.length] = S.ch[i];
 32         }
 33         for (int i = pos-1; i <= pos+T.length-2; i++)
 34         {//插入 T
 35             S.ch[i] = T.ch[i];
 36         }
 37         S.length += T.length;    
 38     }
 39     return OK;
 40 }
 41 //page 76-77
 42 //----基本操作的算法描述----
 43 Status StrAssign(HString &T, char *chars)
 44 {//生成一个其值等于串常量 chars的串 T
 45     if (T.ch)
 46     {
 47         T.ch = NULL;
 48     }
 49     int L;
 50     char *c;;
 51     for (L = 0, c = chars; *c!='\0'; ++L, ++c);//求 chars 的长度 L
 52     if(!L)
 53     {
 54         T.ch = NULL;
 55         T.length = 0;
 56     }
 57     else
 58     {
 59         if (!(T.ch = (char *)malloc(L*sizeof(char))))
 60         {
 61             exit(OVERFLOW);
 62         }
 63         for (int i = 0; i < L; ++i)
 64         {
 65             T.ch[i] = chars[i];
 66         }
 67         T.length = L;
 68     }
 69     return OK;
 70 }
 71 int StrLength(HString S)
 72 {//返回 S 的元素个数, 称为串的长度
 73     return S.length;
 74 }
 75 int StrCompare(HString S, HString T)
 76 {//若 S >|=|< T,则返回 >|=|< 0
 77     for (int i = 0; i < S.length && i < T.length; i++)
 78     {
 79         if (T.ch[i] != S.ch[i])
 80         {
 81             return S.ch[i] - T.ch[i];
 82         }
 83     }
 84     return S.length - T.length;
 85 }
 86 Status ClearString(HString &S)
 87 {
 88     //将 S 清空为空串
 89     if (S.ch)
 90     {
 91         free(S.ch);
 92         S.ch = NULL;
 93     }
 94     S.length = 0;
 95     return OK;
 96 }
 97 Status Concat(HString &T, HString S1, HString S2)
 98 {
 99     if (T.ch)
100     {//释放旧空间
101         free(T.ch);
102     }
103     if (!(T.ch = (char *)malloc((S1.length+S2.length)*sizeof(char))))
104     {
105         exit(OVERFLOW);
106     }
107     for (int i = 0; i < S1.length; ++i)
108     {
109         T.ch[i] = S1.ch[i];
110     }
111     for (int i = 0; i < S2.length; ++i)
112     {
113         T.ch[i+S1.length] = S2.ch[i];
114     }
115     T.length = S1.length + S2.length;
116     return OK;
117 }
118 Status SubString(HString &Sub, HString S, int pos, int len)
119 {
120     //用 Sub 返回串 S 的第 pos 个字符起长度为 len 的子串
121     //其中,其中, 1<= pos <<= SreLength(S) 且 0 <= len <= StrLength(S)-pos+1
122     if (pos < 1 || pos > S.length || len < 0 || len > S.length-pos+1)
123     {
124         return ERROR;
125     }
126     if (Sub.ch)
127     {
128         free(Sub.ch);
129     }
130     if (!len)
131     {//空子串
132         Sub.ch = NULL;
133         Sub.length = 0;
134     }
135     else
136     {
137         Sub.ch = (char *)malloc(len*sizeof(char));
138         for (int i = 0; i < len; ++i)
139         {
140             Sub.ch[i] = S.ch[pos+i-1];
141         }
142         Sub.length = len;
143     }
144     return OK;
145 }
146 void PrintHString(HString S)
147 {
148     for (int i = 0; i < S.length; ++i)
149     {
150         printf("%c", S.ch[i]);
151     }
152     printf("\n");
153 }
4_2_part2.h

  三.CPP文件

 1 #include "4_2_part1.h"
 2 int main(int argc, char const *argv[])
 3 {
 4     SString S1;
 5     SString S2;
 6     SString T;
 7     scanf("%s", S1+1);
 8     *S1 = StrLength(S1);
 9     scanf("%s", S2+1);
10     *S2 = StrLength(S2);
11     Concat(T, S1, S2);
12     PrintSString(T);
13     int pos = 2, len = 5;
14     SubString(T, S1, pos, len);
15     PrintSString(T); 
16     return 0;
17 }
4_2_part1.cpp
 1 #include "4_2_part2.h"
 2 int main(int argc, char const *argv[])
 3 {
 4     char S[100];
 5     HString T = {NULL, 0};
 6     HString S1 = {NULL, 0};
 7     HString S2 = {NULL, 0};
 8     scanf("%s", S);
 9     StrAssign(S1, S);
10     printf("S1:\t");
11     PrintHString(S1);
12     printf("StrLength\t%d\n", StrLength(S1));
13     scanf("%s", S);
14     StrAssign(S2, S);
15     printf("S2\t");
16     PrintHString(S2);
17     printf("StrLength\t%d\n", StrLength(S1));
18     printf("Compare S1 vs S2\t%d\n", StrCompare(S1, S2));
19     Concat(T, S1, S2);
20     printf("T = S1 + S2\t");
21     PrintHString(T);
22     SubString(S1, T, 2, 3);
23     printf("Sub :T[2]-T[4]\t");
24     PrintHString(S1);
25     return 0;
26 }
4_2_part2.cpp

  四.测试

  连接

  

  求子串

  

  比较串

  

 

posted @ 2016-06-10 16:04  赵裕(vimerzhao)  阅读(317)  评论(0编辑  收藏  举报