结构笔记—串的基本操作及串的模式匹配算法

下面实现几种串的基本操作,这些操作是构成串其他复杂操作的基石。因为相对简单,功能和分析的说明均在代码实现中。

/*动态分配存储结构*/
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;
}

串的匹配模式算法

 

posted @ 2020-04-09 07:13  evenleo  阅读(624)  评论(0编辑  收藏  举报