数据结构——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++比较简单。直接重载一下操作符就可以了。

数据结构——C语言:求解题目:为字符串定义一个ADT,要求包含常见的字符...
初始条件:串 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 \/\/串的定长顺序存储表...

adt是什么
ADT是抽象数据类型的缩写。解释:1. ADT的基本概念 ADT是计算机科学中的一种概念,代表抽象数据类型。它是一种定义了数据类型以及该类型上可能进行的操作的数据结构。重要的是,ADT只关注数据操作的逻辑,而不涉及具体实现细节。这意味着,当我们谈论一个ADT时,我们关注的是它能做什么,而不是它内部如...

数据结构都有哪些分类呢?
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。

数据结构:串的基本演示操作
串的抽象数据类型结构: ADT String{ 数据对象: D={ai| ai∈charcaterset,i=1,2,…,n,n>=0} 数据关系: R1={<ai-1,ai>|ai-1,ai∈D, i=1,2,…,n} 基本操作: Assign( &T ,chars ) 初始条件:chars是字符串常量。 操作结果:生成一个其值等于chars的串T。

[学习笔记] ADT, Comonad, GADT
Haskell允许定义代数数据类型(ADT),通过“积”和“和”概念来构建复杂类型。例如,IntAndString类型表示一个整数和一个字符串的组合,是类型积的实例;而IntOrString类型则表示可能包含整数或字符串的选择,属于类型和的范畴。在Java中,通过避免错误扩展可以使用新特性来防范这种混淆。Go语言中,异常处理...

[学习笔记] ADT, Comonad, GADT
深入理解ADT实例:从数据结构到函数映射 想象一下,A类型可以表示一个带有两种状态的字符串,用FirstState\/SecondState或Bool和String的形式来表述。函数类型,如同一个计算表,可以处理复杂的映射关系。例如,整数映射表Integer * Integer可以表示2^32个Bool的乘积,递归定义自然数和列表,加减乘除的函数定义...

数据结构是什么?
详情请查看视频回答

可以用()定义一个完整的数据结构 A数据元素 B数据对象 C数据关系 D...
推荐于2017-12-15 10:55:09 最佳答案 答案是D啦,抽象数据类型ADT是一个数据结构以及定义在噶结构上的一组操作的总称 本回答由网友推荐 举报| 答案纠错 | 评论 2 2 暗暗奥妙 采纳率:33% 擅长: 暂未定制 其他回答 我也觉得是D,排除法吧 蓝天米 | 发布于2013-03-24 举报| 评论 2 1 D ...

什么是抽象数据类型
问题一:数据结构 抽象数据类型是什么? 这两个概念,尤其是第一个都是特别抽象的概念,没什么具体可对应的实体可以给你举例,我就粘贴复制了,说说我的理解吧。 数据埂构呢,我们总是为了完成一个功能或者目的写程序,但不管什么程序、代码实际上都是一些指令的 *** ,说白了就是在描述“怎么做”,而光知道怎么做还...

概论--基本概念和术语
数据元素(Data Element) 数据元素是数据的基本单位 数据元素也称元素 结点 顶点 记录 一个数据元素可以由若干个数据项(也可称为字段 域 属性)组成 数据项是具有独立含义的最小标识单位 数据结构(Data Structure) 数据结构指的是数据之间的相互关系 即数据的组织形式 .数据结构一般包括以下三方面内容 ① 数据...

相似回答