X960402_ 2016-10-27 02:34 采纳率: 83.3%
浏览 1028
已采纳

一个c语言关于KMP算法的代码,没有error却运行不出来,不知道哪里错了?

#include "stdafx.h"
#include "stdio.h"
#define MaxSize 7
typedef struct //定义结构体类型
{
char data[MaxSize];
int length;
}SqString;
void StrAssign(SqString &s,char cstr[]) //将一个字符串常量赋给串s
{
int i;
for(i=0;cstr[i]!='\0';i++)
s.data[i]=cstr[i];
s.length=i;
}
void GetNextval(SqString t,int nextval[]) //对模式串t求nextval[]值
{
int j=0,k=-1;
nextval[0]=-1;
while(j {
if(k==-1||t.data[j]==t.data[k])
{
j++;k++;
if(t.data[j]!=t.data[k])
nextval[j]=k;
else
nextval[j]=nextval[k];
}
else
k=nextval[k];
}
}
int KMPIndex(SqString s,SqString t)
{
int nextval[MaxSize],i=0,j=0;
GetNextval(t,nextval);
while(i {
if(j==-1||s.data[i]==t.data[j])
{
i++;
j++;
}
else j=nextval[j];
}
if(j>=t.length)
return(i-t.length);
else
return -1;
}
int main(int argc, char* argv[])
{
SqString s1,s2;
int k;
char t[20]={'a','b','c','a','a','b','b','a','b','c','a','b','a','a','c','b','a','c','b','a'};
char p[7]={'a','b','c','a','b','a','a'};
StrAssign(s1,t);
StrAssign(s2,p);
k=KMPIndex(s1,s2);
if(k!=-1)
printf("匹配,从第%d个数开始",k);
else
printf("不匹配");
return 0;
}

  • 写回答

1条回答 默认 最新

  • 小灸舞 2016-10-27 02:48
    关注

    1.你main函数里的t和p应该分别设成char t[21]和char p[8],因为最后需要放一个'\0'
    2.你的MaxSize设成7不够吧?应该是21才行

     #include "stdafx.h"
    #include "stdio.h"
    #define MaxSize 21
    typedef struct    //定义结构体类型
    {
        char data[MaxSize];
        int length;
    }SqString;
    void StrAssign(SqString &s, char cstr[])  //将一个字符串常量赋给串s
    {
        int i;
        for (i = 0; cstr[i] != '\0'; i++)
            s.data[i] = cstr[i];
        s.length = i;
    }
    void GetNextval(SqString t, int nextval[])    //对模式串t求nextval[]值
    {
        int j = 0, k = -1;
        nextval[0] = -1;
        while (j<t.length)
        {
            if (k == -1 || t.data[j] == t.data[k])
            {
                j++; k++;
                if (t.data[j] != t.data[k])
                    nextval[j] = k;
                else
                    nextval[j] = nextval[k];
            }
            else
                k = nextval[k];
        }
    }
    int KMPIndex(SqString s, SqString t)
    {
        int nextval[MaxSize], i = 0, j = 0;
        GetNextval(t, nextval);
        while (i<s.length&&j<t.length)
        {
            if (j == -1 || s.data[i] == t.data[j])
            {
                i++;
                j++;
            }
            else j = nextval[j];
        }
        if (j >= t.length)
            return(i - t.length);
        else
            return -1;
    }
    int main(int argc, char* argv[])
    {
        SqString s1, s2;
        int k;
        char t[21] = { 'a', 'b', 'c', 'a', 'a', 'b', 'b', 'a', 'b', 'c', 'a', 'b', 'a', 'a', 'c', 'b', 'a', 'c', 'b', 'a' };
        char p[8] = { 'a', 'b', 'c', 'a', 'b', 'a', 'a' };
        StrAssign(s1, t);
        StrAssign(s2, p);
        k = KMPIndex(s1, s2);
        if (k != -1)
            printf("匹配,从第%d个数开始", k);
        else
            printf("不匹配");
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图