数据结构:构建串的定长顺序存储结构;实现串的创建,串的访问输出;实现模式串和主串的简单匹配算法和kmp模式匹配算法。

C语言环境:

#include
#include
#define maxsize 30
typedef struct {
    char ch[maxsize];
    int len;
}sstring;

int init(sstring* p);
void strclear(sstring* p);
void strenter(sstring* p, char a);
char strdel(sstring* p);
int strmat(sstring* m, sstring* p);
void getnext(sstring* m, int* next);
int kpm(sstring* m, sstring* p);
int matched();
void menu();

int main() {
    menu();
}
int init(sstring *p) {
    p->len = 0;
    return 1;
}
void strclear(sstring* p) {
    p->len = 0;
}
void strenter(sstring* p, char a) {
    if (p->len == maxsize - 1) { printf("串已满!\n"); return; }
    p->ch[p->len] = a;
    p->len++;
}
char strdel(sstring* p) {
    if (p->len == 0) { printf("串已空!\n"); return false; }
    p->len--;
    return p->ch[p->len];
}
int strmat(sstring* m, sstring* p) {
    int i, j;
    for ( i = 0; i < m->len - p->len;i++) {
        for ( j = 0; j < p->len; j++) {
            if (m->ch[i + j] != p->ch[j]) {
                break;
            }
        }
        if (j == p->len) {
            return i+1;/*返回物理位置+1=逻辑位置*/
        }
    }
    return -1;
}
void getnext(sstring* m, int *next) {
    next[0] = -1;
    int i = 0, j = -1;
    while (i < m->len ) {
        if (j == -1 || m->ch[i] == m->ch[j]) { /**/
            i++;
            j++;
            next[i] = j;/**/
        }
        else j = next[j];
    }
}
int kpm(sstring* m, sstring* p) {
    int next[maxsize];
    getnext(m, next);
    int i=1, j=0;
    while (i < m->len && j < p->len) {
        if (j == -1 || m->ch[i] == p->ch[j]) { /**/
            i++;
            j++;
        }
        else j = next[j];
        if (j == p->len) { return i - p->len + 1; }/*返回物理位置+1=逻辑位置*/
    }
    return -1;
}
int matched() {
    sstring main, pattern;
    int command;
    init(&main);
    init(&pattern);
    printf("输入主串:\n");
    scanf("\n%s", main.ch);
    main.len = strlen(main.ch);
    printf("输入模式串:\n");
    scanf("\n%s", pattern.ch,30);
    pattern.len = strlen(pattern.ch);
    if (main.len < pattern.len) { return -1; } /*主串长度小于模式串*/
    printf("选择匹配算法:\n");
    printf("1:普通\n");
    printf("2:KPM\n");
    scanf("%d", &command);
    if (command == 1) {
        return strmat(&main, &pattern);
    }
    else {
        return kpm(&main, &pattern);
    }
}
void menu() {
    int command, judge = 1;
    sstring a; char b;int x;
    while (judge == 1) {
        printf("选择操作:\n");
        printf("1:初始化\n");
        printf("2:销毁\n");
        printf("3:录入\n");
        printf("4:删除\n");
        printf("5:匹配算法\n");
        printf("6:结束\n");
        scanf("\n%d", &command);
        switch (command) {
        case 1:if (init(&a)) { printf("初始化已完成\n"); }
              else { printf("初始化不成功\n"); }; break;
        case 2:strclear(&a); break;
        case 3:printf("输入一个元素:\n");
            scanf("\n%c", &b);
            strenter(&a, b);break;
        case 4:printf("%c\n", strdel(&a)); break;
        case 5:x = matched(); if (x != -1) { printf("匹配\n%d\n", x); }
              else { printf("不匹配\n"); } break;
        default:judge = 0; break;
        }
    }
}

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