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