数据结构串的整理

串的定义

由 0 个或多个 字符 组成的 有限的 序列,通常记为:s =“a1 a2 a3 … ai …an” ( n≥0 ,且n是有限的)。其中的引号不属于串,只是一个标记作用!
n就是串的长度,且字符串里的字符 ai 的值由 字母、数字或其他字符 组成的。

串的相关术语

  1. 空串:不含任何字符的串,长度 = 0,用符号 f 表示。也就是说空串也是字符串!
  2. 空格串:仅由一个或多个空格组成的串。 区分空串和空格串!
  3. 子串:由串中任意个连续的字符组成的子序列。空串是任意串的子串,任意串是其自身的子串。
  4. 主串:包含子串的串。
  5. 字符的位置:字符在序列中的序号。
  6. 子串在主串中的位置:子串的首字符在主串中的位置。
  7. 串相等:当两个串的长度相等且各个对应位置的字符都相等时才相等。

串的基本操作

  1. 串的创建
  2. 输出串长
  3. 进行两个串的比较(如果是包含关系则比较串长,否则比较ASCALL码的值)
  4. 清空串
  5. 两个串的连接
  6. 求出某个串指定位置的子串
  7. 求出子串在指定串的位置

串的创建

//创建一个结构体变量 通过字符串去创建
LPSTR  createstring(const char* str) 
{
    LPSTR pstr = (LPSTR)malloc(sizeof(string)); //做动态内存申请
    assert(pstr);
    for (int i = 0; i < MAX; i++)               //给属性做初始化 memset
    {
        pstr->mem[i] = '\0';                    //给pstr的数组做初始化
    }
    int count = 0;
    while (str[count] != '\0')                  //!='\0' 把字符串中东西拷贝进去
    {
        pstr->mem[count] = str[count];          //没有把'\0'拷贝进去 strcpy
        count++;                
    }
    pstr->curSize = count;
    return pstr;

串的插入

//串的插入 当前的串 要插入的串 字符串的长度 指定下标
void insertstring(LPSTR pstr, const char* str, int len, int pos) 
{
    if (pos < 0 || pos >= MAX)            //下标是否满足规则
    {
        printf("无效下标!\n");
        return;  
    }
    if (pstr->curSize + len >= MAX)        //满的状态
    {
        printf("太长,无法插入!\n");
        return;
    }
    if (pos > pstr->curSize)               //下标大于curSize
    {
        for (int i = 0; i < len; i++)      //把新字符串放在原字符串后面
        {
            pstr->mem[pstr->curSize++] = str[i];
        }
    }
    else                                   //下标刚好在字符串里面
    {
        //1.腾位置
        for (int i = pstr->curSize; i >= pos; i--) //从后面开始挪
        {
            pstr->mem[len + i] = pstr->mem[i]; //把i的元素挪到 i+len 的位置
        }
        //2.插入新的字符串
        for (int i = 0; i < len; i++) 
        {
            pstr->mem[pos + i] = str[i];   //从 pos+i 的位置开始放入需要插入的字符串
        }
        pstr->curSize += len;              //原字符串的长度需要改变
    }
}
//测试代码
    LPSTR str1 = createstring("string");   //创建串
    insertstring(str1, "Love", 4, 3);      //插入串
    printstring(str1);                     //strLoveing
    insertstring(str1, "Miss", 4, 13);     //strLoveingMiss
    printstring(str1); 

打印串 

//要打印的串
void printstring(LPSTR pstr) 
{
    for (int i = 0; i < pstr->curSize; i++) 
    {
        putchar(pstr->mem[i]);         //用putchar的方式做打印
    }
    putchar('\n');

串的删除 

//要删除的串 删除开始位置 第n个元素 删除的结束位置-->删除这段区间中的元素
void deletestring(LPSTR pstr, int start, int end)
{
    if (start > end || end > pstr->curSize || start <= 0) //下标是否满足要求
    {
        printf("区间有误!\n");
        return;
    }
    int count = end - start + 1;        //移动的位置
    for (int i = end, j = start - 1; i < pstr->curSize; i++, j++) 
    {
        pstr->mem[j] = pstr->mem[i];    //注意没有把后面的串置为'\0'
    }
    //伪删除,手动置0
    for (int i = pstr->curSize; i >= pstr->curSize - count; i--) 
    {
        pstr->mem[i] = '\0';
    }
    pstr->curSize -= count;              //注意长度变化
}
//测试代码 strLoveingMiss
    deletestring(str1, 4, 7);            //删除第4个-第7个位置
    printstring(str1);                   //stringMiss 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值