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



    代码来自老师上课使用的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*/
    }
    
  • 相关阅读:
    解决PLSQL Developer中文横着显示的问题
    品优购_day06
    品优购_day05
    品优购_day04
    品优购_day03
    品优购_day02
    java 学习中遇到的问题(二)泛型中<? extends T>和<? super T>的区别
    java 学习中遇到的问题(一)方法调用中的值传递和引用传递
    java中的字符串比较
    自学java 第十一章持有对象
  • 原文地址:https://www.cnblogs.com/wanghongze95/p/13842658.html
Copyright © 2020-2023  润新知