红色圆圈里的重复数字和屯怎么消掉?


#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#define MAXSIZE 100
using namespace std;
 
#define N 100
 
#define ERROR 0
#define OK 1
#define OVERFLOW -2
typedef char ElemType;
typedef int Status;
 
typedef struct   //串的堆式顺序存储结构 
{
    char *ch;   //若是非空串,则按串长分配存储区,否则ch为NULL
    int length; //串的当前长度 
}HString; 
//00 初始化 
Status InitString(HString &H)
{
    H.ch=new ElemType [MAXSIZE];
    H.ch[0]='O';
    if(!H.ch)   exit(OVERFLOW);
    H.length=0;
    return OK;
}
//01 创建串 
Status CreateString (HString &H,int len)
{
    char x;
    for(int i=1;i<=len;i++)
    {
        cin>>x;
        H.ch[i]=x;
    }
    H.length=len;
    return OK;
 } 
Status DisPlay(HString &H)
{
    printf("打印串:") ; 
    for(int i=1;i<=H.length;i++)
    {
        printf("%c",H.ch[i]);
    }
    printf("\n");
    return OK;
}
//02 实现BF模式匹配算法
int Index_BF(HString S,HString T,int &pos) 
{
    int i=1,j=1,sum=0;
    while(i<=S.length && j<=T.length)//两个串均比较到末尾 
    {
        sum++; 
        if(S.ch[i]==T.ch[j])
        {
            ++i;
            ++j;//继续比较后继字符 
        }
        else //指针退后重新开始比较 
        {
            i=i-(j-1)+1;
            j=1;
        }
    }
         cout<<"BF一共比较了"<<sum<<"次"<<endl ;
        if(j>T.length) 
        {
           pos=i-T.length;
           return i-T.length;//匹配成功
        }
        else return 0;//匹配失败 
}
//03 实现KMP模式匹配算法
int Index_KMP(HString S,HString T,int &pos,int next[]) 
{
 
    int i=1;
    int j=1;
    int sum=0;
    while(i<=S.length && j<=T.length)//两个串均比较到末尾 
    {
        sum++; 
        if(j==0||S.ch[i]==T.ch[j])
        {
            ++i;++j;//继续比较后继字符 
        }
        else
        j=next[j];
    }
     cout<<"KMP一共比较了"<<sum<<"次"<<endl ;
    if(j>T.length)  
    {
        pos=i-T.length;
        return i-T.length;//匹配成功
    }
    else return 0;//匹配失败 
}
void get_next(HString T,int next[])
{
    next[1]=0;
    int m,j;
    m=0; //m=next[1],m代表的是前缀结束时的下标,也就是相似度,T1...Tm(m个字符) 
    j=1; //j代表的是后缀末尾的下标,Tj-m+1...Tj(m个字符)  ++j后即所求next[j] 
    while(j<T.length)
    {
        if(m==0||T.ch[m]==T.ch[j])
        {
            ++m;++j;
            next[j]=m;
        }
        else //匹配失败,则回溯 
        m=next[m];//若是字符不相同,则m回溯 
    }
}
void get_nextval(HString T,int nextval[])//求模式串T中的next函数修正值,并存入数组nextval 
{
    int i=1,j=0;
    nextval[1]=0;
    while(i<T.length)
    {
        if(j==0||T.ch[i]==T.ch[j])
        {
            ++i;++j;
            if(T.ch[i]!=T.ch[j])
            nextval[i]=j;
            else nextval[i]=nextval[j];
        }
        else j=nextval[j];
     } 
}
 int main()
 {
     int m,n,pos;
     HString H,S,T;
     int next[N];
     int nextval[N];
     //00 初始化 
     InitString(S);
     InitString(T);
     //01 创建串S 
     printf("创建的串长为:"); 
     scanf("%d",&m);
     printf("键入串S:"); 
     CreateString(S,m);
     DisPlay(S);
     //01 创建串T 
     printf("创建的串长为:"); 
     scanf("%d",&n);
     printf("键入串T:") ;
     CreateString(T,n);
     DisPlay(T);
     //02 实现BF模式匹配算法
     Index_BF(S,T,pos);
    printf("BF:模式T在主串S中 第%d个 字符开始第一次出现\n",pos) ;
    //03 实现KMP模式匹配算法 
    get_next(T,next);
    Index_KMP(S,T,pos,next);
    printf("KMP:模式T在主串S中 第%d个 字符开始第一次出现\n",pos) ;
    //04 实现KMP模式匹配  改进算法 
    get_nextval(T,nextval);
    Index_KMP(S,T,pos,nextval);
    printf("KMP(改进):模式T在主串S中 第%d个 字符开始第一次出现\n",pos) ;
 
}

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/054460545736128.jpg "#left")

img

你这个问题还多着呢,可以告诉你出现CCCCCCCC说明你这个值还没有被赋值过,是一开始系统初始化的值

