数据结构与算法~串的模式匹配~KMP匹配算法中next值的C语言源代码和测试数据

    next值的C语言源代码

#include<stdlib.h>
#include<stdio.h>
#define MAX 20
typedef struct {
	char *ch;
	int length;
}heapstring;

/*生成一个串*/
void Str_Assign(heapstring *s){
	if (!(s->ch=(char*)malloc(100*sizeof(char)))){
        printf ("容量满了!");/*空间分配失败*/
		exit(0);
	}else {		
        gets(s->ch);
       }
}

//求串的长度
int StrLen(heapstring *s){
	int len=0;
	while(s->ch[len]!='\0')  
		len++;
	return len;
}

/*打印一个串*/
void PrintString(heapstring *s){
	int i=0;
	if(!s->ch) 
		printf("\n串是空的!");
	else{
		printf("\n输入的串是:");
		while(s->ch[i]!='\0') 
			printf("%c",s->ch[i++]);
		printf("\t 串的长度是:%d",s->length);
      }/*if-else*/
}

//计算next值
void GetNext(heapstring *t,int next[]){
	int i=0,j=-1;
	next[0]=-1;
	while(i<t->length){
		if (j==-1||t->ch[i]==t->ch[j]){ 
			i++;
			j++; 
			next[i]=j;
		}
		else j=next[j];
	}
	printf("\tnext的值如下:\n");
	for(i=0;i<t->length;++i)
		printf("%c\t",t->ch[i]);
	printf("\n");
	for(i=0;i<t->length;++i)
		printf("%d\t",next[i]+1);
	printf("\n\n");
}

main(){
 int next[MAX];
 int pos,len,e; 
 heapstring t;
 printf("\n====输入匹配子串,继续请连续输入,退出输入0====\n");
 while (1){ 
	 Str_Assign(&t);
	 t.length=StrLen(&t);
	 PrintString(&t);
	 GetNext(&t,next);
	 scanf("%d",&e);
	 if (e==0)  exit (0);
 }
}

运行程序,输入一些测试数据,结果如下:


====输入匹配子串,继续请连续输入,退出输入0====
abcaababc

输入的串是:abcaababc     串的长度是:9   next的值如下:
a       b       c       a       a       b       a       b       c
0       1       1       1       2       2       3       2       3

aaabcaaba

输入的串是:aaabcaaba     串的长度是:9   next的值如下:
a       a       a       b       c       a       a       b       a
0       1       2       3       1       1       2       3       1

abaabcacb

输入的串是:abaabcacb     串的长度是:9   next的值如下:
a       b       a       a       b       c       a       c       b
0       1       1       2       2       3       1       2       1

abcabcacb

输入的串是:abcabcacb     串的长度是:9   next的值如下:
a       b       c       a       b       c       a       c       b
0       1       1       1       2       3       4       5       1

babbabab

输入的串是:babbabab      串的长度是:8   next的值如下:
b       a       b       b       a       b       a       b
0       1       1       2       2       3       4       3

abcdabcd

输入的串是:abcdabcd      串的长度是:8   next的值如下:
a       b       c       d       a       b       c       d
0       1       1       1       1       2       3       4

aaab

输入的串是:aaab  串的长度是:4   next的值如下:
a       a       a       b
0       1       2       3

abcaabbcabca

输入的串是:abcaabbcabca  串的长度是:12  next的值如下:
a       b       c       a       a       b       b       c       a       b       c       a
0       1       1       1       2       2       3       1       1       2       3       4

ababcdab

输入的串是:ababcdab      串的长度是:8   next的值如下:
a       b       a       b       c       d       a       b
0       1       1       2       3       1       1       2

ababcebcabc

输入的串是:ababcebcabc   串的长度是:11  next的值如下:
a       b       a       b       c       e       b       c       a       b       c
0       1       1       2       3       1       1       1       1       2       3

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值