鱼C论坛

 找回密码
 立即注册
查看: 2438|回复: 3

关于KMP算法的一个问题

[复制链接]
发表于 2018-10-17 18:03:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
//准确来说这个问题不是关于KMP算法的,具体问题在代码中的注释




#include <stdio.h>
#include <stdlib.h>
#define max_size 100


typedef struct
{
        char a[max_size];
        int length;
}string,*STRING;



void initstring(STRING L)         //初始化L
{  
        int i;
        printf("&#199;&#235;ê&#228;è&#235;×&#214;·&#251;êy&#196;&#191;:");
        scanf("%d",&L->length);         //这个是输入长度

        printf("&#199;&#235;ê&#228;è&#235;′y&#198;¥&#197;&#228;′&#174;&#187;ò&#213;&#223;&#196;£ê&#189;′&#174;:");
        for(i=1;i<=L->length;i++)
                scanf("%c",&L->a[i]);      //从a【1】开始进行输入字符
}



void get_next(STRING L2,int next[])
{
        int i=1,j;
        j=0;
        next[1]=0;
        while(i<=L2->length)
        {
                if(j==0||L2->a[i]==L2->a[j])
                {
                        i++;
                        j++;
                        next[i]=j;
                }
                else
                        j=next[j];
        }
}







int KMP(STRING L1,STRING L2,int pos,int next[])
{
        int i,j,flag=0;
        i=pos;
        j=1;
        while(i<=L1->length&&j<=L2->length)
        {
                if(j==0||L1->a[i]==L2->a[j])
                {
                        i++;
                        j++;
                }
                else
                {
                        j=next[j];
                }
        }
        if(i>L1->a[0])
        {
                printf("&#206;′&#213;òμ&#189;&#191;éò&#212;&#198;¥&#197;&#228;μ&#196;×&#214;·&#251;′&#174;.\n");
                exit(-1);
        }
        else
                return  i-L2->a[0];
}       




int main()
{
        int next[20];
        int pos,pos1;
        //char ch[20]="abcac";
        STRING L1;
        STRING L2;
        L1=(STRING)malloc(sizeof(string));
        L2=(STRING)malloc(sizeof(string));       //这里我定义2个结构,用initstring分别进行初始化,其中 一个是模板串,另一个是模式串,但是问题就出在这里,我只能对模板串进行初始化,无法对模式串进行初始化,在进行完L1的初始化后
                                                                        执行对L2进行初始化的时候就不允许我进行输入,直接一套流程输出下来。返回的值为未知的。求大佬帮看看问题出在哪里。                                       
        initstring(L1);
//        printf("1\n");
        initstring(L2);
        get_next(L2,next);


        printf("&#199;&#235;ê&#228;è&#235;&#191;aê&#188;2é&#213;òμ&#196;&#206;&#187;&#214;&#195;:");
        scanf("%d",&pos);

        pos1=KMP(L1,L2,pos,next);

        printf("′ó%d&#206;&#187;&#214;&#195;&#191;aê&#188;&#206;a&#198;¥&#197;&#228;μ&#196;.\n",pos1);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-10-17 22:03:44 | 显示全部楼层
修改指针内容用二级指针
#include <stdio.h>
#include <stdlib.h>

#define max_size 100

typedef struct String
{
    char a[max_size];
    int length;
}String,*STRING;

void initString(STRING *L)         //3õê¼»ˉL
{  
    int i;
    printf("init length:");
    scanf("%d",&(*L)->length);         //Õa¸öêÇêäèë3¤¶è
    
    printf("start key in char:");
    for(i = 1; i <= (*L)->length; i++)
    {
        scanf("%c",&(*L)->a[i]);      //′óa¡¾1¡¿¿aê¼½øDDêäèë×Ö·û
        getchar();
    }
}

void get_next(STRING *L2,int next[])
{
    int i=1,j;
    j = 0;
    next[1] = 0;
    while(i <= (*L2)->length)
    {
        if(j == 0 || (*L2)->a[i] == (*L2)->a[j])
        {
            i++;
            j++;
            next[i] = j;
        }
        else
            j = next[j];
    }
}

int KMP(STRING *L1,STRING *L2,int pos,int next[])
{
    int i,j,flag = 0;
    i = pos;
    j = 1;
    while(i <= (*L1)->length && j <= (*L2)->length)
    {
        if(j == 0 || (*L1)->a[i] == (*L2)->a[j])
        {
            i++;
            j++;
        }
        else
        {
            j = next[j];
        }
    }
    if(i > (*L1)->a[0])
    {
        printf("KMP\n");
        exit(-1);
    }
    else
        return  i-(*L2)->a[0];
}        

int main()
{
    int next[20];
    int pos,pos1;
    //char ch[20]="abcac";
    STRING L1;
    STRING L2;
    L1=(STRING)malloc(sizeof(String));
    L2=(STRING)malloc(sizeof(String));
                                          
    initString(&L1);
    printf("1\n");
    initString(&L2);
    get_next(&L2,next);


    printf("here\n:");
    scanf("%d", &pos);

    pos1=KMP(&L1,&L2,pos,next);

    printf("there\n",pos1);
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-17 23:27:13 | 显示全部楼层
claws0n 发表于 2018-10-17 22:03
修改指针内容用二级指针

很感谢你的回复,但是还是没有解决问题,在初始化第二个串的时候还是出错。表现为无法继续输入。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-17 23:29:47 | 显示全部楼层
hhhh还好还好 发表于 2018-10-17 23:27
很感谢你的回复,但是还是没有解决问题,在初始化第二个串的时候还是出错。表现为无法继续输入。

你的还是我的?我加了 getchar() 吸收回车,尤其是循环内用 scanf(),特别敏感
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 03:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表