/ **
*
* Calculate the next array of pattern string
*
*
*
*
*
* Copyright by Arter, 1998 - 2004
* /
#include
#include
#include
#include
Const int max_string_length = 999;
INT * GetNextArray (const char pattern []);
INT * GetNextValarray (const char pattern []);
INT WAIT ();
INT Main (int Argc, char * argv []) {
Char p [max_string_length];
INT I, M, * Next, * NextVAL
IF (argc <= 1) {
Printf ("USAGE: NEXT
Printf ("
Printf ("Next AbcaaAabca);
STRCPY (p, "abcaaaabca);
}
Else {
IF (Strlen (Argv [1])> MAX_STRING_LENGTH) Argv [1] [MAX_STRING_LENGTH] = '/ 0';
STRCPY (P, Argv [1]);
}
Next = getNextArray (P);
Nextval = getNextValarray (P);
M = strlen (p);
Printf ("/ n [index]:");
For (i = 0; i Printf ("/ n [pattern]:"); For (i = 0; i Printf ("/ n [next]:"); For (i = 0; i Free (next); Printf ("/ n [nextval]:"); For (i = 0; i Free (NextVal); Printf ("/ n"); IF (argc <= 1) Wait (); Return 0; } INT * GetNextArray (const char pattern []) { INT I, J; Int firstIndexofpattern, lengthofpattern; int * next Lengthofpattern = Strlen (Pattern); IF (LengthoftPattern <= 0) { Printf ("Error: Pattern Is Null!"); exit (0); } Else { Next = (int *) malloc (intend * lengthofpattern); FirstIndexOfPattern = 0; // The first index of array is 0 in the c language! } // Initialized Next [0] = -1 Next [firstindexofpattern] = firstIndexofpattern - 1; i = next [first "; J = firstIndexOfPattern 1; While (j While ((i> = firstindexofpattern) && (pattern [i]! = pattern [j-1])) { i = next [i]; } i ; / * The Difference Between "Next" and "nextval" IF ((i <= lastindexofpattern && (pattern [i] == pattern [j])) { Next [j] = next [i]; } Else {* / NEXT [J] = i; //} J ; } Return NEXT; } INT * GetNextValarray (const char pattern []) { INT I, J; Int firstIndexofpattern, Lengthofpattern; INT * NEXTVAL; Lengthofpattern = Strlen (Pattern); IF (LengthoftPattern <= 0) { Printf ("Error: Pattern Is Null!"); exit (0); } Else { Nextval = (int *) Malloc (intend * lengthofpattern); FirstIndexOfPattern = 0; // The first index of array is 0 in the c language! } // Initialized Next [0] = -1 NextVal [firstIndexofpattern] = firstIndexOfpattern - 1; i = nextVal [firstVal [first virtnexofpattern]; J = firstIndexOfPattern 1; While (j While ((i> = firstindexofpattern) && (pattern [i]! = pattern [j-1])) { i = nextVal [i]; } i ; IF (Pattern [i] == Pattern [J]) { NextVal [J] = nextVal [i]; Else { NEXTVAL [J] = i; } J ; } Return nextVal; } INT WAIT () { Printf ("/ n GetChar (); Return 1; }