• 顺序串的基本运算
    • 顺序串的定义
    • 赋值运算
    • 复制运算
    • 求串长运算
    • 判断串相等运算
    • 串连接运算
    • 求子串运算
    • 查找子串位置运算
    • 子串插入运算
    • 子串删除运算
    • 子串替换运算
    • 输出串运算
    • main

    顺序串的基本运算

    顺序串的定义

    1. #include <stdio.h>
    2. #define MaxSize 100 /*最多字符个数*/
    3. typedef struct
    4. {
    5. char ch[MaxSize]; /*存放串字符*/
    6. int len; /*存放串的实际长度*/
    7. } SqString; /*顺序串类型*/

    赋值运算

    1. void Assign(SqString &s,char t[]) /*串赋值运算*/
    2. {
    3. int i=0;
    4. while (t[i]!='\0')
    5. {
    6. s.ch[i]=t[i];
    7. i++;
    8. }
    9. s.len=i;
    10. }

    复制运算

    1. void StrCopy(SqString &s,SqString t) /*串复制运算*/
    2. {
    3. int i;
    4. for (i=0;i<t.len;i++)
    5. s.ch[i]=t.ch[i];
    6. s.len=t.len;
    7. }

    求串长运算

    1. int StrLength(SqString s) /*求串长运算*/
    2. {
    3. return(s.len);
    4. }

    判断串相等运算

    1. int StrEqual(SqString s,SqString t) /*判断串相等运算*/
    2. {
    3. int i=0;
    4. if (s.len!=t.len) /*串长不同时返回0*/
    5. return(0);
    6. else
    7. {
    8. for (i=0;i<s.len;i++)
    9. if (s.ch[i]!=t.ch[i]) /*有一个对应字符不同时返回0*/
    10. return(0);
    11. return(1);
    12. }
    13. }

    串连接运算

    1. SqString Concat(SqString s,SqString t) /*串连接运算*/
    2. {
    3. SqString r;
    4. int i,j;
    5. for (i=0;i<s.len;i++) /*将s复制到r*/
    6. r.ch[i]=s.ch[i];
    7. for (j=0;j<t.len;j++) /*将t复制到r*/
    8. r.ch[s.len+j]=t.ch[j];
    9. r.len=i+j;
    10. return(r); /*返回r*/
    11. }

    求子串运算

    1. SqString SubStr(SqString s,int i,int j) /*求子串运算*/
    2. {
    3. SqString t;
    4. int k;
    5. if (i<1 || i>s.len || j<1 || i+j>s.len+1)
    6. t.len=0; /*参数错误时返回空串*/
    7. else
    8. {
    9. for (k=i-1;k<i+j;k++)
    10. t.ch[k-i+1]=s.ch[k];
    11. t.len=j;
    12. }
    13. return(t);
    14. }

    查找子串位置运算

    1. int Index(SqString s,SqString t) /*查找子串位置运算*/
    2. {
    3. int i=0,j=0,k; /*i和j分别扫描主串s和子串t*/
    4. while (i<s.len && j<t.len)
    5. {
    6. if (s.ch[i]==t.ch[j]) /*对应字符相同时,继续比较下一对字符*/
    7. {
    8. i++;j++;
    9. }
    10. else /*否则,主子串指针回溯重新开始下一次匹配*/
    11. {
    12. i=i-j+1;j=0;
    13. }
    14. }
    15. if (j>=t.len)
    16. k=i-t.len+1;/*求出第一个字符的位置*/
    17. else
    18. k=-1; /*置特殊值-1*/
    19. return(k);
    20. }

    子串插入运算

    1. int InsStr(SqString &s,int i,SqString t) /*子串插入运算*/
    2. {
    3. int j;
    4. if (i>s.len+1)
    5. return(0); /*位置参数值错误*/
    6. else
    7. {
    8. for (j=s.len;j>=i-1;j--) /*将s.ch[i-1]-s.ch[s.len-1]*/
    9. s.ch[j+t.len]=s.ch[j]; /*后移t.len个位置*/
    10. for (j=0;j<t.len;j++)
    11. s.ch[i+j-1]=t.ch[j];
    12. s.len=s.len+t.len; /*修改s串长度*/
    13. return(1);
    14. }
    15. }

    子串删除运算

    1. int DelStr(SqString &s,int i,int j) /*子串删除运算*/
    2. {
    3. int k;
    4. if (i<1 || i>s.len || j<1 || i+j>s.len+1)
    5. return(0); /*位置参数值错误*/
    6. else
    7. {
    8. for (k=i+j-1;k<s.len;k++) /*将s的第i+j位置之后的字符前移j位*/
    9. s.ch[k-j]=s.ch[k];
    10. s.len=s.len-j; /*修改s的长度*/
    11. return(1);
    12. }
    13. }

    子串替换运算

    1. SqString RepStrAll(SqString s,SqString s1,SqString s2) /*子串替换运算*/
    2. {
    3. int i;
    4. i=Index(s,s1);
    5. while (i>=0)
    6. {
    7. DelStr(s,i,s1.len); /*删除*/
    8. InsStr(s,i,s2); /*插入*/
    9. i=Index(s,s1);
    10. }
    11. return(s);
    12. }

    输出串运算

    1. void DispStr(SqString s) /*输出串运算*/
    2. {
    3. int i;
    4. for (i=0;i<s.len;i++)
    5. printf("%c",s.ch[i]);
    6. printf("\n");
    7. }

    main

    1. void main()
    2. {
    3. SqString s1,s2,s3,s4,s5,s6,s7;
    4. Assign(s1,"abcd");
    5. printf("s1:");DispStr(s1);
    6. printf("s1的长度:%d\n",StrLength(s1));
    7. printf("s1=>s2\n");
    8. StrCopy(s2,s1);
    9. printf("s2:");DispStr(s2);
    10. printf("s1和s2%s\n",(StrEqual(s1,s2)==1?"相同":"不相同"));
    11. Assign(s3,"12345678");
    12. printf("s3:");DispStr(s3);
    13. printf("s1和s3连接=>s4\n");
    14. s4=Concat(s1,s3);
    15. printf("s4:");DispStr(s4);
    16. printf("s3[2..5]=>s5\n");
    17. s5=SubStr(s3,2,4);
    18. printf("s5:");DispStr(s5);
    19. Assign(s6,"567");
    20. printf("s6:");DispStr(s6);
    21. printf("s6在s3中位置:%d\n",Index(s3,s6));
    22. printf("从s3中删除s3[3..6]字符\n");
    23. DelStr(s3,3,4);
    24. printf("s3:");DispStr(s3);
    25. printf("从s4中将s6替换成s1=>s7\n");
    26. s7=RepStrAll(s4,s6,s1);
    27. printf("s7:");DispStr(s7);
    28. }