修改见注释,供参考:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#define MAXSIZE 100
using namespace std;
#define N 100
#define ERROR 0
#define OK 1
#define OVERFLOW -2
typedef char ElemType;
typedef int  Status;
typedef struct   //串的堆式顺序存储结构 
{
    char* ch;   //若是非空串,则按串长分配存储区,否则ch为NULL
    int length; //串的当前长度 
}HString;
//00 初始化 
Status InitString(HString& H)
{
    H.ch = new ElemType[MAXSIZE+1];//修改
    H.ch[0] = 'O';
    if (!H.ch)   exit(OVERFLOW);
    H.length = 0;
    return OK;
}
//01 创建串 
Status CreateString(HString& H, int len)
{
    char x;
    for (int i = 1; i <= len; i++)
    {
        cin >> x;
        H.ch[i] = x;
    }
    H.length = len;
    return OK;
}
Status DisPlay(HString H)  //Status DisPlay(HString& H)
{
    printf("打印串:");
    for (int i = 1; i <= H.length; i++)
    {
        printf("%c", H.ch[i]);
    }
    printf("\n");
    return OK;
}
//02 实现BF模式匹配算法
int Index_BF(HString S, HString T, int& pos)
{
    int i = 1, j = 1, sum = 0;
    while(i<=S.length && j<=T.length)
    {
        sum++;
        if (S.ch[i] == T.ch[j])
        {
            ++i;
            ++j;//继续比较后继字符 
        }
        else //指针退后重新开始比较 
        {
            i = i - (j - 1) + 1;
            j = 1;
        }
    }
    cout << "BF一共比较了" << sum << "次" << endl;
    if (j > T.length)
    {
        pos = i - T.length;
        return  OK;          //匹配成功  //修改
    }
    else {
        pos = -1;        //修改
        return ERROR;   //修改    匹配失败
    }
}
//03 实现KMP模式匹配算法
int Index_KMP(HString S, HString T, int& pos, int next[])
{
    int i = 1;
    int j = 1;
    int sum = 0;
    while (i <= S.length && j <= T.length)//两个串均比较到末尾 
    {
        sum++;
        if (j == 0 || S.ch[i] == T.ch[j])
        {
            ++i; ++j;//继续比较后继字符 
        }
        else
            j = next[j];
    }
    cout << "KMP一共比较了" << sum << "次" << endl;
    if (j > T.length)
    {
        pos = i - T.length;
        return OK;//匹配成功 修改
    }
    else {
        pos = -1;         //修改 
        return ERROR;//匹配失败 修改
    }
}
void get_next(HString T, int next[])
{
    next[1] = 0;
    int m, j;
    m = 0; //m=next[1],m代表的是前缀结束时的下标,也就是相似度,T1...Tm(m个字符) 
    j = 1; //j代表的是后缀末尾的下标,Tj-m+1...Tj(m个字符)  ++j后即所求next[j] 
    while (j < T.length)
    {
        if (m == 0 || T.ch[m] == T.ch[j])
        {
            ++m; ++j;
            next[j] = m;
        }
        else //匹配失败,则回溯 
            m = next[m];//若是字符不相同,则m回溯 
    }
}
void get_nextval(HString T, int nextval[])//求模式串T中的next函数修正值,并存入数组nextval 
{
    int i = 1, j = 0;
    nextval[1] = 0;
    while (i < T.length)
    {
        if (j == 0 || T.ch[i] == T.ch[j])
        {
            ++i; ++j;
            if (T.ch[i] != T.ch[j])
                nextval[i] = j;
            else 
                nextval[i] = nextval[j];
        }
        else j = nextval[j];
    }
}
int main()
{
    int m, n, pos1,pos2,pos3; //修改
    HString H, S, T;
    int next[N];
    int nextval[N];
    //00 初始化 
    InitString(S);
    InitString(T);
    //01 创建串S 
    printf("创建的串长为:");
    scanf("%d", &m);
    printf("键入串S:");
    CreateString(S, m);
    DisPlay(S);
    //01 创建串T 
    printf("创建的串长为:");
    scanf("%d", &n);
    printf("键入串T:");
    CreateString(T, n);
    DisPlay(T);
    //02 实现BF模式匹配算法
    Index_BF(S, T, pos1);      //修改
    printf("BF:模式T在主串S中 第%d个 字符开始第一次出现\n", pos1);
    //03 实现KMP模式匹配算法 
    get_next(T, next);
    Index_KMP(S, T, pos2, next);    //修改
    printf("KMP:模式T在主串S中 第%d个 字符开始第一次出现\n", pos2);
    //04 实现KMP模式匹配  改进算法 
    get_nextval(T, nextval);
    Index_KMP(S, T, pos3, nextval); //修改
    printf("KMP(改进):模式T在主串S中 第%d个 字符开始第一次出现\n", pos3);
    return 0;
}