Skip to content
c
/* 串的顺序存储 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct HStr {
    char * ch;      // 字符的存储单元
    int length;     // 串的长度
} HStr,*PHStr;
typedef enum Status {
    ok = 1,
    Error = 0,
} Status;


/*
 * 初始化
 * 步骤:
 *  令串的存储单元为空
 *  令串的长度等于 0
*/
void InitStr(PHStr str)
{
    str->ch = NULL;
    str->length = 0;
}


/*
 * 赋值
 * 步骤:
 *  首先获取要插入的字符串长度
 *  为串存储单元申请空间
 *  遍历字符串,将每个字符插入线性表中
 *  修改线性表长度
*/
Status AssigStr(PHStr str,char * chars)
{
    int len = strlen(chars);
    int i = 0;

    if(!len) return Error;
    InitStr(str);

    str->ch = (char *) malloc(sizeof(char) * len);
    if(!str->ch)
    {
        printf("空间申请失败!\n");
        return Error;
    }

    while (i < len)
    {
        str->ch[i] = chars[i];
        i++;
    }

    str->length = len;
    return ok;
}


/*
 * 打印字符串
*/
void PrintStr(PHStr str)
{
    int i = 0;
    if(!str->length)
    {
        printf("空串!\n");
        return;
    }

    printf("\n打印字符串:");
    while (i < str->length)
    {
        if(i == str->length - 1) printf("%c\n",str->ch[i]);
        else printf("%c、",str->ch[i]);
        i++;
    }
}


/*
 * 拷贝字符串
*/
Status CopyStr(PHStr str, PHStr cs)
{
    int len = str->length;
    int i = 0;

    if(!len) return Error;
    InitStr(cs);

    cs->ch = (char *) malloc(sizeof(char) * len);
    if(!cs->ch)
    {
        printf("空间申请失败!\n");
        return Error;
    }

    while (i < len)
    {
        cs->ch[i] = str->ch[i];
        i++;
    }
    cs->length = len;

    return ok;
}


/*
 * 串连接
*/
Status ConcatStr(PHStr str,char * ist)
{
    int strLen = str->length;
    int istLen = strlen(ist);
    int i = strLen;
    str->ch = (char *) realloc(str->ch,sizeof(char) * istLen);

    while (i < strLen + istLen)
    {
        str->ch[i] = ist[i - strLen];
        i++;
    }

    str->length += istLen;
    return ok;
}


/*
 * 串比较
*/
void CompStr(PHStr str,char * chars)
{
    int i = 0;
    printf("\n");
    while (i < str->length && i < strlen(chars))
    {
        if(str->ch[i] != chars[i])
        {
            if(str->ch[i] - chars[i] > 0)
            {
                printf("str > chars");
            }
            else
            {
                printf("str < chars");
            }
            printf("\n");
            return;
        }
        i++;
    }

    int comp = str->length - strlen(chars);

    if(comp > 0) printf("str > chars");
    else if(comp < 0) printf("str < chars");
    else printf("str = chars");
}


/*
 * 插入子串
*/
Status InsertStr(PHStr str,int index,char * chars)
{
    if(index < 0 || index > str->length)
    {
        printf("参数错误!\n");
        return Error;
    }

    int len = strlen(chars);
    int i = index + len;
    int j = index;
    str->ch = (char *) realloc(str->ch,sizeof(char) * len);

    while (i < str->length + len)
    {
        str->ch[i] = str->ch[i - len];
        i++;
    }
    while (j < index + len)
    {
        str->ch[j] = chars[j - index];
        j++;
    }
    str->length += len;
    return ok;
}


/*
 * 找子串首次出现的位置
*/
int GetIndex(PHStr str,char * chars)
{
    int i = 0;
    int j = 0;
    int index = -1;
    int sLen = str->length;
    int cLen = strlen(chars);
    while (i < sLen && j < cLen)
    {
        if(str->ch[i] != chars[j])
        {
            i++;
            continue;
        }
        i++;
        j++;
    }
    if(j == cLen) index = i - cLen;
    return index;
}


/*
 * 查找子串
*/
void Lookup(PHStr str,char * chars)
{
    int index = GetIndex(str,chars);
    if(index == -1)
    {
        printf("\n不是子串\n");
    }
    else
    {
        printf("\n子串的位置是:%d\n",index);
    }
}


/*
 * 删除子串
*/
Status DelStr(PHStr str,int index,int len)
{
    int sLen = str->length;
    int i = index;
    if(index < 0 || index > sLen - len)
    {
        printf("参数错误!\n");
        return Error;
    }

    while (i < index + len)
    {
        str->ch[i] = str->ch[i + len];
        i++;
    }

    str->length -= len;
    return ok;
}

int main() {
    int retVal;

    HStr str0;
    HStr str1;

    AssigStr(&str0,"chinese");

    PrintStr(&str0);

    CopyStr(&str0,&str1);
    PrintStr(&str1);

    ConcatStr(&str0,"good");
    PrintStr(&str0);

    CompStr(&str0,"chinesegood");
    CompStr(&str0,"chinese");
    CompStr(&str0,"chinesf");

    InsertStr(&str1,3,"abc");
    PrintStr(&str1);

    Lookup(&str0,"abc");
    Lookup(&str0,"ese");

    DelStr(&str1,3,3);
    PrintStr(&str1);

    return 0;
}

基于 MIT 许可发布