数据结构——C语言:求解题目:为字符串定义一个ADT,要求包含常见的字符串运算,每个运算定义成一个

数据结构——C语言:求解题目:为字符串定义一个ADT,要求包含常见的字符串运算,每个运算定义成一个函数。

严蔚敏教材中的抽象数据类型串
ADT String {
 数据对象:D={ai | ai∈CharacterSet, i=1,2,...,n, n≥0}

 数据关系:R1={ <ai-1 , ai> | , ai-1,ai∈D, i=2,...,n }

 基本操作:
  StrAssign (&T, chars)
   初始条件:chars 是串常量。
   操作结果:赋于串T的值为 chars。

  StrCopy (&T, S)
   初始条件:串 S 存在。
   操作结果:由串 S 复制得串 T。

  DestroyString (&S)
   初始条件:串 S 存在。
   操作结果:串 S 被销毁。

  StrEmpty (S)
   初始条件:串 S 存在。
   操作结果:若 S 为空串,则返回 TRUE,否则返回 FALSE。

  StrCompare(S, T)
   初始条件:串 S 和 T 存在。
   操作结果:若S>T,则返回值=0;若S=T,则返回值<0;若S<T,则返回值<0。

  StrLength (S)
   初始条件:串 S 存在。
   操作结果:返回串 S 序列中的字符个数,即串的长度。

  ClearString (&S)
   初始条件:串 S 存在。
   操作结果:将 S 清为空串。

  Concat(&T, S1, S2)

   初始条件:串 S1 和 S2 存在。
   操作结果:用 T 返回由 S1 和 S2 联接而成的新串。

  SubString(&Sub, S, pos, len)
   初始条件:串S存在,1≤pos≤StrLength(S)且0≤len≤StrLength(S)-pos+1。
   操作结果:用 Sub 返回串S的第 pos 个字符起长度为 len 的子串。
     
  Index (S, T,pos)
   初始条件:串S和T存在,T 是非空串,1≤pos≤StrLength(S)。
   操作结果:若主串S中存在和串T值相同的子串,则返回它在主串S中第pos个字符之后第一次出现的位置;否则函数值为0。
    
  Replace(&S, T, V)
   初始条件:串 S,T 和 V 存在,T 是非空串。
   操作结果:用V替换主串S中出现的所有与T相等的不重叠的子串。

  StrInsert(&S, pos, T)
   初始条件:串 S 和 T 存在,1≤pos≤StrLength(S)+1。
   操作结果:在串 S 的第 pos 个字符之前插入串 T。

  StrDelete (&S, pos, len)
   初始条件:串 S 存在,1≤pos≤StrLength(S)-len+1。
   操作结果:从串 S 中删除第 pos 个字符起长度为 len 的子串。
} ADT String

//串的定长顺序存储表示
#define MAXSTRLEN 255

typedef int Status;
typedef char SString[MAXSTRLEN+1]; // 0号单元存放串长度

Status StrAssign(SString T,char *chars)
{ // 串赋值
int i;
if(strlen(chars)>MAXSTRLEN)
return ERROR;
else
{
T[0]=strlen(chars);
for(i=1;i<=T[0];i++)
T[i]=*(chars+i-1);
return OK;
}
}

Status StrCopy(SString T,SString S)
{ // 串复制
int i;
for(i=0;i<=S[0];i++)
T[i]=S[i];
return OK;
}

Status StrEmpty(SString S)
{ // 判空串
if(S[0]==0)
return TRUE;
else
return FALSE;
}

int StrCompare(SString S,SString T)
{ // 串比较
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];
}

int StrLength(SString S)
{ // 求串长
return S[0];
}

Status ClearString(SString S)
{ // 串清空
S[0]=0;// 令串长为零
return OK;
}

Status Concat(SString T,SString S1,SString S2)
{ // 串连接
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
{ // 截断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;
}
}

Status SubString(SString Sub,SString S,int pos,int len)
{ // 求子串
int i;
if(pos<1||pos>S[0]||len<0||len>S[0]-pos+1)
return ERROR;
for(i=1;i<=len;i++)
Sub[i]=S[pos+i-1];
Sub[0]=len;
return OK;
}

int Index(SString S,SString T,int pos)
{ // 子串定位
int i,j;
if(1<=pos&&pos<=S[0])
{
i=pos;
j=1;
while(i<=S[0]&&j<=T[0])
if(S[i]==T[j]) // 继续比较后继字符
{
++i;
++j;
}
else // 指针后退重新开始匹配
{
i=i-j+2;
j=1;
}
if(j>T[0])
return i-T[0];
else
return 0;
}
else
return 0;
}

Status StrInsert(SString S,int pos,SString T)
{ // 插入
int i;
if(pos<1||pos>S[0]+1)
return ERROR;
if(S[0]+T[0]<=MAXSTRLEN)
{ // 完全插入
for(i=S[0];i>=pos;i--)
S[i+T[0]]=S[i];
for(i=pos;i<pos+T[0];i++)
S[i]=T[i-pos+1];
S[0]=S[0]+T[0];
return TRUE;
}
else
{ // 部分插入
for(i=MAXSTRLEN;i<=pos;i--)
S[i]=S[i-T[0]];
for(i=pos;i<pos+T[0];i++)
S[i]=T[i-pos+1];
S[0]=MAXSTRLEN;
return FALSE;
}
}

Status StrDelete(SString S,int pos,int len)
{ // 删除子串
int i;
if(pos<1||pos>S[0]-len+1||len<0)
return ERROR;
for(i=pos+len;i<=S[0];i++)
S[i-len]=S[i];
S[0]-=len;
return OK;
}

Status Replace(SString S,SString T,SString V)
{ // 串替换
int i=1; // 从串S的第一个字符起查找串T
if(StrEmpty(T)) // T是空串
return ERROR;
do
{
i=Index(S,T,i); // 结果i为从上一个i之后找到的子串T的位置
if(i) // 串S中存在串T
{
StrDelete(S,i,StrLength(T)); // 删除该串T
StrInsert(S,i,V); // 在原串T的位置插入串V
i+=StrLength(V); // 在插入的串V后面继续查找串T
}
}while(i);
return OK;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-09-08
用C++比较简单。直接重载一下操作符就可以了。
相似回答