结构笔记—串的基本操作及串的模式匹配算法
下面实现几种串的基本操作,这些操作是构成串其他复杂操作的基石。因为相对简单,功能和分析的说明均在代码实现中。
/*动态分配存储结构*/ typedef struct { char *ch; int length; }Str; /*赋值操作*/ int strAssign(Str &str, char *ch) { if(str.ch) free(str.ch); //释放原串空间 int len = 0; char *c = ch; while(*c) //求ch串长度 { len++; c++; } if(len == 0) //如果ch为空串,则直接返回空串 { str.ch = NULL; str.length = 0; return 1; } str.ch = (char*)malloc(sizeof(char) * (len+1)); //取len + 1是为了多分配一个空间存放“\0”字符 if(str.ch == NULL) //申请空间失败 return 0; c = ch; for(int i = 0; i <= len; i++) //注意:循环条件"<="是为了将ch最后的'\0'复制到新串中作为结束标志 str.ch[i] = *(c++); str.length = len; return 1; } /*求串长度*/ int StrLength(Str str) { return str.length; } /*串比较操作 *串的比较操作是串排序的核心操作 */ int strCompare(Str s1, Str s2) { for(int i = 0; i < s1.length && i < s2.length; i++) { if(s1.ch[i] != s2.ch[i]) return s1.ch[i] - s2.ch[i]; } return s1.length - s2.length; } /*串连接操作 *将两个串首位连接,合成一个字符串的操作称为串连接操作 */ int concat(Str &str, Str s1, Str s2) { if(str.ch) free(str.ch); str.ch = (char*)malloc(sizeof(char) * (s1.length + s2.length +1)); if(str.ch == NULL) return 0; int i = 0; while(i < s1.length) str.ch[i] = s1.ch[i++]; int j = 0; while(j <= s2.length) str.ch[i+j] = s2.ch[j++]; str.length = s1.length + s2.length; return 1; } /*求子串操作 *求从给定串中某一位置开始到某一位置结束的操作称为求子串操作(规定开始位置总是在结束位置前边) *以下代码实现求串中从pos位置开始,长度为len的子串,子串由subStr返回给用户 *函数返回:成功1,失败0 */ int subStr(Str &subStr, Str str, int pos, int len) { if(pos < 0 || len < 0|| pos + len > str.length) return 0; if(subStr.ch) free(subStr.ch); if(len == 0) { subStr.ch = NULL; subStr.length = 0; return 1; } subStr.ch = (char*)malloc(sizeof(char) * (len+1)); if(subStr.ch == NULL) return 0; int i = 0, j = pos; while(j < pos + len) subStr.ch[i++] = str.ch[j++]; subStr.ch[i] = '\0'; subStr.length = len; return 1; } /*串清空操作*/ int clearStr(Str &str) { if(str.ch) { free(str.ch); str.ch = NULL; } str.length = 0; return 1; }
串的匹配模式算法