diff --git a/▼配套习题解析/▼04 串/_v_images/20181128012650395_14443.png b/▼配套习题解析/▼04 串/_v_images/20181128012650395_14443.png new file mode 100644 index 0000000..18e5aba Binary files /dev/null and b/▼配套习题解析/▼04 串/_v_images/20181128012650395_14443.png differ diff --git a/▼配套习题解析/▼04 串/_v_images/20181128012749064_24270.png b/▼配套习题解析/▼04 串/_v_images/20181128012749064_24270.png new file mode 100644 index 0000000..30c45dc Binary files /dev/null and b/▼配套习题解析/▼04 串/_v_images/20181128012749064_24270.png differ diff --git a/▼配套习题解析/▼04 串/_v_images/20181128012817985_10766.png b/▼配套习题解析/▼04 串/_v_images/20181128012817985_10766.png new file mode 100644 index 0000000..d8f8933 Binary files /dev/null and b/▼配套习题解析/▼04 串/_v_images/20181128012817985_10766.png differ diff --git a/▼配套习题解析/▼04 串/_v_images/20181128013044407_30919.png b/▼配套习题解析/▼04 串/_v_images/20181128013044407_30919.png new file mode 100644 index 0000000..9320853 Binary files /dev/null and b/▼配套习题解析/▼04 串/_v_images/20181128013044407_30919.png differ diff --git a/▼配套习题解析/▼04 串/_v_images/20181128013157410_30749.png b/▼配套习题解析/▼04 串/_v_images/20181128013157410_30749.png new file mode 100644 index 0000000..f80b966 Binary files /dev/null and b/▼配套习题解析/▼04 串/_v_images/20181128013157410_30749.png differ diff --git a/▼配套习题解析/▼04 串/_v_images/20181128013251526_202.png b/▼配套习题解析/▼04 串/_v_images/20181128013251526_202.png new file mode 100644 index 0000000..de2a418 Binary files /dev/null and b/▼配套习题解析/▼04 串/_v_images/20181128013251526_202.png differ diff --git a/▼配套习题解析/▼04 串/_v_images/20181128013312950_14120.png b/▼配套习题解析/▼04 串/_v_images/20181128013312950_14120.png new file mode 100644 index 0000000..21e7846 Binary files /dev/null and b/▼配套习题解析/▼04 串/_v_images/20181128013312950_14120.png differ diff --git a/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.10-main.c b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.10-main.c new file mode 100644 index 0000000..54e136b --- /dev/null +++ b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.10-main.c @@ -0,0 +1,36 @@ +#include +#include "../../../α㷨ʵ/04 /01 SequenceString/SequenceString.c"//**04 **// + +/* ԭ */ +void Algo_4_10(SString T, SString S); + +int main(int argc, char *argv[]) +{ + char *s = "0123456789"; + SString T, S; + + printf("ǰT = "); + StrAssign_Sq(T, s); + StrPrint_Sq(T); + printf("\n\n"); + + printf("úS = "); + Algo_4_10(T, S); + StrPrint_Sq(S); + printf("\n\n"); + + return 0; +} + +/* +4.10TΪS +*/ +void Algo_4_10(SString T, SString S) +{ + int i; + + for(i=T[0]; i>=1; i--) + S[T[0]-i+1] = T[i]; + + S[0] = T[0]; +} diff --git a/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.11-main.c b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.11-main.c new file mode 100644 index 0000000..8865d2c --- /dev/null +++ b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.11-main.c @@ -0,0 +1,67 @@ +#include +#include "../../../α㷨ʵ/04 /01 SequenceString/SequenceString.c"//**04 **// + +/* ԭ */ +void Algo_4_11(SString R, SString S, SString T, int a[]); + +int main(int argc, char *argv[]) +{ + int a[MAXSTRLEN+1]; + char *s = "amdhcjgfdlpinbefcopgkqikeb"; + char *t = "mhjlpinopkqik"; + SString T, S, R; + int i; + + printf("ʼST...\n"); + StrAssign_Sq(S, s); + StrAssign_Sq(T, t); + printf("\n"); + + printf("S = "); + StrPrint_Sq(S); + printf("\n"); + printf("T = "); + StrPrint_Sq(T); + printf("\n\n"); + + Algo_4_11(R, S, T, a); + printf("R = "); + StrPrint_Sq(R); + printf("\n"); + printf("a = "); + for(i=1; i<=a[0]; i++) + printf("%d ", a[i]); + printf("\n\n"); + + return 0; +} + +/* +4.11r=s-st +*/ +void Algo_4_11(SString R, SString S, SString T, int a[]) //a0Ŵ洢aԪظ +{ + int i, p; + SString Tmp; + + StrAssign_Sq(R, ""); + Tmp[0] = 1; + + for(i=1,a[0]=0; i<=S[0]; i++) + { + Tmp[1] = S[i]; //S[i]Ϊ + + p = Index_Sq_1(T, Tmp, 1); //жS[i]ǷT + + if(!p) + p = Index_Sq_1(R, Tmp, 1); //жS[i]Ƿѳֹ + + if(!p) + { + a[0]++; + a[a[0]] = i; + StrInsert_Sq(R, a[0], Tmp); + } + } + +} diff --git a/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.12-main.c b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.12-main.c new file mode 100644 index 0000000..8a39711 --- /dev/null +++ b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.12-main.c @@ -0,0 +1,47 @@ +#include +#include "../../../α㷨ʵ/01 /Status.h" //**01 **// +#include "../../../α㷨ʵ/04 /01 SequenceString/SequenceString.c"//**04 **// + +/* ԭ */ +Status Algo_4_12(SString S, SString T, SString V); + +int main(int argc, char *argv[]) +{ + char *s = "----***--*-**-****-*****-----"; + char *t = "**"; + char *v = "^"; + SString T, S, V; + + printf("滻ǰ...\n"); + StrAssign_Sq(S, s); + StrAssign_Sq(T, t); + StrAssign_Sq(V, v); + printf("S = "); + StrPrint_Sq(S); + printf("\n"); + printf("T = "); + StrPrint_Sq(T); + printf("\n"); + printf("V = "); + StrPrint_Sq(V); + printf("\n\n"); + + printf("滻...\n"); + printf("S = "); + Algo_4_12(S, T, V); + StrPrint_Sq(S); + printf("\n\n"); + + return 0; +} + +/* +4.12ַ滻 +*/ +Status Algo_4_12(SString S, SString T, SString V) +{ + if(Replace_Sq(S, T, V)) //Ѷ + return OK; + else + return ERROR; +} diff --git a/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.13-main.c b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.13-main.c new file mode 100644 index 0000000..3ec1a8f --- /dev/null +++ b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.13-main.c @@ -0,0 +1,41 @@ +#include +#include "../../../α㷨ʵ/04 /01 SequenceString/SequenceString.c"//**04 **// + +/* ԭ */ +void Algo_4_13(SString S, SString T); + +int main(int argc, char *argv[]) +{ + char *s = "----***--*-**-****-*****-----"; + char *t = "**"; + SString T, S; + + printf("ɾǰ...\n"); + StrAssign_Sq(S, s); + StrAssign_Sq(T, t); + printf("S = "); + StrPrint_Sq(S); + printf("\n"); + printf("T = "); + StrPrint_Sq(T); + printf("\n\n"); + + printf("ɾ...\n"); + printf("S = "); + Algo_4_13(S, T); + StrPrint_Sq(S); + printf("\n\n"); + + return 0; +} + +/* +4.13ɾSаT +*/ +void Algo_4_13(SString S, SString T) +{ + int i; + + for(i=1; i=Index_Sq_1(S, T, 1); i++) + StrDelete_Sq(S, i, T[0]); +} diff --git a/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.14-main.c b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.14-main.c new file mode 100644 index 0000000..8386f22 --- /dev/null +++ b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.14-main.c @@ -0,0 +1,137 @@ +#include +#include +#include +#include +#include "../../../α㷨ʵ/01 /Status.h" //**01 **// +#include "../../../α㷨ʵ/02 Ա/01 SequenceList/SequenceList.c" //**02 Ա**// +#include "../../../α㷨ʵ/04 /01 SequenceString/SequenceString.c" //**04 **// + +/* 궨 */ +#define STACK_INIT_SIZE 100 //˳ջ洢ռijʼ +#define STACKINCREMENT 10 //˳ջ洢ռķ + +/* Ͷ */ +typedef SString SElemType; //ջԪΪַ +typedef struct //ջṹ +{ + SElemType *base; //ջ֮ǰ֮baseֵΪNULL + SElemType *top; //ջָ + int stacksize; //ǰѷĴ洢ռ䣬ԪΪλ +}SqStack; + +/* ԭ */ +Status InitStack_4_14(SqStack *S); //ַջijʼ +Status Push_4_14(SqStack *S, SElemType e); //ջ +Status Pop_4_14(SqStack *S, SElemType *e); //ջ +Status Algo_4_14(SqList P, SString Str); + +int main(int argc, char *argv[]) +{ + char *p = "-+a*bc/de"; //׺abc*+de/- + int i; + SqList P; + SString Str; + + InitList_Sq(&P); + for(i=1; i<=strlen(p); i++) + ListInsert_Sq(&P, i, p[i-1]); + printf("ǰ׺ʽP = "); + for(i=0; i=0; i--) //Ӻǰȡ + { + tmp[0] = 1; + tmp[1] = P.elem[i]; + + if(isalpha(P.elem[i])) //ջ + Push_4_14(&S, tmp); + else + { + Pop_4_14(&S, &e1); //ջ + Pop_4_14(&S, &e2); + + Concat_Sq(e1, e1, e2); //ջȷ + Concat_Sq(e1, e1, tmp); + + Push_4_14(&S, e1); //Ӻõַջ + } + } + + Pop_4_14(&S, &tmp); //תɺַ + StrCopy_Sq(Str, tmp); + + if(S.base==S.top) //ջӦΪ + return OK; + else + return ERROR; +} + +Status InitStack_4_14(SqStack *S) +{ + (*S).base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType)); + if(!(*S).base) + exit(OVERFLOW); + + (*S).top = (*S).base; + (*S).stacksize = STACK_INIT_SIZE; + + return OK; +} + +Status Push_4_14(SqStack *S, SElemType e) +{ + int i; + + if((*S).top-(*S).base>=(*S).stacksize) //ջ׷Ӵ洢ռ + { + (*S).base = (SElemType *)realloc((*S).base, ((*S).stacksize+STACKINCREMENT)*sizeof(SElemType)); + if(!(*S).base) + exit(OVERFLOW); //洢ʧ + (*S).top = (*S).base + (*S).stacksize; + (*S).stacksize += STACKINCREMENT; + } + + for(i=0; i<=e[0]; i++) + (*(S->top))[i] = e[i]; //ջȸֵջָ + + (S->top)++; + + return OK; +} + +Status Pop_4_14(SqStack *S, SElemType *e) +{ + int i; + + if((*S).top==(*S).base) + return ERROR; + + (*S).top--; //ջջָȵݼٸֵ + + for(i=0; i<=(*((*S).top))[0]; i++) + (*e)[i] = (*((*S).top))[i]; + + return OK; +} diff --git a/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.15~4.17-main.c b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.15~4.17-main.c new file mode 100644 index 0000000..b2bd4be --- /dev/null +++ b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.15~4.17-main.c @@ -0,0 +1,156 @@ +#include +#include "../../../α㷨ʵ/01 /Status.h" //**01 **// +#include "../../../α㷨ʵ/04 /01 SequenceString/SequenceString.c" //**04 **// + +/* ԭ */ +Status Algo_4_15(SString T, char *chars); +int Algo_4_16(SString S, SString T); +Status Algo_4_17(SString S, SString T, SString V); + +int main(int argc, char *argv[]) +{ + char *t = "ab**c*de***fg"; + char *s = "ab**c*de***fh"; + int i; + SString T, S, M1, M2; + + printf(" 4.15 ֤...\n"); + Algo_4_15(T, t); + Algo_4_15(S, s); + printf("T = "); + StrPrint_Sq(T); + printf("\n"); + printf("S = "); + StrPrint_Sq(S); + printf("\n\n"); + + printf(" 4.16 ֤...\n"); + i = Algo_4_16(S, T); + if(i>0) + printf("S > T\n"); + else if(i<0) + printf("S < T\n"); + else + printf("S == T\n"); + printf("\n"); + + printf(" 4.17 ֤...\n"); + Algo_4_15(M1, "**"); + Algo_4_15(M2, "^"); + Algo_4_17(S, M1, M2); + printf(" \"^\" 滻 \"**\" S = "); + StrPrint_Sq(S); + printf("\n\n"); + + return 0; +} + +/* +4.15ֵַ +*/ +Status Algo_4_15(SString T, char *chars) +{ + int i, len; + + len = strlen(chars); + + if(len>MAXSTRLEN) //chars + return ERROR; + else + { + T[0] = len; + for(i=1; i<=len; i++) + T[i] = chars[i-1]; //charsΪ + + return OK; + } +} + +/* +4.16ַȽϩ +*/ +int Algo_4_16(SString S, SString T) +{ + int i = 1; + + while(i<=S[0] && i<=T[0]) + { + if(S[i]==T[i]) + i++; + else + return S[i] - T[i]; + } + + return S[0] - T[0]; +} + +/* +4.17ַ滻 +*/ +Status Algo_4_17(SString S, SString T, SString V) +{ + int count = 1; //countS + int i, j, k; + SString Tmp_beh; + + i = count; + j = 1; + while(i>=1 && i<=S[0] && j<=T[0]) //Ѱҵһƥλ + { + if(S[i]==T[j]) + { + i++; + j++; + } + else + { + i = i - (j-1) +1; //j-1ͽ͵ǰj-1λ + j = 1; + } + } + if(j>T[0] && T[0]!=0) //TΪմ + count = i-T[0]; //ƥɹ + else + count = 0; + + while(S[0]-T[0]+V[0]<=MAXSTRLEN && count!=0) //ƥַҿԱȫ滻 + { + Tmp_beh[0] = S[0]-i+1; //ժȡSƥַַ֮Tmp_beh + for(k=1; k<=S[0]-i+1; k++) + Tmp_beh[k] = S[k+i-1]; + + S[0] = S[0]-T[0]+V[0]; + for(k=1; k<=V[0]; k++) //VS + S[k+count-1] = V[k]; + + for(k=count+V[0]; k<=S[0]; k++) //ȡSеĺ벿ֵS + S[k] = Tmp_beh[k-count-V[0]+1]; + + count += V[0]; //iлһλ + + i = count; + j = 1; + while(i>=1 && i<=S[0] && j<=T[0]) //λһƥַ + { + if(S[i]==T[j]) + { + i++; + j++; + } + else + { + i = i - (j-1) +1; //j-1ͽ͵ǰj-1λ + j = 1; + } + } + if(j>T[0] && T[0]!=0) //TΪմ + count = i-T[0]; //ƥɹ + else + count = 0; + } + + if(count==0) //SеTȫ滻 + return OK; + else //STVѾ岻ȥ + return ERROR; +} diff --git a/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.18-main .c b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.18-main .c new file mode 100644 index 0000000..36f7696 --- /dev/null +++ b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.18-main .c @@ -0,0 +1,48 @@ +#include +#include "../../../α㷨ʵ/01 /Status.h" //**01 **// +#include "../../../α㷨ʵ/04 /01 SequenceString/SequenceString.c" //**04 **// + +/* ԭ */ +void Algo_4_18(SString S, int total[]); + +int main(int argc, char *argv[]) +{ + char *s = "dbasydujhge638940[gptokljrsehgadcsbnmv,c.b'ng[p098437eywdghswqdecxvghju"; + SString S; + int total[128] = {}; + int i; + + StrAssign_Sq(S, s); + printf("S = "); + StrPrint_Sq(S); + printf("\n\n"); + + Algo_4_18(S, total); + printf(" S вַͬ %d \n", total[0]); + for(i=1; i<=127; i++) + { + if(total[i]!=0) + printf("ַ \'%c\' %d .\n", i, total[i]); + } + printf("ͳ...\n"); + printf("\n"); + + return 0; +} + +/* +4.18ͳַвַͬÿַĸ +*/ +/* ֶַӦ */ +void Algo_4_18(SString S, int total[]) //totalΪ128ֲַͬ +{ + int i; + + for(i=1; i<=S[0]; i++) //ַм޿ַ + { + if(!total[S[i]]) //˴ַ + total[0]++; //ַͬ + + total[S[i]]++; //ַ + } +} diff --git a/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.19-main .c b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.19-main .c new file mode 100644 index 0000000..0d1a5d9 --- /dev/null +++ b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.19-main .c @@ -0,0 +1,83 @@ +#include +#include "../../../α㷨ʵ/04 /01 SequenceString/SequenceString.c"//**04 **// + +/* ԭ */ +void Algo_4_19(SString R, SString S, SString T, int a[]); + +int main(int argc, char *argv[]) +{ + int a[MAXSTRLEN+1]; + char *s = "amdhcjgfdlpinbefcopgkqikeb"; + char *t = "mhjlpinopkqik"; + SString T, S, R; + int i; + + printf("ʼST...\n"); + StrAssign_Sq(S, s); + StrAssign_Sq(T, t); + printf("\n"); + + printf("S = "); + StrPrint_Sq(S); + printf("\n"); + printf("T = "); + StrPrint_Sq(T); + printf("\n\n"); + + Algo_4_19(R, S, T, a); + printf("R = "); + StrPrint_Sq(R); + printf("\n"); + printf("a = "); + for(i=1; i<=a[0]; i++) + printf("%d ", a[i]); + printf("\n\n"); + + return 0; +} + +/* +4.19r=s-st +*/ +void Algo_4_19(SString R, SString S, SString T, int a[]) //a0Ŵ洢aԪظ +{ + int i, j, k; + int flag; + + a[0] = 0; + R[0] = 0; //ʼR + + for(i=1; i<=S[0]; i++) + { + flag = 0; + + for(j=1; j<=T[0]; j++) + { + if(S[i]==T[j]) + { + flag = 1; + break; + } + } + + if(!flag) //S[i]еԪزT + { + for(k=1; k<=R[0]; k++) + { + if(S[i]==R[k]) + { + flag = 1; + break; + } + } + } + + if(!flag) //S[i]R + { + R[0]++; + a[0]++; + R[R[0]] = S[i]; + a[a[0]] = i; + } + } +} diff --git a/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.20-main .c b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.20-main .c new file mode 100644 index 0000000..74ae00e --- /dev/null +++ b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.20-main .c @@ -0,0 +1,85 @@ +#include +#include "../../../α㷨ʵ/04 /01 SequenceString/SequenceString.c"//**04 **// + +/* ԭ */ +void Algo_4_20(SString S, SString T); + +int main(int argc, char *argv[]) +{ + char *s = "----***--*-**-****-*****-----"; + char *t = "**"; + SString T, S; + + printf("ɾǰ...\n"); + StrAssign_Sq(S, s); + StrAssign_Sq(T, t); + printf("S = "); + StrPrint_Sq(S); + printf("\n"); + printf("T = "); + StrPrint_Sq(T); + printf("\n\n"); + + printf("ɾ...\n"); + printf("S = "); + Algo_4_20(S, T); + StrPrint_Sq(S); + printf("\n\n"); + + return 0; +} + +/* +4.20ɾSаT +*/ +void Algo_4_20(SString S, SString T) +{ + int i, j, k; + + i = 1; + j = 1; + while(i<=S[0] && j<=T[0]) //Ѱҵһƥλ + { + if(S[i]==T[j]) + { + i++; + j++; + } + else + { + i = i - (j-1) +1; //j-1ͽ͵ǰj-1λ + j = 1; + } + } + if(j>T[0] && T[0]) //TΪմ + i = i-T[0]; //ƥɹ + else + i = 0; + + while(i!=0) //ƥַ + { + for(k=i+T[0]; k<=S[0]; k++) + S[k-T[0]] = S[k]; + S[0] = S[0] - T[0]; //ıS + + j = 1; + while(i<=S[0] && j<=T[0]) //λһƥַ + { + if(S[i]==T[j]) + { + i++; + j++; + } + else + { + i = i - (j-1) +1; //j-1ͽ͵ǰj-1λ + j = 1; + } + } + + if(j>T[0] && T[0]!=0) //TΪմ + i = i-T[0]; //ƥɹ + else + i = 0; + } +} diff --git a/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.21-main .c b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.21-main .c new file mode 100644 index 0000000..b423131 --- /dev/null +++ b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.21-main .c @@ -0,0 +1,233 @@ +#include +#include +#include "../../../α㷨ʵ/01 /Status.h" //**01 **// +#include "../../../α㷨ʵ/02 Ա/04 SinglyLinkedList/SinglyLinkedList.c" //**02 Ա**// + +/* Ͷ */ +typedef LElemType_L strElem; +typedef LNode strNode; +typedef LinkList String; + +/* ԭ */ +Status StrAssign_4_21(String *S, char *chars); +Status StrCopy_4_21(String *S, String T); +int StrCompare_4_21(String S, String T); +int StrLength_4_21(String S); +Status Concat_4_21(String *R, String S, String T); +Status SubString_4_21(String *Sub, String S, int pos, int len); +void StrPrint_4_21(String S); + +int main(int argc, char *argv[]) +{ + char *chars = "@@***#*%%%****(((((*****)))"; + String S, T, R, Sub; + int i; + + StrAssign_4_21(&T, chars); + printf("T = "); + StrPrint_4_21(T); + printf("\n\n"); + + StrCopy_4_21(&S, T); + printf("S = "); + StrPrint_4_21(S); + printf("\n\n"); + + i = StrCompare_4_21(S, T); + if(i>0) + printf("S > T\n"); + else if (i<0) + printf("S < T\n"); + else + printf("S = T\n"); + printf("\n"); + + i = StrLength_4_21(S); + printf("S_len = %d\n", i); + printf("\n"); + + Concat_4_21(&R, S, T); + printf("R = "); + StrPrint_4_21(R); + printf("\n\n"); + + SubString_4_21(&Sub, S, 11, 4); + printf("Sub = "); + StrPrint_4_21(Sub); + printf("\n\n"); + + return 0; +} + +/* +4.21ֵַ +*/ +/* (1) */ +Status StrAssign_4_21(String *S, char *chars) +{ + int i, len; + String s, p; + + len = strlen(chars); + + InitList_L(S); + + for(i=1,p=*S; i<=len; i++) + { + s = (String)malloc(sizeof(strNode)); + if(!s) + exit(OVERFLOW); + s->data = chars[i-1]; + + s->next = p->next; + p->next = s; + p = p->next; + } + + return OK; +} + +/* +4.21ַƩ +*/ +/* (2) */ +Status StrCopy_4_21(String *S, String T) +{ + String r, p, s; + + if(!T) + return ERROR; + + InitList_L(S); + + for(r=*S,p=T->next; p; p=p->next) + { + s = (String)malloc(sizeof(strNode)); + if(!s) + exit(OVERFLOW); + s->data = p->data; + + s->next = r->next; + r->next = s; + r = r->next; + } + + return OK; +} + +/* +4.21ַȽϩ +*/ +/* (3) */ +int StrCompare_4_21(String S, String T) +{ + String p, q; + + if(S && T) + { + p = S->next; + q = T->next; + + while(p && q) + { + if(p->data!=q->data) + return p->data - q->data; + + p = p->next; + q = q->next; + } + + return ListLength_L(S)-ListLength_L(T); + } +} + +/* +4.21ַ󳤩 +*/ +/* (4) */ +int StrLength_4_21(String S) +{ + return ListLength_L(S); +} + +/* +4.21ַƴө +*/ +/* (5) */ +Status Concat_4_21(String *R, String S, String T) +{ + String r, p, s; + + if(!S || !T) + return ERROR; + + InitList_L(R); + + for(r=*R,p=S->next; p; p=p->next) + { + s = (String)malloc(sizeof(strNode)); + if(!s) + exit(OVERFLOW); + s->data = p->data; + + s->next = r->next; + r->next = s; + r = r->next; + } + + for(p=T->next; p; p=p->next) + { + s = (String)malloc(sizeof(strNode)); + if(!s) + exit(OVERFLOW); + s->data = p->data; + + s->next = r->next; + r->next = s; + r = r->next; + } + +} + +/* +4.21ַȡ +*/ +/* (6) */ +Status SubString_4_21(String *Sub, String S, int pos, int len) +{ + int i, sl; + String r, p, s; + + sl = StrLength_4_21(S); + + if(!S || pos<1 || pos>sl || len<0 || pos+len-1>sl) + return ERROR; + + InitList_L(Sub); + + for(i=1,p=S->next; inext) + ; //Ѱҵpos + + for(i=1,r=*Sub; i<=len; i++,p=p->next) + { + s = (String)malloc(sizeof(strNode)); + if(!s) + exit(OVERFLOW); + s->data = p->data; + + s->next = r->next; + r->next = s; + r = r->next; + } + + return OK; +} + +/* ַ */ +void StrPrint_4_21(String S) +{ + String p; + + for(p=S->next; p; p=p->next) + printf("%c", p->data); +} diff --git a/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.22-main .c b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.22-main .c new file mode 100644 index 0000000..c85915c --- /dev/null +++ b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.22-main .c @@ -0,0 +1,50 @@ +#include +#include "../../../α㷨ʵ/04 /03 BlockChainString/BlockChainString.c"//**04 **// + +/* ԭ */ +void Algo_4_22(LString S, LString *T, char ch); + +int main(int argc, char *argv[]) +{ + char *t = "----***--*-**-**^**-*****-----"; + char *s = "12345"; + char ch = '^'; + LString T, S; + + StrAssign_L(&T, t); + StrAssign_L(&S, s); + printf("T = "); + StrPrint_L(T); + printf("\n"); + printf("S = "); + StrPrint_L(S); + printf("\n\n"); + + Algo_4_22(S, &T, ch); + printf("T = "); + StrPrint_L(T); + printf("\n\n"); + + return 0; +} + +/* +4.22S뵽Tijַ֮Tĩλ +*/ +void Algo_4_22(LString S, LString *T, char ch) +{ + int i; + char tmp[2]; + LString Tmp; + + tmp[0] = ch; + tmp[1] = '\0'; + StrAssign_L(&Tmp, tmp); + + i = Index_L((*T), Tmp, 1); //ѰַchTеλ + + if(i) + StrInsert_L(T, i+1, S); //STĵi+1ַǰ + else + StrInsert_L(T, (*T).curlen+1, S); //ST +} diff --git a/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.23-main .c b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.23-main .c new file mode 100644 index 0000000..c6f84a6 --- /dev/null +++ b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.23-main .c @@ -0,0 +1,70 @@ +#include +#include "../../../α㷨ʵ/03 ջͶ/01 SequenceStack/SequenceStack.c"//**03 ջͶ**// +#include "../../../α㷨ʵ/04 /03 BlockChainString/BlockChainString.c"//**04 **// + +/* ԭ */ +Status Algo_4_23(LString T); + +int main(int argc, char *argv[]) +{ + char *t = "abcdefgfedcba"; + LString T; + + StrAssign_L(&T, t); + printf("T = "); + StrPrint_L(T); + printf("\n\n"); + + Algo_4_23(T) ? printf("TǶԳƴ") : printf("TǷǶԳƴ"); + printf("\n\n"); + + return 0; +} + +/* +4.23жϴǷԳƩ +*/ +/* ջIJʵִ˺ջԪضΪchar */ +Status Algo_4_23(LString T) +{ + int i, j, m; + SqStack S; + SElemType_Sq e; + Chunk *p; + + if(!(T.curlen)) + return OK; + + InitStack_Sq(&S); + m = T.curlen/2; + + for(i=1,p=T.head,j=0; i<=m; i++) + { + Push_Sq(&S, p->ch[j]); + j = (j+1) % CHUNKSIZE; + if(!j) + p = p->next; + } + + if(T.curlen % 2) //Ϊһַ + { + i++; + j = (j+1) % CHUNKSIZE; + if(!j) + p = p->next; + } + + while(!StackEmpty_Sq(S) && i<=T.curlen) + { + Pop_Sq(&S, &e); + if(e!=p->ch[j]) + return ERROR; + i++; + j = (j+1) % CHUNKSIZE; + if(!j) + p = p->next; + } + + if(StackEmpty_Sq(S) && i>T.curlen) + return OK; +} diff --git a/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.24~4.26-main .c b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.24~4.26-main .c new file mode 100644 index 0000000..af0e34e --- /dev/null +++ b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.24~4.26-main .c @@ -0,0 +1,91 @@ +#include +#include "../../../α㷨ʵ/01 /Status.h" //**01 **// +#include "../../../α㷨ʵ/04 /02 HeapString/HeapString.c"//**04 **// + +/* ԭ */ +Status Concat_4_24(HString *T, HString S1, HString S2); +Status Replace_4_25(HString *S, HString T, HString V); +Status StrInsert_4_26(HString *S, int pos, HString T); + +int main(int argc, char *argv[]) +{ + char *s = "---*^***^*^*^*---"; + char *s1 = "*"; + char *s2 = "^*"; + char *v = "*_*"; + HString S1, S2, T, V, S; + + StrAssign_H(&S1, s1); + StrAssign_H(&S2, s2); + StrAssign_H(&V, v); + StrAssign_H(&S, s); + + printf("S1 = "); + StrPrint_H(S1); + printf("\n"); + printf("S2 = "); + StrPrint_H(S2); + printf("\n"); + printf("V = "); + StrPrint_H(V); + printf("\n"); + printf("S = "); + StrPrint_H(S); + printf("\n\n"); + + printf(" 4.24 ֤...\n"); + printf("S1S2ΪT...\n"); + Concat_4_24(&T, S1, S2); + printf("T = "); + StrPrint_H(T); + printf("\n\n"); + + printf(" 4.25 ֤...\n"); + printf(" V 滻 S е T...\n"); + Replace_4_25(&S, T, V); + printf("S = "); + StrPrint_H(S); + printf("\n\n"); + + printf(" 4.26 ֤...\n"); + printf(" T 뵽 S ĵ 2 ַǰ...\n"); + StrInsert_4_26(&S, 2, T); + printf("S = "); + StrPrint_H(S); + printf("\n\n"); + + return 0; +} + +/* +4.24ө +*/ +Status Concat_4_24(HString *T, HString S1, HString S2) +{ + if(Concat_H(T, S1, S2)) //Ѷ + return OK; + else + return ERROR; +} + +/* +4.25滻 +*/ +Status Replace_4_25(HString *S, HString T, HString V) +{ + if(Replace_H(S, T, V)) //Ѷ + return OK; + else + return ERROR; +} + +/* +4.26멧 +*/ +Status StrInsert_4_26(HString *S, int pos, HString T) +{ + if(StrInsert_H(S, pos, T)) //Ѷ + return OK; + else + return ERROR; +} diff --git a/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.27-main .c b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.27-main .c new file mode 100644 index 0000000..05034a8 --- /dev/null +++ b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.27-main .c @@ -0,0 +1,60 @@ +#include +#include "../../../α㷨ʵ/01 /Status.h" //**01 **// +#include "../../../α㷨ʵ/04 /01 SequenceString/SequenceString.c" //**04 **// + +/* ԭ */ +int Algo_4_27(SString S, SString T, int pos); + +int main(int argc, char *argv[]) +{ + char *s = "aaaaaaaaaaaaaaab"; + char *t = "aaaab"; + SString S, T; + + StrAssign_Sq(S, s); + StrAssign_Sq(T, t); + printf("S = "); + StrPrint_Sq(S); + printf("\n"); + printf("T = "); + StrPrint_Sq(T); + printf("\n\n"); + + printf("TS״γֵλΪ"); + printf("%d\n", Algo_4_27(S, T, 1)); + printf("\n"); + + return 0; +} + +/* +4.27Ӵλ +*/ +int Algo_4_27(SString S, SString T, int pos) +{ + int i = pos; + int j = 1; + + if(pos<1) + return 0; + + while(i<=S[0] && j<=T[0]) + { + + if((j!=1&&S[i]==T[j])||(j==1&&S[i]==T[j]&&S[i+T[0]-1]==T[T[0]])) + { + i++; + j++; + } + else + { + i = i - (j-1) +1; + j = 1; + } + } + + if(j>T[0] && T[0]) //TΪմ + return i-T[0]; //ƥɹ + else + return 0; +} diff --git a/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.28~4.29-main .c b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.28~4.29-main .c new file mode 100644 index 0000000..ebe91c5 --- /dev/null +++ b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.28~4.29-main .c @@ -0,0 +1,204 @@ +#include +#include +#include "../../../α㷨ʵ/01 /Status.h" //**01 **// + +/* ṹͶ */ +typedef struct strLNode //Ǹ˫ѭģʽδnextֵ֮ǰ +{ + char chdata; + struct strLNode *succ; //succָ + struct strLNode *next; //nextУָǰ +}strLNode; //nextģʽУָǰʧʱһӦñȽϵĽ +typedef strLNode *LString; + +/* ԭ */ +Status Algo_4_28_1(LString T); +Status Algo_4_28_2(LString T) ; +int Algo_4_29(LString S, LString T, int pos); +Status AssignLString(LString *S, char *s); +Status PrintLString(LString S); + +int main(int argc, char *argv[]) +{ + int pos, i1, i2; + LString S, T1, T2; + char *s = "abaaabaababaabcaabaabcacabaabcaabaabcac"; + char *t = "abaabcac"; + LString p; + AssignLString(&S, s); // + AssignLString(&T1, t); //ģʽ + AssignLString(&T2, t); + + printf(" S = "); + PrintLString(S); + printf("\n"); + printf("ģʽ T1 = "); + PrintLString(T1); + printf("\n"); + printf("ģʽ T2 = "); + PrintLString(T2); + printf("\n\n"); + + printf(" 4.28 ֤...\n"); + Algo_4_28_1(T1); + Algo_4_28_2(T2); + printf("next...\n"); + printf("\n"); + + printf(" 4.29 ֤...\n"); + i1 = Algo_4_29(S, T1, 1); + printf("ģʽ T1 %d ַһƥɹλΪi1 = %d\n", 1, i1); + + i2 = Algo_4_29(S, T2, 1); + printf("ģʽ T2 %d ַһƥɹλΪi2 = %d\n", 1, i2); + printf("\n"); + + return 0; +} + +/* +4.28-1nextֵ +*/ +/* 1nextֵ */ +Status Algo_4_28_1(LString T) +{ + strLNode *i, *j; + + if(!T || !T->succ) + return ERROR; + + i = T->succ; //i = 1 + j = T; //j = 0 + + i->next = T; //һַʧ + + while(i->succ) + { + if(j==T || i->chdata==j->chdata) + { + i = i->succ; + j = j->succ; + i->next = j; + } + else + j = j->next; + } + + return OK; +} + +/* +4.28-2nextֵ +*/ +/* 2nextvalֵĽnext */ +Status Algo_4_28_2(LString T) +{ + strLNode *i, *j; + + if(!T || !T->succ) + return ERROR; + + i = T->succ; //i = 1 + j = T; //j = 0 + + i->next = T; //һַʧ + + while(i->succ) + { + if(j==T || i->chdata==j->chdata) + { + i = i->succ; + j = j->succ; + + if(i->chdata!=j->chdata) + i->next = j; + else + i->next = j->next; + } + else + j = j->next; + } + + return OK; +} + +/* +4.29KMP㷨 +*/ +int Algo_4_29(LString S, LString T, int pos) +{ + int count, m; + strLNode *i, *j; //iSjT + strLNode *p, *q; + + if(pos<1 || !S || !S->succ || !T || !T->succ) + return 0; + + for(count=1,i=S->succ; countsucc) + ; //iָpos + + j = T->succ; + p = i; + + while(i && j) + { + if(j==T || i->chdata==j->chdata) + { + i = i->succ; + j = j->succ; + } + else + { + j = j->next; + if(j==T->succ) + p = i; //¿ʼƥʱi + } + } + + if(!j) + { + for(count=1,q=S->succ; q!=p; count++,q=q->succ) + ; //ҳһƥλ + return count; + } + else + return 0; +} + +Status AssignLString(LString *S, char *s) +{ + int i; + LString pre, p; + + *S = (LString)malloc(sizeof(strLNode)); + if(!(*S)) + exit(OVERFLOW); + (*S)->next = (*S)->succ = NULL; + + for(i=0,pre=*S; ichdata = s[i]; + p->next = pre; + p->succ = pre->succ; + pre->succ = p; + pre = pre->succ; + } + + return OK; +} + +Status PrintLString(LString S) +{ + LString p; + + if(!S) + return ERROR; + + for(p=S->succ; p; p=p->succ) + printf("%c", p->chdata); + + return OK; +} diff --git a/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.30-main .c b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.30-main .c new file mode 100644 index 0000000..506b53b --- /dev/null +++ b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.30-main .c @@ -0,0 +1,80 @@ +#include +#include "../../../α㷨ʵ/04 /01 SequenceString/SequenceString.c"//**04 **// + +/* ԭ */ +Status Algo_4_30(SString S, SString Sub, int *pos); + +int main(int argc, char *argv[]) +{ + char *s = "abcdeabcabcbcdefbcdefefghefgh"; + SString Sub, S; + int pos; + + StrAssign_Sq(S, s); + printf("...\n"); + printf("S = "); + StrPrint_Sq(S); + printf("\n\n"); + + printf("׸ظӴ...\n"); + printf("Sub = "); + Algo_4_30(S, Sub, &pos); + StrPrint_Sq(Sub); + printf("\n"); + printf("Sub S״γֵλΪ %d\n", pos); + printf("\n"); + + return 0; +} + +/* +4.30״γֵظӴλé +*/ +/* +**˴ظӴ㺬壺 +**һӴظӴ׸ģ +**ڶӴصȡabcabcaĽΪabca +**ӴڿظȡaaaaĽΪaaa +*/ +Status Algo_4_30(SString S, SString Sub, int *pos) //0ŵԪ +{ + int i, j, k, len, start, end; + + if(S[0]<2) //Ԫظ2 + return ERROR; + + Sub[0] = 0; + + for(k=1; kSub[0] && start+len-1>=end-1 ) //֤Ժ + { + *pos = start; + SubString_Sq(Sub, S, start, len); + } + } + } + + if(Sub[0]) + return OK; + else + return ERROR; +} diff --git a/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.31-main .c b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.31-main .c new file mode 100644 index 0000000..0f8b255 --- /dev/null +++ b/▼配套习题解析/▼04 串/▼习题测试文档-04/Question-4.31-main .c @@ -0,0 +1,162 @@ +#include +#include "../../../α㷨ʵ/01 /Status.h" //**01 **// +#include "../../../α㷨ʵ/04 /01 SequenceString/SequenceString.c"//**04 **// + +/* 궨 */ +#define Sl 2000 + +/* Ͷ */ +typedef struct +{ + SString String; //ijĹ + int start; //ַ +}PString; +typedef struct +{ + PString Sub[MAXSTRLEN+1]; + int count; +}StringSet; //Ӵ + +/* ԭ */ +Status Algo_4_31(SString S, SString T, StringSet *Set_s, StringSet *Set_t); +Status StringSetPrint(StringSet Set); + +int main(int argc, char *argv[]) +{ + char *s = "abcd*lokis***hyuij**vfgh*lokis****yu*mklng***u****wy*c*vdgry*pklnh"; + char *t = "-vdgry--vfgh-hyuij---abcd-pklnh---yu----lokis-----uio-u--wy---mklng-c "; + SString S, T; + StringSet Set_s, Set_t; + + printf("ʼ...\n"); + StrAssign_Sq(S, s); + StrAssign_Sq(T, t); + printf("S = "); + StrPrint_Sq(S); + printf("\n"); + printf("T = "); + StrPrint_Sq(T); + printf("\n\n"); + + printf("ȡӴļ...\n"); + Algo_4_31(S, T, &Set_s, &Set_t); + printf("\n"); + + printf(" S йӴϢ...\n"); + StringSetPrint(Set_s); + printf("\n"); + + printf(" T йӴϢ...\n"); + StringSetPrint(Set_t); + printf("\n"); + + return 0; +} + +/* +4.31Ӵ +*/ +/* ṹStringSet洮SʹTеӴʼλú */ +Status Algo_4_31(SString S, SString T, StringSet *Set_s, StringSet *Set_t) +{ + int i, j; //iSjT + int m, n; + int k, flag; + int len[MAXSTRLEN+1][MAXSTRLEN+1]; + + if(!S[0] || !T[0]) //ַΪ + return ERROR; + + for(m=0; m<=T[0]; m++) //ʼΪ0 + len[m][0] = 0; + for(n=0; n<=S[0]; n++) //ʼΪ0 + len[0][n] = 0; + + m = T[0]+1; + n = 1; + while(n<=S[0]) + { + m>1 ? m-- : n++; + + for(i=m,j=n; i<=T[0]&&j<=S[0]; i++,j++) + { + if(T[i]==S[j]) + len[i][j] = len[i-1][j-1] + 1; + else + len[i][j] = 0; + + if(len[i][j]>len[m-1][n-1]) + len[m-1][n-1] = len[i][j]; + + if(len[i][j]>len[0][S[0]]) + len[T[0]][0] = len[0][S[0]] = len[i][j]; + } + } + + if(!len[0][S[0]])//ַӴ + return ERROR; + + m = T[0]+1; + n = 1; + (*Set_s).count = (*Set_t).count = 0; + + while(n<=S[0]) + { + m>1 ? m-- : n++; + + if(len[m-1][n-1]==len[0][S[0]])//Ӵ + { + for(i=m,j=n; i+len[0][S[0]]-1<=T[0]&&j+len[0][S[0]]-1<=S[0]; i++,j++) + { + if(len[i+len[0][S[0]]-1][j+len[0][S[0]]-1]==len[0][S[0]])//ַ + { + for(k=1,flag=0; k<=(*Set_t).count; k++)//ǷѼT + { + if((*Set_t).Sub[k].start==i) + { + flag = 1; + break; + } + } + + if(!flag)//ռTгֵַ + { + (*Set_t).count++; + (*Set_t).Sub[(*Set_t).count].start = i; + SubString_Sq((*Set_t).Sub[(*Set_t).count].String, T, i, len[T[0]][0]); + } + + for(k=1,flag=0; k<=(*Set_s).count; k++)//ǷѼS + { + if((*Set_s).Sub[k].start==j) + { + flag = 1; + break; + } + } + + if(!flag)//ռSгֵַ + { + (*Set_s).count++; + (*Set_s).Sub[(*Set_s).count].start = j; + SubString_Sq((*Set_s).Sub[(*Set_s).count].String, S, j, len[0][S[0]]); + } + } + } + } + } + + return OK; +} + +Status StringSetPrint(StringSet Set) +{ + int i, j, k; + + for(k=1; k<=Set.count; k++) + { + printf(" %2d λã", Set.Sub[k].start); + StrPrint_Sq(Set.Sub[k].String); + printf("\n"); + } +} diff --git a/▼配套习题解析/▼04 串/▼第04章 串.md b/▼配套习题解析/▼04 串/▼第04章 串.md new file mode 100644 index 0000000..cfab110 --- /dev/null +++ b/▼配套习题解析/▼04 串/▼第04章 串.md @@ -0,0 +1,192 @@ +# 第4章 串 + +## 一、基础知识题 + +### 4.1 简述空串和空格串(或称空格符串)的区别。 + +> 一个空字符为:‘\0’ ,一个空格字符为:‘ ’ 。空串是只包含一个空字符的字符串,其长度为0。 +> 空格串是除了在结尾包含空字符外,还包含若干空格字符的字符串,统计其长度时,要将除空字符外的字符个数都计算在内。 + +### 4.2 对于教科书4.1节中所述串的各个基本操作,讨论是否可由其他基本操作构造而得,如何构造? + +> 对于串操作中的最小操作子集,即串赋值(StrAssign)、串比较(StrCompare)、求串长(StrLength)、串联接(Conact)以及求子串(SubString)5种操作不可由其他操作来实现。 +> 其他串操作则可利用串的最小操作子集实现。 + +### 4.3 设s = ‘I AM A STUDENT’,t = ‘GOOD’,q = ‘WORKER’。 +##### 求:StrLength(s),StrLength(t),SubString(s, 8, 7),SubString(t, 2, 1),Index(s, ‘A’),Index(s, t),Replace(s, ‘STUDENT’, q),Concat(SubString(s, 6, 2), Concat(t, SubString(s, 7, 8)))。 + +> StrLength(s) = 14; +> StrLength(t) = 4; +> SubString(s, 8, 7) = ‘STUDENT’; +> SubString(t, 2, 1) = ‘O’; +> Index(s, ‘A’) = 3; +> Index(s, t) = 0; +> Replace(s, ‘STUDENT’, q) = ‘I AM A WORKER’; +> Concat(SubString(s, 6, 2), Concat(t, SubString(s, 7, 8))) = ‘A GOOD STDENT’. + +### 4.4 已知下列字符串 +##### a = ‘THIS’, f = ‘A SAMPLE’, c = ‘GOOD’, d = ‘NE’, b = ‘ ’. +##### s = Concat(a, Concat(SubString(f, 2, 7), Concat(b, SubString(a, 3, 2)))), +##### t = Replace(f, SubString(f, 3, 6), c), +##### u = Concat(SubString(c, 3, 1), d), +##### g = ‘IS’, +##### v = Concat(s, Concat(b, Concat(t, Concat(b, u)))), +##### 试问:s,t,v,StrLength(s),Index(v, g),Index(u, g)各是什么? + +> s = ‘THIS SAMOLE IS’; +> t = ‘A GOOD’; +> v = ‘THIS SAMPLE IS A GOOD ONE’; +> StrLength(s) = 14; +> Index(v, g) = 3; +> Index(u, g) = 0. + +### 4.5 试问执行以下函数会产生怎样的输出结果? + +```c +void demonstrate() +{ + StrAssign(s, ‘THIS IS A BOOK’); + Replace(s, SubString(s, 3, 7), ‘ESE ARE’); + StrAssign(t, Concat(s, ‘S’)); + StrAssign(u, ‘XYXYXYXYXYXY’); + StrAssign(v, SubString(u, 6, 3)); + StrAssign(w, ‘W’); + printf(‘t=’, t, ‘v=’, v, ‘u=’, Replace(u, v, w)); +}//demonstrate +``` + +> t=‘THESE ARE BOOKS’,v=‘YXY’,u=‘XWXWXW’. + +### 4.6 已知:s = ‘(XYZ)+*’,t = ‘(X+Z)*Y’。试利用联接、求子串和置换等基本运算,将s转化为t。 + +> S1 = SubString(s, 3, 1); //S1 = ‘Y’ +> S2 = SubString(s, 6, 1); //S2 = ‘+’ +> Replace(s, S1, S2); //s = ‘(X+Z)+*’ +> Concat(S3, s, S1); //S3 = ‘(X+Z)+*Y’ +> Concat(t, SubString(S3, 1, 5), SubString(S3, 7, 2)); + +### 4.7 令s = ‘aaab’,t = ‘abcabaa’,u = ‘abcaabbabcabaacbacba’。试分别求出它们的next函数值和nextval函数值。 + +> **s** + +![4.7.1](_v_images/20181128012650395_14443.png) + +> **t** + +![4.7.2](_v_images/20181128012749064_24270.png) + +> **u** + +![4.7.3](_v_images/20181128012817985_10766.png) + +### 4.8 已知主串s = ‘ADBADABBAABADABBADADA’,模式串pat = ‘ADABBADADA’,写出模式串的nextval函数值,并由此画出KMP算法匹配的全过程。 + +![4.8.1](_v_images/20181128013044407_30919.png) + +![4.8.2](_v_images/20181128013157410_30749.png) + +### 4.9 在以链表存储串值时,存储密度是结点大小和串长的函数。假设每个字符占一个字节,每个指针占4个字节,每个结点的大小为4的整数倍,已知串长的分布函数为f(l)且![4.9.1](_v_images/20181128013251526_202.png),求结点大小为4k,串长为l时的存储密度d(4k, l)(用公式表示)。 + +![4.9.2](_v_images/20181128013312950_14120.png) + +## 二、算法设计题 + +```c +在编写4.10至4.14题的算法时,请采用StringType数据类型: +StringType是串的一个抽象数据类型,它包含以下五种基本操作: + +void StrAssign (StringType &t, StringType s) +//将s的值赋给t。s的实际参数可以是串变量或者串常量(如:‘abcd’) + +int StrCompare (StringType s, StringType t) +//比较s和t。若s>t,返回值>0;若s=t,返回值=0;若s[Question-4.10-main.c](▼习题测试文档-04/Question-4.10-main.c) + +### 4.11 编写算法,求得所有包含在串s中而不包含在串t中的字符(s中重复的字符只选一个)构成的新串r,以及r中每个字符在s中第一次出现的位置。 + +>[Question-4.11-main.c](▼习题测试文档-04/Question-4.11-main.c) + +### 4.12 编写一个实现串的置换操作Replace(&S, T, V)的算法。 + +>[Question-4.12-main.c](▼习题测试文档-04/Question-4.12-main.c) + +### 4.13 编写算法,从串s中删除所有和串t相同的子串。 + +>[Question-4.13-main.c](▼习题测试文档-04/Question-4.13-main.c) + +### 4.14 利用串的基本操作以及栈和集合的基本操作,编写“由一个算术表达式的前缀式求后缀式”的递推算法(假设前缀式不含语法错误)。 + +>[Question-4.14-main.c](▼习题测试文档-04/Question-4.14-main.c) + +>> ### 在编写4.15至4.20题的算法时,请采用教科书4.2.1节中所定义的定长顺序存储表示,而不允许调用串的基本操作。 + +### 4.15 编写算法,实现串的基本操作StrAssign(&T, chars)。 +### 4.16 编写算法,实现串的基本操作StrCompare(S, T)。 +### 4.17 编写算法,实现串的基本操作Replace(&S, T, V)。 + +>[Question-4.15~4.17-main.c](▼习题测试文档-04/Question-4.15~4.17-main.c) + +### 4.18 编写算法,求串s所含不同字符的总数和每种字符的个数。 + +>[Question-4.18-main .c](▼习题测试文档-04/Question-4.18-main%20.c) + +### 4.19 在串的定长顺序存储结构上直接实现4.11题要求的算法。 + +>[Question-4.19-main .c](▼习题测试文档-04/Question-4.19-main%20.c) + +### 4.20 编写算法,从串s中删除所有和串t相同的子串。 + +>[Question-4.20-main .c](▼习题测试文档-04/Question-4.20-main%20.c) + +### 4.21 假设以结点大小为1(且附设头结点)的链表结构表示串。试编写实现下列六种串的基本操作StrAssign,StrCopy,StrCompare,StrLength,Concat和SubString的函数。 + +>[Question-4.21-main .c](▼习题测试文档-04/Question-4.21-main%20.c) + +### 4.22 假设以块链结构表示串。试编写将串s插入到串t中某个字符之后的算法(若串t中不存在此字符,则将串s联接在串t的末尾)。 + +>[Question-4.22-main .c](▼习题测试文档-04/Question-4.22-main%20.c) + +### 4.23 假设以块链结构作串的存储结构。试编写判别给定串是否具有对称性的算法,并要求算法的时间复杂度为O(StrLength(S))。 + +>[Question-4.23-main .c](▼习题测试文档-04/Question-4.23-main%20.c) + +>> ### 在编写4.24至4.26题的算法时,请采用教科书4.2.2节中所定义的堆分配存储表示。 + +### 4.24 试写一算法,在串的堆存储结构上实现串基本操作Concat(&T, s1,s2)。 +### 4.25 试写一算法,实现堆存储结构的串的置换操作Replace(&S, T, V)。 +### 4.26 试写一算法,实现堆存储结构的串的插入操作 StrInsert(&S, pos, T)。 + +>[Question-4.24~4.26-main .c](▼习题测试文档-04/Question-4.24~4.26-main%20.c) + +### 4.27 当以教科书4.2.1节中定义的定长顺序结构表示串时,可如下所述改进定位函数的算法:先将模式串t中的第一个字符和最后一个字符与主串s中相应的字符比较,在两次比较都相等之后,再依次从t的第二个字符逐个比较。这样做可以克服算法Index(算法4.5)在求模式串’akb’(ak表示连续k个字符’a’) 在主串’anb’(k≤n)中的定位函数时产生的弊病。试编写上述改进算法,并比较这两种算法在作Index(’anb’,’akb’)运算时所需进行的字符间的比较次数。 + +>[Question-4.27-main .c](▼习题测试文档-04/Question-4.27-main%20.c) + +### 4.28 假设以结点大小为1(带头结点)的链表结构表示串,则在利用next函数值进行串匹配时,在每个结点中需设三个域:数据域chdata、指针域succ和指针域next。其中chdata域存放一个字符;succ域存放指向同一链表中后继结点的指针;next域在主串中存放指向同一链表中前驱结点的指针;在模式串中,存放指向当该结点的字符与主串中的字符不等时,在模式串中下一个应进行比较的字符结点(即与该字符的next函数值相对应的字符结点)的指针,若该节点字符的next函数值为0,则其next域的值应指向头结点。试按上述定义的结构改写求模式串的next函数值的算法。 +### 4.29 试按4.28题定义的结构改写串匹配的改进算法(KMP算法)。 + +>[Question-4.28~4.29-main .c](▼习题测试文档-04/Question-4.28~4.29-main%20.c) + +### 4.30 假设以定长顺序存储结构表示串,试设计一个算法,求串s中出现的第一个最长重复子串及其(第一次出现的)位置,并分析你的算法的时间复杂度。 + +>[Question-4.30-main .c](▼习题测试文档-04/Question-4.30-main%20.c) + +### 4.31 假设以定长顺序存储结构表示串,试设计一个算法,求串s和串t的一个最长公共子串,并分析你的时间复杂度。若要求第一个出现的最长公共子串(即它在串s和串t的最左边的位置上出现)和所有的最长公共子串,讨论你的算法能否实现。 + +>[Question-4.31-main .c](▼习题测试文档-04/Question-4.31-main%20.c) + +