鱼C论坛

 找回密码
 立即注册
查看: 3022|回复: 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);
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

  3. #define max_size 100

  4. typedef struct String
  5. {
  6.     char a[max_size];
  7.     int length;
  8. }String,*STRING;

  9. void initString(STRING *L)         //3&#245;ê&#188;&#187;ˉL
  10. {  
  11.     int i;
  12.     printf("init length:");
  13.     scanf("%d",&(*L)->length);         //&#213;a&#184;&#246;ê&#199;ê&#228;è&#235;3¤&#182;è
  14.    
  15.     printf("start key in char:");
  16.     for(i = 1; i <= (*L)->length; i++)
  17.     {
  18.         scanf("%c",&(*L)->a[i]);      //′óa&#161;&#190;1&#161;&#191;&#191;aê&#188;&#189;&#248;DDê&#228;è&#235;×&#214;·&#251;
  19.         getchar();
  20.     }
  21. }

  22. void get_next(STRING *L2,int next[])
  23. {
  24.     int i=1,j;
  25.     j = 0;
  26.     next[1] = 0;
  27.     while(i <= (*L2)->length)
  28.     {
  29.         if(j == 0 || (*L2)->a[i] == (*L2)->a[j])
  30.         {
  31.             i++;
  32.             j++;
  33.             next[i] = j;
  34.         }
  35.         else
  36.             j = next[j];
  37.     }
  38. }

  39. int KMP(STRING *L1,STRING *L2,int pos,int next[])
  40. {
  41.     int i,j,flag = 0;
  42.     i = pos;
  43.     j = 1;
  44.     while(i <= (*L1)->length && j <= (*L2)->length)
  45.     {
  46.         if(j == 0 || (*L1)->a[i] == (*L2)->a[j])
  47.         {
  48.             i++;
  49.             j++;
  50.         }
  51.         else
  52.         {
  53.             j = next[j];
  54.         }
  55.     }
  56.     if(i > (*L1)->a[0])
  57.     {
  58.         printf("KMP\n");
  59.         exit(-1);
  60.     }
  61.     else
  62.         return  i-(*L2)->a[0];
  63. }        

  64. int main()
  65. {
  66.     int next[20];
  67.     int pos,pos1;
  68.     //char ch[20]="abcac";
  69.     STRING L1;
  70.     STRING L2;
  71.     L1=(STRING)malloc(sizeof(String));
  72.     L2=(STRING)malloc(sizeof(String));
  73.                                           
  74.     initString(&L1);
  75.     printf("1\n");
  76.     initString(&L2);
  77.     get_next(&L2,next);


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

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

  81.     printf("there\n",pos1);
  82.     return 0;
  83. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

很感谢你的回复,但是还是没有解决问题,在初始化第二个串的时候还是出错。表现为无法继续输入。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

你的还是我的?我加了 getchar() 吸收回车,尤其是循环内用 scanf(),特别敏感
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-22 18:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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