• 数据结构算法C语言实现(十四)--- 4.1&4.2串的类型定义、表示及实现


      一.简述

      【暂无】

      二.头文件

     1 //4_2_part1.h
     2 /**
     3 author:zhaoyu
     4 */
     5 //2016-6-10
     6 //----串的定长顺序存储表示----
     7 #include "head.h"
     8 #define MAXSTRLEN 255//用户可以在255以内定义最大串长
     9 //这语法还不是很熟悉
    10 typedef unsigned char SString[MAXSTRLEN+1];//0 号单元存放串的长度
    11 int StrLength(SString T)
    12 {
    13     for (int i = 1; i <= MAXSTRLEN; ++i)
    14     {
    15         if ('' == T[i])
    16         {
    17             return i-1;
    18         }
    19     }
    20     return MAXSTRLEN;
    21 }
    22 
    23 /**
    24 algorithm 4.2
    25 */
    26 Status Concat(SString &T, SString S1, SString S2)
    27 {
    28     //用 T 返回由 S1 和 S2 连接而成的新串。
    29     //若未截断,则返回 TRUE,否则返回 FALSE
    30     Status uncut;
    31     if (S1[0] + S2[0] < MAXSTRLEN)
    32     {//未截断
    33         int i = 1;
    34         for (i = 1; i <= S1[0]; ++i)
    35         {
    36             T[i] = S1[i];
    37         }
    38         for (i = 1; i <= S2[0]; ++i)
    39         {
    40             T[S1[0]+i] = S2[i];
    41         }
    42         T[0] = S1[0] + S2[0];
    43         uncut = TRUE;
    44     }
    45     else if (S1[0] < MAXSTRLEN)
    46     {
    47         int i = 1;
    48         for (i = 1; i <= S1[0]; i++)
    49         {
    50             T[i] = S1[i];
    51         }
    52         for (i = S1[0]+1; i <= MAXSTRLEN; i++)
    53         {
    54             T[i] = S2[i-S1[0]];
    55         }
    56         T[0] = MAXSTRLEN;
    57         uncut = FALSE;
    58     }
    59     else
    60     {
    61         for (int i = 1; i <= MAXSTRLEN; i++)
    62         {
    63             T[i] = S1[i];
    64         }
    65         T[0] = S1[0] = MAXSTRLEN;
    66         uncut = FALSE;
    67     }
    68     return uncut;
    69 }
    70 /**
    71 algorithm 4.3
    72 */
    73 Status SubString(SString &Sub, SString S, int pos, int len)
    74 {
    75     //用 Sub 返回串 S 的第 pos 个字符起长度为 len 的字串
    76     //其中, 1<= pos <<= SreLength(S) 且 0 <= len <= StrLength(S)-pos+1
    77     if (pos < 1 || pos > S[0] || len < 0 || len > S[0]-pos+1)
    78     {
    79         return ERROR;
    80     }
    81     for (int i = 1; i <= len; i++)
    82     {
    83         Sub[i] = S[i+pos-1];
    84     }
    85     Sub[0] = len;
    86     return OK;
    87 }
    88 void PrintSString(SString T)
    89 {
    90     //if(T[])
    91     for (int i = 1; i <= T[0]; ++i)
    92     {
    93         printf("%c", *(T+i));
    94     }
    95     printf("
    ");
    96 }
    97 
    98 4_2_part1.h
    4_2_part1.h
      1 //4_2_part2.h
      2 /**
      3 author:zhaoyu
      4 */
      5 //2016-6-12
      6 #include "head.h"
      7 #include <cstdlib>
      8 #include <cstring>
      9 //----串的对分配存储表示----
     10 typedef struct {
     11     char *ch;//
     12     int length;    
     13 }HString;
     14 
     15 Status StrInsert(HString &S, int pos, HString T)
     16 {//1<= pos <= StrLength(S)+1
     17 //在串的第 pos 个字符之前插入串 T
     18     if (1 < pos || pos > S.length + 1)
     19     {
     20         printf("Illegal pos
    ");
     21         return ERROR;
     22     }
     23     if (T.length){//T 非空,则重新分配空间,插入 T
     24         if (!(S.ch = (char *)realloc(S.ch, (S.length +
     25          T.length)*sizeof(char))));
     26         {
     27             exit(OVERFLOW);
     28         }
     29         for (int i = S.length-1; i >= pos-1; i--)
     30         {//为插入 T 为腾出位置
     31             S.ch[i+T.length] = S.ch[i];
     32         }
     33         for (int i = pos-1; i <= pos+T.length-2; i++)
     34         {//插入 T
     35             S.ch[i] = T.ch[i];
     36         }
     37         S.length += T.length;    
     38     }
     39     return OK;
     40 }
     41 //page 76-77
     42 //----基本操作的算法描述----
     43 Status StrAssign(HString &T, char *chars)
     44 {//生成一个其值等于串常量 chars的串 T
     45     if (T.ch)
     46     {
     47         T.ch = NULL;
     48     }
     49     int L;
     50     char *c;;
     51     for (L = 0, c = chars; *c!=''; ++L, ++c);//求 chars 的长度 L
     52     if(!L)
     53     {
     54         T.ch = NULL;
     55         T.length = 0;
     56     }
     57     else
     58     {
     59         if (!(T.ch = (char *)malloc(L*sizeof(char))))
     60         {
     61             exit(OVERFLOW);
     62         }
     63         for (int i = 0; i < L; ++i)
     64         {
     65             T.ch[i] = chars[i];
     66         }
     67         T.length = L;
     68     }
     69     return OK;
     70 }
     71 int StrLength(HString S)
     72 {//返回 S 的元素个数, 称为串的长度
     73     return S.length;
     74 }
     75 int StrCompare(HString S, HString T)
     76 {//若 S >|=|< T,则返回 >|=|< 0
     77     for (int i = 0; i < S.length && i < T.length; i++)
     78     {
     79         if (T.ch[i] != S.ch[i])
     80         {
     81             return S.ch[i] - T.ch[i];
     82         }
     83     }
     84     return S.length - T.length;
     85 }
     86 Status ClearString(HString &S)
     87 {
     88     //将 S 清空为空串
     89     if (S.ch)
     90     {
     91         free(S.ch);
     92         S.ch = NULL;
     93     }
     94     S.length = 0;
     95     return OK;
     96 }
     97 Status Concat(HString &T, HString S1, HString S2)
     98 {
     99     if (T.ch)
    100     {//释放旧空间
    101         free(T.ch);
    102     }
    103     if (!(T.ch = (char *)malloc((S1.length+S2.length)*sizeof(char))))
    104     {
    105         exit(OVERFLOW);
    106     }
    107     for (int i = 0; i < S1.length; ++i)
    108     {
    109         T.ch[i] = S1.ch[i];
    110     }
    111     for (int i = 0; i < S2.length; ++i)
    112     {
    113         T.ch[i+S1.length] = S2.ch[i];
    114     }
    115     T.length = S1.length + S2.length;
    116     return OK;
    117 }
    118 Status SubString(HString &Sub, HString S, int pos, int len)
    119 {
    120     //用 Sub 返回串 S 的第 pos 个字符起长度为 len 的子串
    121     //其中,其中, 1<= pos <<= SreLength(S) 且 0 <= len <= StrLength(S)-pos+1
    122     if (pos < 1 || pos > S.length || len < 0 || len > S.length-pos+1)
    123     {
    124         return ERROR;
    125     }
    126     if (Sub.ch)
    127     {
    128         free(Sub.ch);
    129     }
    130     if (!len)
    131     {//空子串
    132         Sub.ch = NULL;
    133         Sub.length = 0;
    134     }
    135     else
    136     {
    137         Sub.ch = (char *)malloc(len*sizeof(char));
    138         for (int i = 0; i < len; ++i)
    139         {
    140             Sub.ch[i] = S.ch[pos+i-1];
    141         }
    142         Sub.length = len;
    143     }
    144     return OK;
    145 }
    146 void PrintHString(HString S)
    147 {
    148     for (int i = 0; i < S.length; ++i)
    149     {
    150         printf("%c", S.ch[i]);
    151     }
    152     printf("
    ");
    153 }
    4_2_part2.h

      三.CPP文件

     1 #include "4_2_part1.h"
     2 int main(int argc, char const *argv[])
     3 {
     4     SString S1;
     5     SString S2;
     6     SString T;
     7     scanf("%s", S1+1);
     8     *S1 = StrLength(S1);
     9     scanf("%s", S2+1);
    10     *S2 = StrLength(S2);
    11     Concat(T, S1, S2);
    12     PrintSString(T);
    13     int pos = 2, len = 5;
    14     SubString(T, S1, pos, len);
    15     PrintSString(T); 
    16     return 0;
    17 }
    4_2_part1.cpp
     1 #include "4_2_part2.h"
     2 int main(int argc, char const *argv[])
     3 {
     4     char S[100];
     5     HString T = {NULL, 0};
     6     HString S1 = {NULL, 0};
     7     HString S2 = {NULL, 0};
     8     scanf("%s", S);
     9     StrAssign(S1, S);
    10     printf("S1:	");
    11     PrintHString(S1);
    12     printf("StrLength	%d
    ", StrLength(S1));
    13     scanf("%s", S);
    14     StrAssign(S2, S);
    15     printf("S2	");
    16     PrintHString(S2);
    17     printf("StrLength	%d
    ", StrLength(S1));
    18     printf("Compare S1 vs S2	%d
    ", StrCompare(S1, S2));
    19     Concat(T, S1, S2);
    20     printf("T = S1 + S2	");
    21     PrintHString(T);
    22     SubString(S1, T, 2, 3);
    23     printf("Sub :T[2]-T[4]	");
    24     PrintHString(S1);
    25     return 0;
    26 }
    4_2_part2.cpp

      四.测试

      连接

      

      求子串

      

      比较串

      

  • 相关阅读:
    3(翻译)如何在cocos2d里面使用动画和spritesheet
    Objectivec2.0 每种数据类型定义属性的方法
    cocos2d 入门必备4个基本概念
    如何在Mac上搭建自己的服务器——Nginx
    JN_0001:在微信朋友圈分享时长大于10s的视频
    JN_0002:Win10禁止U盘拷贝文件的方法
    abstract class 和 interface区别
    ref和out
    .Net配置错误页
    Unity3d 物体沿着正七边形轨迹移动
  • 原文地址:https://www.cnblogs.com/zhaoyu1995/p/5573795.html
Copyright © 2020-2023  润新知