数据结构--串(①串的赋值;②求串的实际长度;③两个串的比较;④将串清为空;⑤两个串的联接⑥模式匹配:朴素及kmp)

#include 
#include   //中含字符串函数
#include 
void qk(char* src) {     // 清空串
    char p[10] = {'0'};  //{'0'}全赋零
    src = p;             //*p与数组等价
    printf("%s", src);   // 可直接输出
}
void lj(char* src, char* dest) {  // 串的连接
    char t[20];                   // 此串应该大
    int i;
    for (i = 0; src[i] != '\0'; i++) {
        // 注:'\0'为结束标记,即null(在stdio.h中);'0'字符为48;
        // (空格)assic码值为32
        t[i] = src[i];
    }
    int j;
    for (j = 0; dest[j] != '\0'; j++) {
        t[i + j] = dest[j];
    }
    printf("%s", t);
}  // 两串放入一个新串
void chuan(int i, int m, char* src) {  // 返回主串中第i个位置开始的m个字符
    int j;
    char t[10];
    int k = 0;
    for (j = i - 1; j != i - 1 + m; j++) {  // 注:位置从1始,后m个数加m
        t[k] = src[j];                      // 放入新串
        k++;
    }
    printf("%s", t);
}
int Kmp(char* t, char* p, int* next) {
    int i = 0, j = 0;
    while (p[i] != 0 && t[j] != 0) {
        if (p[i] == t[j]) {
            i++;
            j++;
        } else if (next[i] >= 0) {
            i = next[i];
        } else {
            i = 0;
            j++;
        }
    }
    if (p[i] == 0)
        return j - i;  // found
    else
        return -1;  // not found
}
void KmpNext(char* p, int* next) {
    next[0] = -1;
    int k = -1;
    for (int i = 1; p[i - 1] != 0; i++) {
        while (k >= 0 && p[k] != p[i - 1]) {
            k = next[k];
            k = k + 1;
            if (p[i] == p[k]) {
                next[i] = next[k];
            } else {
                next[i = k];
            }
        }
    }
}
int pip(char* t, char* p) {  // 朴素模式匹配,后字符为模式串
    int i = 0;
    int j = 0;
    while (p[i] != '\0') {
        if (p[i] != t[j]) {
            j = j - i + 1;  // 注:回溯并后移一
            i = 0;          // 不等时回溯
        }
        if (t[j] == '\0')
            return -1;  // 不等出口
        if (p[i] == t[j]) {
            i++;
            j++;
        }  // 等时均++
        if (p[i] == t[j] && p[++i] == '\0') {
            return j - i + 1;  // 等出口
        }
    }
}
int main() {
    char src[10];
    char dest[10];
    int len;
    scanf("%s", dest);                // 注:可直接输入不加&
    strcpy(src, dest);                // 注:后赋予前
    char s[10] = "jfksjfk";           // 主串
    printf("%d\n", strcmp(dest, s));  // 比较函数
    /*如果返回值<0,则表示 str1 小于 str2。
    如果返回值> 0,则表示 str2 小于 str1。
    如果返回值 = 0,则表示 str1 等于 str2。*/

    len = strlen(src);  // 字符串长度
    printf("%d\n", len);
    printf("%s", src);
    int i;
    scanf("%d", &i);
    if (i == 1)
        qk(src);
    if (i == 2)
        lj(src, dest);
    if (i == 3) {
        int j, m;
        scanf("%d %d", &j, &m);
        chuan(j, m, src);
    }
    if (i == 4) {
        int e;
        e = pip(s, src);
        printf("%d", e);
    }
    if (i == 5) {
        int e;
        int m = 0;
        while (src[m] != 0)
            m++;
        int* next = (int*)malloc((m + 1) * sizeof(int));
        KmpNext(src, next);
        e = Kmp(s, src, next);
        printf("%d", e);
    }
    return 0;
}

你可能感兴趣的:(数据结构,数据结构)