4.2.2 串的堆分配存储表示

  串的堆分配存储的特点是,程序中出现的所有串变量的存储空间都是在程序执行过程中动态分配而得的。堆分配存储结构的串定义如下:
  typedef struct{
   char *ch;
   int length;
  } HString;

  由于串仍然是以数组存储的字符序列表示,因此串的操作仍基于"字符序列的复制"实现。在此仅举"插入"操作一例,其算法如下:
 
 
  在C和C++语言中也可以用指针对数组进行访问和操作,在串的存储和操作上也可以充分利用这个特性,则存储串值的数组空间不是静态分配的,而可以进行动态分配。
 
  算法 算法4.5
  bool StrInsert (Hstring& S, int pos, Hstring T)
 {
  // 若1≤pos≤StrLength(S)+1,则改变串S,在串S的第pos个
  // 字符之前插入串T,并返回TRUE,否则串S不变,并返回FALSE

  if (pos < 1 || pos > S.length+1)
   return FALSE;         // 插入位置不合法
  char S1[S.length] ;       // S1 作为辅助串空间用于暂存 S.ch
  if (T.length)
  {               // T 非空,则为S重新分配空间并插入 T
   p=S.ch; i=0;
   while (i < S.length)
    S1[i++] = *(p+i);      // 暂存串S
   S.ch = new char[S.length + T.length ];// 为S重新分配串值存储空间
   for ( i=0, k=0; i<pos-1; i++)
    S.ch[k++] = S1[i];      // 保留插入位置之前的子串
   j = 0;
   while (j<T.length)
    S.ch[k++] = T.ch[j++];   // 插入 T
   while ( i<S.length)
    S.ch[k++] = S1[i++];    // 复制插入位置之后的子串
   S.length+=T.length;      // 置串 S 的长度
  } // if
  return TRUE;
 } // StrInsert
    插入操作的基本思想是构造一个新的串。因此首先要为被插入串S重新分配存储空间,然后将S串中插入位置之前的子串、T串以及S串中插入位置之后的子串依次复制到这个新分配的存储空间中去。