《第四章串-》-课件设计(公开).pptVIP

  • 0
  • 0
  • 约7.38千字
  • 约 67页
  • 2018-12-21 发布于广西
  • 举报
int StrLength(HString S){ return S.length; } S2被全部截去 else{ //S2被全部截去 for(i=1;i=S1[0];i++) T[i]=S1[i]; T[0]=MAXSTRLEN; } 程序如下 Status Concat(SString T,SString S1,SString S2){ /* 用T返回S1和S2联接而成的新串。若未截断, 则返回TRUE,否则FALSE */ int i; if(S1[0]+S2[0]=MAXSTRLEN){ /* 未截断 */ for(i=1;i=S1[0];i++) T[i]=S1[i]; for(i=1;i=S2[0];i++) T[S1[0]+i]=S2[i]; T[0]=S1[0]+S2[0]; return TRUE; } else if(S1[0]MAXSTRLEN){{ /* 截断S2 */ for(i=1;i=S1[0];i++) T[i]=S1[i]; for(i=1;i=MAXSTRLEN-S1[0];i++) T[S1[0]+i]=S2[i]; T[0]=MAXSTRLEN; return FALSE; } else{ //S2被全部截去 for(i=1;i=S1[0];i++) T[i]=S1[i]; T[0]=MAXSTRLEN; } } 求子串操作 Status SubString(SString Sub,SString S,int pos,int len){ /* 用Sub返回串S的第pos个字符起长度为len的子串。算法4.3 */ int i; if(pos1||posS[0]||len0||lenS[0]-pos+1) return ERROR; for(i=1;i=len;i++) Sub[i]=S[pos+i-1]; Sub[0]=len; return OK; } 串比较 int StrCompare(SString S,SString T){ /* 初始条件: 串S和T存在 */ /* 操作结果: 若ST,则返回值0;若S=T,则返回值=0; 若ST,则返回值0 */ int i; for(i=1;i=S[0]i=T[0];++i) if(S[i]!=T[i]) return S[i]-T[i]; return S[0]-T[0]; } 4.2.2 串的堆分配存储表示 顺序存储的串,其最大长度的确定是一个复杂的问题,如果太大则空间浪费很大,如果太小,则很容易出现截断的情况,为此需要考虑更为有效地存储方式,既不浪费太多的空间,又能够避免截断问题。这就是所谓堆分配存储。 堆分配存储仍然以一组地址连续的存储空间来存储字符串值,但其所需的存储空间是在程序执行过程中动态分配,故是动态的,变化的。 实现方法:利用系统提供的自由存储空间--堆,存储串的字符。使用C语言的动态存储分配函数malloc()和free()来管理。 串的堆式存储结构的类型定义 typedef struct { char *ch; /* 若非空,按长度分配,否则为NULL */ int length; /* 串的长度 */ } HString ; a b c d e a b c x y z d e x y z a b c d e S(原始) T realloc()之后 S(最后结果) 插入操作 0 1 2 3 4 0 1 2 3 4 5 6 7 a b c d e 移动 复制 Status StrInsert(HString S, int pos, HString T){ if (pos1||posS.length+1) return ERROR; if (T.length){ if (!(S.ch =(char *)realloc(S.ch,(S.length+T.length)*sizeof(char)))) exit(OVEFRFLOW); for(i=S.length-1; i=pos-1; - -i) S.ch[i+T.length] = S.ch[i]; for(i=T.length-1; i=0; - -i) S.ch[pos-1+i] = S.ch[i]; S.length += T.length; } return OK; } ADT的实现 Status StrAssign(HString T,char *chars){ int i,j; if(T.ch)

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档