zoukankan      html  css  js  c++  java
  • 数据结构 --- 串

    工程目录结构:

    common.h:

     1 //#ifndef __common_h__
     2 //#define __common_h__
     3 
     4 #define OK 1
     5 #define ERROR 0
     6 #define TRUE 1
     7 #define FALSE 0 
     8 
     9 #define MAXSIZE 20
    10 
    11 typedef int Status;        //函数的返回结果,OK、ERREO、TRUE、FALSE
    12 typedef int ElemType;   //结点数据域的数据类型
    13 
    14 //#endif

    common.c:

    1 #include "common.h"
    2 
    3 Status visit(ElemType e)
    4 {
    5     printf("%d , ", e);
    6     return OK;
    7 }

    String.h:

    1 typedef char String[MAXSIZE + 1];   // 0 号位存储串的长度

    String.c:

      1 #include <stdio.h>
      2 #include <string.h>
      3 #include <malloc.h>
      4 #include "common.h"
      5 #include "String.h"
      6 
      7 void InitString(String Str)
      8 {
      9     Str[0] = 0;
     10 }
     11 
     12 //生成一个其值等于chars的串 Str
     13 Status StringAssign(String Str, char *chars)
     14 {
     15     if (strlen(chars) > MAXSIZE)
     16         return ERROR;
     17     Str[0] = strlen(chars);
     18     for (int i = 1; i <= Str[0]; ++i)
     19         Str[i] = *(chars + i - 1);
     20 
     21     return OK;
     22 }
     23 
     24 //由串oldStr复制得串newStr
     25 Status CopyString(String newStr, String oldStr)
     26 {
     27     for (int i = 0; i <= oldStr[0]; ++i)
     28         newStr[i] = oldStr[i];
     29     return OK;
     30 }
     31 
     32 Status EmptyString(String Str)
     33 {
     34     if (Str[0] == 0)
     35         return TRUE;
     36     else
     37         return FALSE;
     38 }
     39 
     40 //前提是: str1 和 str2 均不为空串
     41 // 0: str1 == str2  正数: str1 > str2  负数: str1 < str2   
     42 int CompareString(String str1, String str2)
     43 {
     44     for (int i = 1; i <= str1[0] && i <= str2[0]; ++i)
     45     {
     46         if (str1[i] != str2[i])
     47             return str1[i] - str2[i];
     48     }
     49     return str1[0] - str2[0];
     50 }
     51 
     52 int StringLength(String Str)
     53 {
     54     return Str[0];
     55 }
     56 
     57 Status StringClear(String Str)
     58 {
     59     Str[0] = 0;
     60     return OK;
     61 }
     62 
     63 //用T返回S1和S2联接而成的新串。若未截断,则返回TRUE,否则FALSE
     64 Status StringConcat(String T, String S1, String S2)
     65 {
     66     int i;
     67     if (S1[0] + S2[0] <= MAXSIZE)  //未截断
     68     {
     69         for (i = 1; i <= S1[0]; ++i)
     70             T[i] = S1[i];
     71 
     72         for (i = 1; i <= S2[0]; ++i)
     73             T[S1[0] + i] = S2[i];
     74 
     75         T[0] = S1[0] + S2[0];
     76 
     77         return FALSE;
     78     }
     79     else    //截断,按照这里定义的String,截断也是截断S2
     80     {
     81         for (i = 1; i <= S1[0]; ++i)
     82             T[i] = S1[i];
     83 
     84         for (i = 1; i <= MAXSIZE - S1[0]; ++i)
     85             T[S1[0] + i] = S2[i];
     86 
     87         T[0] = MAXSIZE;
     88 
     89         return TRUE;
     90     }
     91 }
     92 
     93 //用Sub返回串S的第pos个字符起长度为len的子串
     94 Status SubString(String sub, String S, int pos, int len)
     95 {
     96     if (pos < 1 || pos > S[0] || len < 0 || len > S[0] - pos + 1)
     97         return FALSE;
     98 
     99     for (int i = 1; i <= len; ++i)
    100         sub[i] = S[pos + i - 1];
    101 
    102     sub[0] = len;
    103 
    104     return TRUE;
    105 }
    106 
    107 //返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0。 
    108 //其中,T非空,1≤pos≤StrLength(S)。
    109 int Index(String S, String T, int pos)
    110 {
    111     int i = pos,   //主串开始匹配的位置
    112         j = 1;       //子串匹配的索引
    113 
    114     while (i <= S[0] && j <= T[0])
    115     {
    116         if (S[i] == T[j])
    117         {
    118             ++i;
    119             ++j;
    120         }
    121         else
    122         {
    123             i = i - j + 1 + 1;  //j可以间接用来记录i++的次数,通过简单的计算即可转换为i下一次匹配的位置
    124             j = 1;
    125         }
    126     }
    127 
    128     if (j > T[0])
    129         return i - T[0];
    130     else
    131         return 0;
    132 }
    133 
    134 /*  T为非空串。若主串S中第pos个字符之后存在与T相等的子串, */
    135 /*  则返回第一个这样的子串在S中的位置,否则返回0 */
    136 int Index2(String S, String T, int pos)
    137 {
    138     if (pos > 0)
    139     {
    140         int lenS = S[0];
    141         int lenT = T[0];
    142         int i = pos;
    143         String sub;
    144         while (i <= lenS - lenT + 1)
    145         {
    146             /* 取主串中第i个位置长度与T相等的子串给sub */
    147             SubString(sub, S, i, lenT);
    148             if (CompareString(sub, T) != 0)
    149                 ++i;
    150             else
    151                 return i;
    152         }
    153     }
    154     return 0;
    155 }
    156 
    157 //输出串
    158 void StringPrint(String Str)
    159 {
    160     for (int i = 1; i <= Str[0]; ++i)
    161         printf("%c", Str[i]);
    162     printf("
    ");
    163 }
    164 
    165 void StringStart()
    166 {
    167     String Str;
    168     InitString(Str);
    169     printf("创建字符串  str = ABCDEFG
    ");
    170     char chars[] = "ABCDEFG";
    171     if (OK == StringAssign(Str, chars))
    172         printf("
    字符串创建成功!
    ");
    173     else
    174         printf("
    字符串创建失败!
    ");
    175 
    176     printf("
    Str= ");
    177     StringPrint(Str);
    178 
    179     printf("
    Str 的长度: %d
    ", StringLength(Str));
    180 
    181     String NewStr;
    182     InitString(NewStr);
    183 
    184     if (EmptyString(NewStr) == TRUE)
    185         printf("
    NewStr 是空串!
    ");
    186     else
    187         printf("
    NewStr 不是空串!
    ");
    188 
    189     CopyString(NewStr, Str);
    190 
    191     printf("
    复制穿 Str -> NewStr, NewStr = ");
    192     StringPrint(NewStr);
    193 
    194     if (EmptyString(NewStr) == TRUE)
    195         printf("
    NewStr 是空串!
    ");
    196     else
    197         printf("
    NewStr 不是空串!
    ");
    198 
    199     printf("
    NewStr 的长度: %d
    ", StringLength(NewStr));
    200 
    201     String Str1, Str2, Str3;
    202     InitString(Str1);
    203     InitString(Str2);
    204     char chars1[] = "ABCDEFABCDEGHHIJKLMN";
    205     char chars2[] = "1234567891011121314";
    206     char chars3[] = "ABCDE";
    207     StringAssign(Str1, chars1);
    208     StringAssign(Str2, chars2);
    209     StringAssign(Str3, chars3);
    210 
    211     printf("
    Str1 = ");
    212     StringPrint(Str1);
    213     printf("Str2 = ");
    214     StringPrint(Str2);
    215     printf("Str3 = ");
    216     StringPrint(Str3);
    217 
    218     if (0 == CompareString(Str1, Str))
    219         printf("
    Str1 == Str");
    220     else if (CompareString(Str1, Str) > 0)
    221         printf("
    Str1 > Str");
    222     else
    223         printf("
    Str1 < Str");
    224 
    225     if (0 == CompareString(Str2, Str))
    226         printf("
    Str2 == Str");
    227     else if (CompareString(Str2, Str) > 0)
    228         printf("
    Str2 > Str");
    229     else
    230         printf("
    Str2 < Str");
    231 
    232     if (0 == CompareString(Str3, Str))
    233         printf("
    Str3 == Str");
    234     else if (CompareString(Str3, Str) > 0)
    235         printf("
    Str3 > Str");
    236     else
    237         printf("
    Str3 < Str");
    238 
    239     String T;
    240     if (StringConcat(T, Str1, Str2) == TRUE)
    241         printf("
    
    Str2 被截断!
    ");
    242     else
    243         printf("
    
    Str2 未被截断!
    .");
    244 
    245     printf("
    T = ");
    246     StringPrint(T);
    247 
    248     String sub;
    249 
    250     printf("
    从T中第7个位置开始,截取长度为5的 Sub, Sub = ");
    251     if (SubString(sub, T, 7, 5) == TRUE)
    252         StringPrint(sub);
    253 
    254     String Str5;
    255     char chars5[] = "HIJ";
    256     StringAssign(Str5, chars5);
    257     int pos = 3;
    258 
    259     int index = Index(Str1, Str5, pos);
    260     printf("
    
    Str5 = ");
    261     StringPrint(Str5);
    262     printf("
    Str5在Str1中的位置是: %d
    ", index);
    263 
    264     pos = Index2(Str1, Str3, 2);
    265     printf("
    Str1中,从第二个位置开始,与Str3相等的子串的 Pos = %d
    ", pos);
    266     printf("
    ");
    267 }

    main.c:

    int main()
    {
        //LinkListStart();
        //StackStart();
        //LinkStackStart();
        //StartQueue();
        //LinkQueueStart();
        StringStart();
        getchar();
        return 0;
    }
  • 相关阅读:
    删除使用RMAN命令备份的文件
    查看.Net Framework版本的方法(zz)
    c# Foreach last (zz)
    Visual Studio 2008 QFE (zz)
    打印机的接口
    牛人的PENTAX单反之路
    我新进的宾得K10D机器和镜头
    买车险要有足额第三者责任险
    谈谈P家的SUPERTAKUAMR
    硬盘接口总结
  • 原文地址:https://www.cnblogs.com/luguoshuai/p/9286019.html
Copyright © 2011-2022 走看看