bo4-01~03.cpp 串 算法

 
  1.  // bo4-1.cpp 串采用定长顺序存储结构(由c4-1.h定义)的基本操作(13个),包括算法4.2,4.3,4.5
  2.  // SString是数组,故不需引用类型
  3.  #define DestroyString ClearString // DestroyString()与ClearString()作用相同
  4.  Status StrAssign(SString T,char *chars)
  5.  { // 生成一个其值等于chars的串T
  6.    int i;
  7.    if(strlen(chars)>MAX_STR_LEN)
  8.      return ERROR;
  9.    else
  10.    {
  11.      T[0]=strlen(chars);
  12.      for(i=1;i<=T[0];i++)
  13.        T[i]=*(chars+i-1);
  14.      return OK;
  15.    }
  16.  }
  17.  void StrCopy(SString T,SString S)
  18.  { // 由串S复制得串T
  19.    int i;
  20.    for(i=0;i<=S[0];i++)
  21.      T[i]=S[i];
  22.  }
  23.  Status StrEmpty(SString S)
  24.  { // 若S为空串,则返回TRUE,否则返回FALSE
  25.    if(S[0]==0)
  26.      return TRUE;
  27.    else
  28.      return FALSE;
  29.  }
  30.  int StrCompare(SString S,SString T)
  31.  {// 初始条件:串S和T存在。操作结果:若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0
  32.    int i;
  33.    for(i=1;i<=S[0]&&i<=T[0];++i)
  34.      if(S[i]!=T[i])
  35.        return S[i]-T[i];
  36.    return S[0]-T[0];
  37.  }
  38.  int StrLength(SString S)
  39.  { // 返回串S的元素个数
  40.    return S[0];
  41.  }
  42.  void ClearString(SString S)
  43.  { // 初始条件:串S存在。操作结果:将S清为空串
  44.    S[0]=0; // 令串长为零
  45.  }
  46.  Status Concat(SString T,SString S1,SString S2) // 算法4.2改
  47.  { // 用T返回S1和S2联接而成的新串。若未截断,则返回TRUE,否则FALSE
  48.    int i;
  49.    if(S1[0]+S2[0]<=MAX_STR_LEN)
  50.    { // 未截断
  51.      for(i=1;i<=S1[0];i++)
  52.        T[i]=S1[i];
  53.      for(i=1;i<=S2[0];i++)
  54.        T[S1[0]+i]=S2[i];
  55.      T[0]=S1[0]+S2[0];
  56.      return TRUE;
  57.    }
  58.    else
  59.    { // 截断S2
  60.      for(i=1;i<=S1[0];i++)
  61.        T[i]=S1[i];
  62.      for(i=1;i<=MAX_STR_LEN-S1[0];i++)
  63.        T[S1[0]+i]=S2[i];
  64.      T[0]=MAX_STR_LEN;
  65.      return FALSE;
  66.    }
  67.  }
  68.  Status SubString(SString Sub,SString S,int pos,int len)
  69.  { // 用Sub返回串S的第pos个字符起长度为len的子串。算法4.3
  70.    int i;
  71.    if(pos<1||pos>S[0]||len<0||len>S[0]-pos+1)
  72.      return ERROR;
  73.    for(i=1;i<=len;i++)
  74.      Sub[i]=S[pos+i-1];
  75.    Sub[0]=len;
  76.    return OK;
  77.  }
  78.  int Index(SString S,SString T,int pos)
  79.  { // 返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数值为0。
  80.    // 其中,T非空,1≤pos≤StrLength(S)。算法4.5
  81.    int i,j;
  82.    if(1<=pos&&pos<=S[0])
  83.    {
  84.      i=pos;
  85.      j=1;
  86.      while(i<=S[0]&&j<=T[0])
  87.        if(S[i]==T[j]) // 继续比较后继字符
  88.        {
  89.          ++i;
  90.          ++j;
  91.        }
  92.        else // 指针后退重新开始匹配
  93.        {
  94.          i=i-j+2;
  95.          j=1;
  96.        }
  97.      if(j>T[0])
  98.        return i-T[0];
  99.      else
  100.        return 0;
  101.    }
  102.    else
  103.      return 0;
  104.  }
  105.  Status StrInsert(SString S,int pos,SString T)
  106.  { // 初始条件:串S和T存在,1≤pos≤StrLength(S)+1
  107.    // 操作结果:在串S的第pos个字符之前插入串T。完全插入返回TRUE,部分插入返回FALSE
  108.    int i;
  109.    if(pos<1||pos>S[0]+1)
  110.      return ERROR;
  111.    if(S[0]+T[0]<=MAX_STR_LEN)
  112.    { // 完全插入
  113.      for(i=S[0];i>=pos;i--)
  114.        S[i+T[0]]=S[i];
  115.      for(i=pos;i<pos+T[0];i++)
  116.        S[i]=T[i-pos+1];
  117.      S[0]+=T[0];
  118.      return TRUE;
  119.    }
  120.    else
  121.    { // 部分插入
  122.      for(i=MAX_STR_LEN;i>=pos+T[0];i--)
  123.        S[i]=S[i-T[0]];
  124.      for(i=pos;i<pos+T[0]&&i<=MAX_STR_LEN;i++)
  125.        S[i]=T[i-pos+1];
  126.      S[0]=MAX_STR_LEN;
  127.      return FALSE;
  128.    }
  129.  }
  130.  Status StrDelete(SString S,int pos,int len)
  131.  { // 初始条件:串S存在,1≤pos≤StrLength(S)-len+1
  132.    // 操作结果:从串S中删除第pos个字符起长度为len的子串
  133.    int i;
  134.    if(pos<1||pos>S[0]-len+1||len<0)
  135.      return ERROR;
  136.    for(i=pos+len;i<=S[0];i++)
  137.      S[i-len]=S[i];
  138.    S[0]-=len;
  139.    return OK;
  140.  }
  141.  Status Replace(SString S,SString T,SString V) // 此函数与串的存储结构无关
  142.  { // 初始条件:串S,T和V存在,T是非空串
  143.    // 操作结果:用V替换主串S中出现的所有与T相等的不重叠的子串
  144.    int i=1; // 从串S的第一个字符起查找串T
  145.    Status k;
  146.    if(StrEmpty(T)) // T是空串
  147.      return ERROR;
  148.    do
  149.    {
  150.      i=Index(S,T,i); // 结果i为从上一个i之后找到的子串T的位置
  151.      if(i) // 串S中存在串T
  152.      {
  153.        StrDelete(S,i,StrLength(T)); // 删除该串T
  154.        k=StrInsert(S,i,V); // 在原串T的位置插入串V
  155.        if(!k) // 不能完全插入
  156.          return ERROR;
  157.        i+=StrLength(V); // 在插入的串V后面继续查找串T
  158.      }
  159.    }while(i);
  160.    return OK;
  161.  }
  162.  void StrPrint(SString T)
  163.  { // 输出字符串T。另加
  164.    int i;
  165.    for(i=1;i<=T[0];i++)
  166.      printf("%c",T[i]);
  167.    printf("/n");
  168.  }

 

  1.  // bo4-2.cpp 串采用堆分配存储结构(由c4-2.h定义)的基本操作(14个)。包括算法4.1、4.4
  2.  #define DestroyString ClearString // DestroyString()与ClearString()作用相同
  3.  void StrAssign(HString &T,char *chars)
  4.  { // 生成一个其值等于串常量chars的串T
  5.    int i,j;
  6.    if(T.ch)
  7.      free(T.ch); // 释放T原有空间
  8.    i=strlen(chars); // 求chars的长度i
  9.    if(!i)
  10.    { // chars的长度为0
  11.      T.ch=NULL;
  12.      T.length=0;
  13.    }
  14.    else
  15.    { // chars的长度不为0
  16.      T.ch=(char*)malloc(i*sizeof(char)); // 分配串空间
  17.      if(!T.ch) // 分配串空间失败
  18.        exit(OVERFLOW);
  19.      for(j=0;j<i;j++) // 拷贝串
  20.        T.ch[j]=chars[j];
  21.      T.length=i;
  22.    }
  23.  }
  24.  void StrCopy(HString &T,HString S)
  25.  { // 初始条件:串S存在。操作结果:由串S复制得串T
  26.    int i;
  27.    if(T.ch)
  28.      free(T.ch); // 释放T原有空间
  29.    T.ch=(char*)malloc(S.length*sizeof(char)); // 分配串空间
  30.    if(!T.ch) // 分配串空间失败
  31.      exit(OVERFLOW);
  32.    for(i=0;i<S.length;i++) // 拷贝串
  33.      T.ch[i]=S.ch[i];
  34.    T.length=S.length;
  35.  }
  36.  Status StrEmpty(HString S)
  37.  { // 初始条件:串S存在。操作结果:若S为空串,则返回TRUE,否则返回FALSE
  38.    if(S.length==0&&S.ch==NULL)
  39.      return TRUE;
  40.    else
  41.      return FALSE;
  42.  }
  43.  int StrCompare(HString S,HString T)
  44.  { // 若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0
  45.    int i;
  46.    for(i=0;i<S.length&&i<T.length;++i)
  47.      if(S.ch[i]!=T.ch[i])
  48.        return S.ch[i]-T.ch[i];
  49.    return S.length-T.length;
  50.  }
  51.  int StrLength(HString S)
  52.  { // 返回S的元素个数,称为串的长度
  53.    return S.length;
  54.  }
  55.  void ClearString(HString &S)
  56.  { // 将S清为空串
  57.    free(S.ch);
  58.    S.ch=NULL;
  59.    S.length=0;
  60.  }
  61.  void Concat(HString &T,HString S1,HString S2)
  62.  { // 用T返回由S1和S2联接而成的新串
  63.    int i;
  64.    if(T.ch)
  65.      free(T.ch); // 释放旧空间
  66.    T.length=S1.length+S2.length;
  67.    T.ch=(char *)malloc(T.length*sizeof(char));
  68.    if(!T.ch)
  69.      exit(OVERFLOW);
  70.    for(i=0;i<S1.length;i++)
  71.      T.ch[i]=S1.ch[i];
  72.    for(i=0;i<S2.length;i++)
  73.      T.ch[S1.length+i]=S2.ch[i];
  74.  }
  75.  Status SubString(HString &Sub, HString S,int pos,int len)
  76.  { // 用Sub返回串S的第pos个字符起长度为len的子串。
  77.    // 其中,1≤pos≤StrLength(S)且0≤len≤StrLength(S)-pos+1
  78.    int i;
  79.    if(pos<1||pos>S.length||len<0||len>S.length-pos+1)
  80.      return ERROR;
  81.    if(Sub.ch)
  82.      free(Sub.ch); // 释放旧空间
  83.    if(!len) // 空子串
  84.    {
  85.      Sub.ch=NULL;
  86.      Sub.length=0;
  87.    }
  88.    else
  89.    { // 完整子串
  90.      Sub.ch=(char*)malloc(len*sizeof(char));
  91.      if(!Sub.ch)
  92.        exit(OVERFLOW);
  93.      for(i=0;i<=len-1;i++)
  94.        Sub.ch[i]=S.ch[pos-1+i];
  95.      Sub.length=len;
  96.    }
  97.    return OK;
  98.  }
  99.  void InitString(HString &T)
  100.  { // 初始化(产生空串)字符串T。另加
  101.    T.length=0;
  102.    T.ch=NULL;
  103.  }
  104.  int Index(HString S,HString T,int pos) // 算法4.1
  105.  { // T为非空串。若主串S中第pos个字符之后存在与T相等的子串,
  106.    // 则返回第一个这样的子串在S中的位置,否则返回0
  107.    int n,m,i;
  108.    HString sub;
  109.    InitString(sub);
  110.    if(pos>0)
  111.    {
  112.      n=StrLength(S);
  113.      m=StrLength(T);
  114.      i=pos;
  115.      while(i<=n-m+1)
  116.      {
  117.        SubString(sub,S,i,m);
  118.        if(StrCompare(sub,T)!=0)
  119.          ++i;
  120.        else
  121.          return i;
  122.      }
  123.    }
  124.    return 0;
  125.   }
  126.  Status StrInsert(HString &S,int pos,HString T) // 算法4.4
  127.  { // 1≤pos≤StrLength(S)+1。在串S的第pos个字符之前插入串T
  128.    int i;
  129.    if(pos<1||pos>S.length+1) // pos不合法
  130.      return ERROR;
  131.    if(T.length) // T非空,则重新分配空间,插入T
  132.    {
  133.      S.ch=(char*)realloc(S.ch,(S.length+T.length)*sizeof(char));
  134.      if(!S.ch)
  135.        exit(OVERFLOW);
  136.      for(i=S.length-1;i>=pos-1;--i) // 为插入T而腾出位置
  137.        S.ch[i+T.length]=S.ch[i];
  138.      for(i=0;i<T.length;i++)
  139.        S.ch[pos-1+i]=T.ch[i]; // 插入T
  140.      S.length+=T.length;
  141.    }
  142.    return OK;
  143.  }
  144.  Status StrDelete(HString &S,int pos,int len)
  145.  { // 从串S中删除第pos个字符起长度为len的子串
  146.    int i;
  147.    if(S.length<pos+len-1)
  148.      return ERROR;
  149.    for(i=pos-1;i<=S.length-len;i++)
  150.      S.ch[i]=S.ch[i+len];
  151.    S.length-=len;
  152.    S.ch=(char*)realloc(S.ch,S.length*sizeof(char));
  153.    return OK;
  154.  }
  155.  Status Replace(HString &S,HString T,HString V) // 此函数与串的存储结构无关
  156.  { // 初始条件:串S,T和V存在,T是非空串
  157.    // 操作结果:用V替换主串S中出现的所有与T相等的不重叠的子串
  158.    int i=1; // 从串S的第一个字符起查找串T
  159.    if(StrEmpty(T)) // T是空串
  160.      return ERROR;
  161.    do
  162.    {
  163.      i=Index(S,T,i); // 结果i为从上一个i之后找到的子串T的位置
  164.      if(i) // 串S中存在串T
  165.      {
  166.        StrDelete(S,i,StrLength(T)); // 删除该串T
  167.        StrInsert(S,i,V); // 在原串T的位置插入串V
  168.        i+=StrLength(V); // 在插入的串V后面继续查找串T
  169.      }
  170.    }while(i);
  171.    return OK;
  172.  }
  173.  void StrPrint(HString T)
  174.  { // 输出T字符串。另加
  175.    int i;
  176.    for(i=0;i<T.length;i++)
  177.      printf("%c",T.ch[i]);
  178.    printf("/n");
  179.  }
  1.  // bo4-3.cpp 串采用块链存储结构(由c4-3.h定义)的基本操作(15个)
  2.  #define DestroyString ClearString // DestroyString()与ClearString()作用相同
  3.  void InitString(LString &T)
  4.  { // 初始化(产生空串)字符串T。另加
  5.    T.curlen=0;
  6.    T.head= T.tail=NULL;
  7.  }
  8.  Status StrAssign(LString &T,char *chars)
  9.  { // 生成一个其值等于chars的串T(要求chars中不包含填补空余的字符)。成功返回OK,否则返回ERROR
  10.    int i,j,k,m;
  11.    Chunk *p,*q;
  12.    i=strlen(chars); // i为串的长度
  13.    if(!i||strchr(chars,blank)) // 串长为0或chars中包含填补空余的字符
  14.      return ERROR;
  15.    T.curlen=i;
  16.    j=i/CHUNK_SIZE; // j为块链的结点数
  17.    if(i%CHUNK_SIZE)
  18.      j++;
  19.    for(k=0;k<j;k++)
  20.    {
  21.      p=(Chunk*)malloc(sizeof(Chunk)); // 生成块结点
  22.      if(!p) // 生成块结点失败
  23.        return ERROR;
  24.      for(m=0;m<CHUNK_SIZE&&*chars;m++) // 给块结点的数据域赋值
  25.        *(p->ch+m)=*chars++;
  26.      if(k==0) // 第一个链块
  27.        T.head=q=p; // 头指针指向第一个链块
  28.      else
  29.      {
  30.        q->next=p;
  31.        q=p;
  32.      }
  33.      if(!*chars) // 最后一个链块
  34.      {
  35.        T.tail=q;
  36.        q->next=NULL;
  37.        for(;m<CHUNK_SIZE;m++) // 用填补空余的字符填满链表
  38.          *(q->ch+m)=blank;
  39.      }
  40.    }
  41.    return OK;
  42.  }
  43.  Status ToChars(LString T,char* &chars)
  44.  { // 将串T的内容转换为字符串,chars为其头指针。成功返回OK,否则返回ERROR。另加
  45.    Chunk *p=T.head; // p指向第1个块结点
  46.    int i;
  47.    char *q;
  48.    chars=(char*)malloc((T.curlen+1)*sizeof(char));
  49.    if(!chars||!T.curlen) // 生成字符串数组失败或串T长为0
  50.      return ERROR;
  51.    q=chars; // q指向chars的第1个字符
  52.    while(p) // 块链没结束
  53.    {
  54.      for(i=0;i<CHUNK_SIZE;i++)
  55.        if(p->ch[i]!=blank) // 当前字符不是填补空余的字符
  56.          *q++=(p->ch[i]); // 赋给q所指字符空间
  57.      p=p->next;
  58.    }
  59.    chars[T.curlen]=0; // 串结束符
  60.    return OK;
  61.  }
  62.  Status StrCopy(LString &T,LString S)
  63.  { // 初始条件:串S存在
  64.    // 操作结果:由串S复制得串T,去掉填补空余的字符。成功返回OK,否则返回ERROR
  65.    char *c;
  66.    Status i;
  67.    if(!ToChars(S,c)) // c为串S的内容
  68.      return ERROR;
  69.    i=StrAssign(T,c); // 将串S的内容赋给T
  70.    free(c); // 释放c的空间
  71.    return i;
  72.  }
  73.  Status StrEmpty(LString S)
  74.  { // 初始条件:串S存在。操作结果:若S为空串,则返回TRUE,否则返回FALSE
  75.    if(S.curlen) // 非空
  76.      return FALSE;
  77.    else
  78.      return TRUE;
  79.  }
  80.  int StrCompare(LString S,LString T)
  81.  { // 若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0
  82.    char *s,*t;
  83.    Status i;
  84.    if(!ToChars(S,s)) // s为串S的内容
  85.      return ERROR;
  86.    if(!ToChars(T,t)) // t为串T的内容
  87.      return ERROR;
  88.    i=strcmp(s,t); // 利用C的库函数
  89.    free(s); // 释放s,t的空间
  90.    free(t);
  91.    return i;
  92.  }
  93.  int StrLength(LString S)
  94.  { // 返回S的元素个数,称为串的长度
  95.    return S.curlen;
  96.  }
  97.  void ClearString(LString &S)
  98.  { // 初始条件:串S存在。操作结果:将S清为空串
  99.    Chunk *p,*q;
  100.    p=S.head;
  101.    while(p)
  102.    {
  103.      q=p->next;
  104.      free(p);
  105.      p=q;
  106.    }
  107.    S.head=S.tail=NULL;
  108.    S.curlen=0;
  109.  }
  110.  Status Concat(LString &T,LString S1,LString S2)
  111.  { // 用T返回由S1和S2联接而成的新串(中间可能有填补空余的字符)
  112.    LString a1,a2;
  113.    Status i,j;
  114.    InitString(a1);
  115.    InitString(a2);
  116.    i=StrCopy(a1,S1);
  117.    j=StrCopy(a2,S2);
  118.    if(!i||!j) // 至少有1个串拷贝不成功
  119.      return ERROR;
  120.    T.curlen=S1.curlen+S2.curlen; // 生成串T
  121.    T.head=a1.head;
  122.    a1.tail->next=a2.head; // a1,a2两串首尾相连
  123.    T.tail=a2.tail;
  124.    return OK;
  125.  }
  126.  Status SubString(LString &Sub, LString S,int pos,int len)
  127.  { // 用Sub返回串S的第pos个字符起长度为len的子串。
  128.    // 其中,1≤pos≤StrLength(S)且0≤len≤StrLength(S)-pos+1
  129.    char *b,*c;
  130.    Status i;
  131.    if(pos<1||pos>S.curlen||len<0||len>S.curlen-pos+1) // pos或len值不合法
  132.      return ERROR;
  133.    if(!ToChars(S,c)) // c为串S的内容
  134.      return ERROR;
  135.    b=c+pos-1; // b指向串c中串Sub内容的首地址
  136.    b[len]=0; // Sub结束处赋0(字符串结束符)
  137.    i=StrAssign(Sub,b); // 将串b的内容赋给Sub
  138.    free(c);
  139.    return i;
  140.  }
  141.  int Index(LString S,LString T,int pos)
  142.  { // T为非空串。若主串S中第pos个字符之后存在与T相等的子串,
  143.    // 则返回第一个这样的子串在S中的位置,否则返回0
  144.    int i,n,m;
  145.    LString sub;
  146.    if(pos>=1&&pos<=StrLength(S)) // pos满足条件
  147.    {
  148.      n=StrLength(S); // 主串长度
  149.      m=StrLength(T); // 串T长度
  150.      i=pos;
  151.      while(i<=n-m+1)
  152.      {
  153.        SubString(sub,S,i,m); // sub为从S的第i个字符起,长度为m的子串
  154.        if(StrCompare(sub,T)) // sub不等于T
  155.      ++i;
  156.        else
  157.      return i;
  158.      }
  159.    }
  160.    return 0;
  161.  }
  162.  Status StrInsert(LString &S, int pos,LString T)
  163.  { // 1≤pos≤StrLength(S)+1。在串S的第pos个字符之前插入串T
  164.    char *b,*c;
  165.    int i,j;
  166.    Status k;
  167.    if(pos<1||pos>S.curlen+1) // pos的值超出范围
  168.      return ERROR;
  169.    if(!ToChars(S,c)) // c为串S的内容
  170.      return ERROR;
  171.    if(!ToChars(T,b)) // b为串T的内容
  172.      return ERROR;
  173.    j=(int)strlen(c); // j为串S的最初长度
  174.    c=(char*)realloc(c,(j+strlen(b)+1)*sizeof(char)); // 增加c的存储空间
  175.    for(i=j;i>=pos-1;i--)
  176.      c[i+strlen(b)]=c[i]; // 为插入串b腾出空间
  177.    for(i=0;i<(int)strlen(b);i++) // 在串c中插入串b
  178.      c[pos+i-1]=b[i];
  179.    InitString(S); // 释放S的原有存储空间
  180.    k=StrAssign(S,c); // 由c生成新的串S
  181.    free(b);
  182.    free(c);
  183.    return k;
  184.  }
  185.  Status StrDelete(LString &S,int pos,int len)
  186.  { // 从串S中删除第pos个字符起长度为len的子串
  187.    char *c;
  188.    int i;
  189.    Status k;
  190.    if(pos<1||pos>S.curlen-len+1||len<0) // pos,len的值超出范围
  191.      return ERROR;
  192.    if(!ToChars(S,c)) // c为串S的内容
  193.      return ERROR;
  194.    for(i=pos+len-1;i<=(int)strlen(c);i++)
  195.      c[i-len]=c[i]; // c为删除后串S的内容
  196.    InitString(S); // 释放S的原有存储空间
  197.    k=StrAssign(S,c); // 由c生成新的串S
  198.    free(c);
  199.    return k;
  200.  }
  201.  Status Replace(LString &S,LString T,LString V) // 此函数与串的存储结构无关
  202.  { // 初始条件:串S,T和V存在,T是非空串
  203.    // 操作结果:用V替换主串S中出现的所有与T相等的不重叠的子串
  204.    int i=1; // 从串S的第一个字符起查找串T
  205.    if(StrEmpty(T)) // T是空串
  206.      return ERROR;
  207.    do
  208.    {
  209.      i=Index(S,T,i); // 结果i为从上一个i之后找到的子串T的位置
  210.      if(i) // 串S中存在串T
  211.      {
  212.        StrDelete(S,i,StrLength(T)); // 删除该串T
  213.        StrInsert(S,i,V); // 在原串T的位置插入串V
  214.        i+=StrLength(V); // 在插入的串V后面继续查找串T
  215.      }
  216.    }while(i);
  217.    return OK;
  218.  }
  219.  void StrPrint(LString T)
  220.  { // 输出字符串T。另加
  221.    int i=0,j;
  222.    Chunk *h;
  223.    h=T.head;
  224.    while(i<T.curlen)
  225.    {
  226.      for(j=0;j<CHUNK_SIZE;j++)
  227.        if(*(h->ch+j)!=blank) // 不是填补空余的字符
  228.        {
  229.          printf("%c",*(h->ch+j));
  230.          i++;
  231.        }
  232.      h=h->next;
  233.    }
  234.    printf("/n");
  235.  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值