www.pudn.com > datastructor.rar > SString.c
#include#include #define MAX 50 typedef unsigned char SString[MAX+1]; typedef enum {ERROR = -2,OVERLOW,FALSE, TRUE, OK} Status; Status StrAssign(SString T, const char* chars) { //生成一个其值等于串chars的串T int i; T[0] = strlen(chars); for(i = 1; i <= T[0]; ++i) { T[i] = chars[i-1]; } return OK; } Status Concat(SString T, const SString S1, const SString S2) { //用T返回由S1和S2联接而成的新串 int i; Status uncut; if(S1[0] + S2[0] <= MAX) { for(i = 1; i <= S1[0]; i++){ T[i] = S1[i]; } for(i = S1[0]+1; i <= S1[0]+S2[0]; i++){ T[i] = S2[i-S1[0]]; } T[0] = S1[0] + S2[0]; uncut = TRUE; } else if(S1[0] < MAX) { for(i = 1; i <= S1[0]; i++){ T[i] = S1[i]; } for(i = S1[0]+1; i <= MAX; i++){ T[i] = S2[i-S1[0]]; } T[0] = MAX; uncut = FALSE; } else { for(i = 0; i <= MAX; i++){ T[i] = S1[i]; } uncut = FALSE; } return uncut; } Status SubString(SString Sub, const SString S, int pos, int len) { //用Sub返回串S的第pos个字符起长度为len的子串 //其中,1 <= pos <= Stringth(s)且O <= len <= StringLength(S)-pos+1 int i; if(pos<1 || pos>S[0] || len<0 || len>S[0]-pos+1) return ERROR; for(i = 1; i <= len; i++){ Sub[i] = S[pos+i-1]; } Sub[0] = len; return OK; } int Index(const SString S, const SString T, int pos) { //返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数值为0 //其中,T非空,1 <= pos <= StrLength(S) int i = pos, j = 1; while(i <= S[0] && j <= T[0]) { if(S[i] == T[j]) { ++i; ++j; } //继续比较后继字符 else{ i = i-j+2; j = 1; } //指针后退重新开始匹配 } if(j > T[0]) return i-T[0]; else return 0; } //KMP算法 void get_next(SString T, int next[]) { //求模式串T的next函数值并存入数组next int i = 1, j = 0; next[1] = 0; while(i < T[0]){ if(j==0 || T[i]==T[j]){ ++i; ++j; next[i] = j; } else j = next[j]; } } int Index_KMP(SString S, SString T, int pos, int next[]) { //利用模式串T的next函数求T在主串中第pos个字符之后的位置的 //KMP算法。其中,T非空,1<=pos<=StrLength(S)。 int i = pos, j= 1; while(i <= S[0] && j <= T[0]){ if(j == 0 || S[i] == T[j]){ ++i; ++j; } else j = next[j]; } if(j > T[0]) return i-T[0]; else return 0; } //以下为测试程序 void output(const SString S){ //输出串S int i; for(i= 1; i<= S[0]; i++) printf("%c", S[i]); printf("\n"); } int main() { SString S1, S2, S3, S4; //int compare; StrAssign(S1, "ababcabcacbab"); output(S1); printf("The length of S1: %d\n", S1[0]); StrAssign(S2, "abcac"); output(S2); printf("The length of S2: %d\n", S2[0]); /* printf("\nCompare S1 to S2:\n"); compare = StrCompare(&S1, &S2); if(compare > 0) printf("S1 > S2.\n"); else if(compare == 0) printf("S1 = S2.\n"); else printf("S1 < S2\n"); */ printf("\nConnect String S1 to S2:\n"); Concat(S3, S1, S2); output(S3); printf("The length of S3: %d\n", S3[0]); //printf("%d\n", strlen(S3.ch)); printf("\nSubset of String:\n"); //子集 SubString(S4, S1, 1, 5); output(S4); /* printf("\nClear String S3:\n"); ClearString(&S3); printf("Length: %d\n", S3.length); free(S1.ch); free(S2.ch); if(S3.ch) { free(S3.ch);printf("Free S3.\n"); } free(S4.ch); */ printf("\nIndex String:\n"); printf("%d\n", Index(S3, S2, 1)); int next[10]; get_next(S2, next); printf("\nIndex using KMP:\n"); printf("%d\n", Index_KMP(S1, S2, 1, next)); system("pause"); return 0; }