自学内容网 自学内容网

每日一练算法题(顺序串的基本操作)

假定下面所有的串均为顺序串,参数ch、ch1和ch2均是字符型,编写算法依次实现下列操作。

① 将串r中所有值为ch1的字符换成ch2的字符。

② 将串r中所有字符按照相反的次序仍存放在r中。

③ 从串r中删除其值等于ch的所有字符。

④ 从串r1中第index个字符起求出首次与串r2相同的子串的起始位置。
输入格式:

第一行:r

第二行:r1

第三行:r2

第四行:ch ch1 ch2

第五行:index

输出格式:

第一行:操作①结果

第二行:操作②结果

第三行:操作③结果

第四行:操作④结果(不存在输出-1)

函数接口定义:

void StrReplaceCh(SString *S, char ch1, char ch2);  /*字符替换函数*/
void StrRreverse(SString *S);   /*串逆置函数*/
void StrDeleteCh(SString *S, char ch);  /*在串S中删除值为ch的字符*/
int StrIndex(SString *S, int index, SString T);  /*求串T在串S中的位置*/

顺序串类型定义如下:

#define MAXLEN 50   //字符串的最大长度
typedef struct{
    char ch[MAXLEN];  //下标从0开始存放
    int  len;
}SString;

裁判测试程序样例:

#include<stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXLEN 50   //字符串的最大长度
typedef struct{
    char ch[MAXLEN];
    int  len;
}SString;


void StrReplaceCh(SString *S, char ch1, char ch2);  /*字符替换函数*/
void StrRreverse(SString *S);   /*串逆置函数*/
void StrDeleteCh(SString *S, char ch);  /*在串S中删除值为ch的字符*/
int StrIndex(SString *S, int pos, SString T);  /*求串T在串S中的位置*/


void StrInit(SString *s){
    s->len=0;
}

/*将字符串常量tval的值赋给串s */
void StrAssign(SString *s, char *r){    
    int i=0;
    while (r[i]!='\0'){
        s->ch[i]=r[i];
        i++;
    }
    s->len=i;
}

void main()
{
    SString s, s1, s2;
    char r[50], r1[50], r2[50];
    char ch, ch1, ch2;
    int i, loc, index;
    gets(r);  gets(r1);  gets(r2);
    scanf("%c %c %c", &ch, &ch1, &ch2); 
    StrAssign(&s, r);
    /*操作1:字符替换*/
    StrReplaceCh(&s, ch1, ch2);
    for(i=0;i<s.len;i++)
        printf("%c", s.ch[i]);
    printf("\n");
    /*操作2:串逆置*/
    StrRreverse(&s);
    for(i=0;i<s.len;i++)
        printf("%c", s.ch[i]);
    printf("\n");
    /*操作3:串删除*/
    StrDeleteCh(&s, ch);
    for(i=0;i<s.len;i++)
        printf("%c", s.ch[i]);
    printf("\n");
    /*操作4:串定位匹配*/
    StrAssign(&s1, r1); StrAssign(&s2, r2);
    scanf("%d", &index); 
    loc=StrIndex(&s1, index, s2);
    printf("%d\n",loc);
    
}

/* 请在这里填写答案 */

输入样例:

在这里给出一组输入。例如:

abcaabcaaabca
abcaabcaaabca
aabc
a b c
0

输出样例:

在这里给出相应的输出。例如:

accaaccaaacca
accaaaccaacca
cccccc
3
void StrReplaceCh(SString *S, char ch1, char ch2) {
    for (int i = 0; i < S->len; i++) {
        if (S->ch[i] == ch1) {
            S->ch[i] = ch2;
        }
    }
}
void StrRreverse(SString *S) {
    for (int i = 0; i < S->len / 2; i++) {
        char temp = S->ch[i];
        S->ch[i] = S->ch[S->len - 1 - i];
        S->ch[S->len - 1 - i] = temp;
    }
}
void StrDeleteCh(SString *S, char ch) {
    int j = 0;
    for (int i = 0; i < S->len; i++) {
        if (S->ch[i] != ch) {
            S->ch[j++] = S->ch[i];
        }
    }
    S->len = j;
    S->ch[j] = '\0';
}
int StrIndex(SString *S, int index, SString T) {
    if (index < 0 || index >= S->len) {
        return -1;
    }
    for (int i = index; i <= S->len - T.len; i++) {
        int j = 0;
        while (j < T.len && S->ch[i + j] == T.ch[j]) {
            j++;
        }
        if (j == T.len) {
            return i;
        }
    }
    return -1;
}

原文地址:https://blog.csdn.net/2301_79847249/article/details/143029054

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!