《数据结构》 定长顺序串常用操作代码集合


代码来自老师上课使用的ppt或者课本

/*定长顺序串*/
#define MAXLEN 40
typedef struct {
    char ch[MAXLEN];
    int len;
} SString
/*插入函数*/
/*在串S中下标为pos的字符之前插入串t*/
int StrInsert(SString *S, int pos, SString t) {
    int i;
    if(pos < 0 || pos > S->len) return ERROR;
    if(S->len + t.len <= MAXLEN) {    //插入后串长小于MAXLEN,正常插入
        for (i = S->len - 1; i >= pos; i--) {
            S->ch[i + t.len] = S->ch[i];
        }   //从后向前后移元素,从下标S->len-1到pos结束,为t腾出位置
        for (i = 0; i < t.len; i++) {
            S->ch[pos + i] = t.ch[i];    //插入t
        }
        S->len = S->len + t.len;
    }
    else if(pos + t.len <= MAXLEN) {    //插入后串长大于MAXLEN,S部分被舍弃
        for(i = MAXLEN - t.len -1; i >= pos; i-- ) {
            S->ch[i + t.len] = S->ch[i];
        }   //从后向前右移元素,被舍去的元素不移动
        for(i = 0; i < t; i++) {
            S->[pos + i] = t.ch[i];
        }
        S->len = MAXLEN;
    }
    else {      //插入后串长大于MAXLEN,S移动的元素全部被舍弃,t部分被舍弃
        for(i = 0; i < MAXLEN - pos; i++) {
            S->ch[pos + i] = t.ch[i];
        }
        S->len = MAXLEN;
    }
    return OK;
}
/*删除函数*/
/*在串S中删除从下标pos起len个字符*/
/*S->len-1表示最后一个下标,S->len-1-pos表示从最后一个下标到下标pos间的元素个数*/
int StrDelete(SString *S, int pos, int len) {
    int i;
    if(pos < 0 || len < 1 || pos > (S->len - len)) {
        return ERROR;    //从pos起最多删除S->len-1-pos+1 个字符
    }
    for(i = pos +len; i < len; i++) {
        S->ch[i - len] = ch[i];
    }
    S->len = S->len - len;
    return OK;
}
/*串复制函数*/
/*将串t的值复制到串S中*/
void StrCopy(SString *S, SString t) {
    int i;
    for(i = 0; i < t.len; i++) {
        S->ch[i] = t.ch[i];
    }
    S->len = t.len;
}
/*判空函数*/
int StrEmpty(SString S) {
    if (S.len == 0) return 1;
    else return 0;
    /*return!(s.len)*/
}
/*串比较函数*/
/*比较规则与字符串的比较相同*/
int StrCompare(SString S, SString t) {
    int i;
    for(i = 0; i < S.len && i < t.len; i++) {
        if(S.ch[i] != t.ch[i]) {
            return(S.ch[i] - t.ch[i]);
        }
    }
    return(S.len - t.len);    /*包含三种情况*/
}
/*求串长函数*/
int StrLength(SString) {
    return(S.len);
}
/*清空函数*/
void StrClear(SString *S) {
    S->len = 0;
}
/*连接函数*/
/*将串连接在串S的后面,*/
int StrCat(SString *S, SString t) {
    int i,flag;
    if(S->len + t.len <= MAXLEN) {    /*连接后串长小于MAXLEN,正常插入*/
        for(i = S->len; i < S->len + t.len; i++) {
            S->ch[i] = t.ch[i - S->len];
        }
        S->len += t.len;
        flag = 1;
    }
    else if(S->len < MAXLEN) {    /*连接后串长大于MAXLEN,t部分被舍去*/
        for (i = S->len; i < MAXLEN; i++) {
            S->ch[i] = t.ch[i - S->len];
        }
        S->len = MAXLEN;
    }
    else {
        flag = 0;
    }
    return flag;     //flag = 0表示非正常连接,t部分被舍弃或全部被舍弃
}
/*求字串函数*/
/*将串S中下标pos起len个字符串复制到sub中*/
int SubString(SString *sub, SString S, int pos, int len) {
    int i;
    if(pos < 0 || pos >S.len - 1 || len <1 || len > S.len - pos) {
        sub->len = 0;
        return OK;
    }
    else {
        for(i = 0; i < len; i++) {
            sub->ch[i] = S.ch[pos + i];
        }
        sub->len = len;
        return OK;
    }
}
/*定位函数即Brute-Force算法*/
/*求主串S的pos位置起,串t第一次出现的位置,成功返回位置序号,失败返回-1*/
int StrIndex(SString S, int pos, SString t) {
    int, i, start;
    if(t.len == 0) {    //t为空串时,是任意串的匹配
        return -1;
    }
    start = pos; i = start; j = 0;    //主串从pos开始,t从头开始
    while(i < S.len && j < t.len) {
        if(S.ch[i] = t.ch[j]) {
            i++; j++;
        }
        else {
            start++;     /*当前对应字符不等时回溯*/
            i = start;
            j = 0;      /*回溯,主串起始位置+1,t从头开始*/
    }
    if(j > t.len) {
        return start;     /*匹配成功,返回匹配起始位置*/
    }
    else return -1;     /*匹配不成功,返回-1*/
}
原文地址:https://www.cnblogs.com/wanghongze95/p/13842658.html