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

代码来自老师上课使用的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*/
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java帮帮-微信公众号-技术文章全总结

10(01)总结形式参数,包,修饰符,内部类

类,抽象类,接口的综合小练习 /* 教练和运动员案例(学生分析然后讲解) 乒乓球运动员和篮球运动员。 乒乓球教练和篮球教练。 为了出国交流,跟乒乓球相关...

2755
来自专栏androidBlog

笔试题—字符串常见的算法题集锦

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/...

1311
来自专栏C#

DotNet常用排序算法总结

    数据结构和算法对一个程序来说是至关重要的,现在介绍一下几种算法,在项目中较为常用的算法有:冒泡排序,简单选择排序,直接插入排序,希尔排序,堆排序,...

1899
来自专栏java学习

请问你知道什么是栈吗?

1.1栈的概念及记本操作 栈(stack)又称堆栈,是限制在表的一端进行插入和删除的线性表。其限制是仅允许在表的一端进行插入和删除操作,不允许在其他任何位置进行...

3138
来自专栏个人分享

Scala第一章学习笔记

  面向对象编程是一种自顶向下的程序设计方法。用面向对象方法构造软件时,我们将代码以名词(对象)做切割,每个对象有某种形式的表示服(self/this)、行为(...

1052
来自专栏Porschev[钟慰]的专栏

Nodejs学习笔记(十七)--- 浮点运算decimal.js

前言  开发过程中免不了有浮点运算,JavaScript浮点运算的精度问题会带来一些困扰  JavaScript 只有一种数字类型 ( Number )  Ja...

3507
来自专栏EAWorld

了解、接受和利用Java中的Optional (类)

作者:EUGEN PARASCHIV 译者:海松 原题: Understanding, Accepting and Leveraging Optional in...

3506
来自专栏Hongten

python开发_python中的Boolean运算和真假值

2021
来自专栏xx_Cc的学习总结专栏

iOS-正则表达式的简单使用

4197
来自专栏猿人谷

一个正则表达式测试(只可输入中文、字母和数字)

  在项目中碰到了正则表达式的运用,正则还是非常强大的,不管什么编程语言,基本上都可以用到。之前在用java时特别是对用户名或密码使用正则非常爽,写脚本上用正则...

6926

扫码关注云+社区

领取腾讯云代金券