数据结构(c语言版本) 字符串操作

作业要求

创建字符串插入、字符串、字符定位、求字串、删除某个字符、替换某个字符串、合并两个字符串

代码实现

#include 
#include 
#define MAXSIZE 100

//定义结构体
struct SeqString{
    char data[MAXSIZE];
    int charlen;
};

//初始化
void init(struct SeqString *SS){
    SS->charlen = 0;
    SS->data[SS->charlen] = '\0';
}

//输出字符串
void print_str(struct SeqString *SS){
    //判空
    if(SS->charlen == 0){
        printf("空字符串!\n");
        return;
    }

    printf("字符串为:");
    for(int i=0; i < SS->charlen; i++){
        printf("%c",SS->data[i]);
    }
    printf("\n");
}

//插入数据
void StrInsert(struct SeqString *SS, char *strs, int count){
    // 判满
    if(SS->charlen >= MAXSIZE){
        if((SS->charlen + count) >= MAXSIZE){
            printf("插入的字符串过长\n");
            return;
        }
        printf("字符串已经满,不能再插入数据了\n");
        return;
    }

    char *temp = strs;
    for(int i=0; i<count; i++){
        SS->data[SS->charlen] = temp[i];
        SS->charlen ++;
    }
    SS->data[SS->charlen] = '\0';

    printf("插入数据成功!\n");
    print_str(SS);
}

//串的定位
void StrIndex(struct SeqString *SS, char C){
    struct SeqString *tmp = SS;
    int index = 0;
    int flag = 0;
    while (tmp->data[index] != '\0'){
        if(tmp->data[index] == C){
            printf("%c 在字符串中出现的位置为:%d\n", C, index+1);
            flag = 1;
        }
        index ++;
    }
    if(flag == 0){
        printf("%c 不在字符串中\n", C);
    }
}

//求子串
void SubStr(struct SeqString *SS, char *sonstr){
    //判断子串存在
    if(strlen(sonstr)<0){
        printf("子串不存在!\n");
        return;
    }
    //判断字串是否大于父串
    if(strlen(sonstr)>(SS->charlen-1)){
        printf("子串大于父串!\n");
        return;
    }
    struct SeqString *tmp = SS;
    int index = 0;
    while (tmp->data[index] != '\0'){
        if(tmp->data[index] == sonstr[0]){
            int s_index = 0;
            for(int i=index; i<(index+strlen(sonstr)); i++){
                printf("父%d -->%c",i,tmp->data[i]);
                printf("   子%d -->%c\n",s_index+1, sonstr[s_index]);
                if(tmp->data[i] != sonstr[s_index]){break;}
                s_index ++;
            }
            if(s_index == (strlen(sonstr))){
                printf("是子串!\n");
                return;
            }
        }
        index ++;
    }
    printf("不是子串!\n");
}

//删除某个字符
void DelStr(struct SeqString *SS, char del_c){
    struct SeqString *tmp = SS;
    int index = 0;
    while (tmp->data[index] != '\0'){
        if(tmp->data[index] == del_c){
            int i = index;
            while (tmp->data[i] != '\0'){
                tmp->data[i] = tmp->data[i+1];
                i ++;
            }
            tmp->data[i] = '\0';
            index --;
        }
        index ++;
    }
}

//替换某个字符串
void RepStr(struct SeqString *SS, char *y_t_c){
    struct SeqString *tmp = SS;
    int index = 0;
    while (tmp->data[index] != '\0'){
        if(tmp->data[index] == y_t_c[0]){
            tmp->data[index] = y_t_c[1];
        }
        index ++;
    }
}

//合并两个字符串
void MergeStr(int s1_len,int s2_len,int s3_len,char *S1,char *S2,char *S3){
    if((s1_len+s2_len) > s3_len){
        printf("合并失败:第一个字符串和第二个字符串长度和超过第三个字符串长度\n");
        return;
    }
    int index=0;
    for(int i=0;i<s1_len;i++){
        S3[index] = S1[i];
        index ++;
    }
    for(int j=0;j<s2_len;j++){
        S3[index] = S2[j];
        index ++;
    }
    printf("合并后的字符串为:");
    for(int k=0;k<=index;k++){
        printf("%c",S3[k]);
    }

}

int main(){
    struct SeqString SS;
    init(&SS);

    printf("**************输入字符串操作**************\n");
    //输入字符串,计算字符串长度
    char strs[10];
    printf("请输入字符串(不超过100个字符):");
    scanf("%s", strs);
    int num = strlen(strs) + 1;
    printf("字符串长度为:%d\n", num);


    printf("\n**************插入字符串操作**************\n");
    //插入数据
    StrInsert(&SS, strs, num);


    printf("\n**************查找字符串操作**************\n");
    //字符串定位
    char c;
    printf("请输入需要查找的字符:");
    scanf("%s",&c);
    StrIndex(&SS, c);

    printf("\n**************求子串操作**************\n");
    printf("父串 ");
    print_str(&SS);
    char sonstr[100];
    printf("请输入字串(最大长度为100):");
    scanf("%s",sonstr);
    SubStr(&SS, sonstr);

    printf("\n**************删除某个字符操作**************\n");
    printf("原 ");
    print_str(&SS);
    printf("请输入需要删除的字符:");
    char del_c;
    scanf("%s",&del_c);
    DelStr(&SS, del_c);
    printf("删除后 ");
    print_str(&SS);

    printf("\n**************替换某个字符操作**************\n");
    printf("原 ");
    print_str(&SS);
    printf("请输入原字符和替换字符:");
    char y_t_c[2];
    scanf("%s",y_t_c);
    RepStr(&SS, y_t_c);
    printf("替换后 ");
    print_str(&SS);

    printf("\n**************两个字符串合并操作**************\n");
    int s1_len,s2_len,s3_len;
    printf("请输入第一个字符串的长度:");
    scanf("%d",&s1_len);
    printf("请输入第二个字符串的长度:");
    scanf("%d",&s2_len);
    printf("请输入第三个字符串的长度:");
    scanf("%d",&s3_len);
    char S1[s1_len], S2[s2_len], S3[s3_len];
    printf("请输入第一个字符串:");
    scanf("%s",S1);
    printf("请输入第二个字符串:");
    scanf("%s",S2);
    MergeStr(s1_len,s2_len,s3_len,S1,S2,S3);
}

运行结果

**************输入字符串操作**************
请输入字符串(不超过100个字符):asdfghjkl
字符串长度为:10

**************插入字符串操作**************
插入数据成功!
字符串为:asdfghjkl

**************查找字符串操作**************
请输入需要查找的字符:d
d 在字符串中出现的位置为:3

**************求子串操作**************
父串 字符串为:asdfghjkl
请输入字串(最大长度为100):ghj
父4 -->g   子1 -->g
父5 -->h   子2 -->h
父6 -->j   子3 -->j
是子串!

**************删除某个字符操作**************
原 字符串为:asdfghjkl
请输入需要删除的字符:f
删除后 字符串为:asdghjkl

**************替换某个字符操作**************
原 字符串为:asdghjkl
请输入原字符和替换字符:aA
替换后 字符串为:Asdghjkl

**************两个字符串合并操作**************
请输入第一个字符串的长度:5
请输入第二个字符串的长度:7
请输入第三个字符串的长度:13
请输入第一个字符串:qwert
请输入第二个字符串:zxcvbnm
合并后的字符串为:qwertzxcvbnm

你可能感兴趣的:(数据结构,c语言版,数据结构,c语言,算法)